web-dev-qa-db-fra.com

Puis-je faire SendKeys en Javascript?

SendKeys est une méthode pour envoyer une frappe à une application.
Puis-je le faire en Javascript, pour envoyer une frappe dans le navigateur?

REF:
http://msdn.Microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx

15
diewland

Si vous pouviez envoyer des frappes au niveau du système d'exploitation, ce serait un gros problème de sécurité . Vous pourriez (par exemple) installer tout type de logiciel sur la machine client si vous pouviez envoyer des frappes à l'installation requise dialogues.

Oui, vous pouvez créer un contrôle active-x ou d’autres outils à installer sur la machine cliente. Mais à cause des problèmes de sécurité avec un tel outil, je ne le ferais pas, même dans un environnement contrôlé.

La plupart du temps, il existe un moyen de réaliser les fonctionnalités dont vous avez besoin sans porter atteinte à la sécurité.

Update: Si vous souhaitez passer au tabfield suivant, vous devez utiliser la méthode focus () pour définir le focus sur l'élément suivant. Malheureusement, vous devez trouver vous-même le prochain élément en javascript, mais cela ne devrait pas être un gros problème: vous pouvez conserver une liste ordonnée de tous vos éléments en javascript.

btw: http://forums.devarticles.com/javascript-development-22/moving-to-next-tabindex-on-event-2382.html

6
rdmueller

La page Web contient beaucoup de simulations d’événements implémentées par JS Framework.

Est-il possible de simuler des événements de presse clés par programme? pour jQuery

Javascript: simuler un clic sur un lien pour YUI

Cependant, la méthode la plus simple est la troisième publication du lien donné par Ralf qui met en évidence le champ de texte "suivant" concernant la propriété tabIndex des éléments contenus dans un élément de formulaire.

Il pourrait y avoir un moyen plus brillant de dresser une liste des identifiants de champs de texte et de l’ordre que vous souhaitez avoir.

Bien entendu, la liste tabIndex peut ne pas être générée par vous-même mais en parcourant le champ de texte.

Créez une boucle pour générer la liste lorsque le document est chargé (DOMContentLoaded):

var tabIndexList = new Array();
function tabIndexListGeneration(){
   var form = document.getElementById("Your form ID"), // remember to fill in your form ID
       textfields = form.getElementsByTagName("input"), 
       textfieldsLength = textfields.length;
   for(var i=0;i<textfieldsLength;i++){
      if(textfields[i].getAttribute("type") !== "text" || textfields[i].getAttribute("tabIndex") <= 0)continue;
      /* tabIndex = 0 is neglected as it places the latest, if you want it, change 0 to -1
       *  and change tabIndexPointer = 0 into  tabIndexPointer = -1 below */
      tabIndexList[textfields[i].getAttribute("tabIndex")] = textfields[i];
   }
}
// You can use the function of JS Framework if you don't like the method below.
if(document.addEventListener){
   document.addEventListener("DOMContentLoaded", tabIndexListGeneration, false);
}else{
   window.attachEvent("onload", tabIndexListGeneration);
}

Et à l'intérieur de l'événement "entrée de texte égale à textfield maxlength":

var tabIndexPointer = target.getAttribute("tabIndex"); // target is the DOM object of current textfield 
while(!(++tabIndexPointer in tabIndexList)){
   if(tabIndexPointer >= tabIndexList.length)
      tabIndexPointer = 0; // or other action after all textfields were focused
}
tabIndexList[tabIndexPointer].focus();    // if other action needed, put it right after while ended

Remarque: La structure de champs de texte de formulaire ne doit pas être mutée, sinon une erreur serait générée.

Si textfield génère dynamiquement, exécutez tabIndexListGeneration() pour régénérer la liste.

3
tytsim

Cela fonctionne pour moi. ActiveXObject doit être ouvert dans IE. 

                var PaintProg = new ActiveXObject("WScript.Shell");     //paste to mspaint
                PaintProg.Run("mspaint.exe \\\\srv4\\photos\\image1.jpg",9,false);

                var PaintTimer = window.setInterval(PaintPaste,1000);

                function PaintPaste()
                    {
                    if (PaintProg.AppActivate("Paint",true) == true)
                        {
                        PaintProg.SendKeys('"^(v)""%(F)""x""~"',true);
                        window.clearInterval(PaintTimer);
                        }
                    }
0
user6178986

Pas par défaut dans la plupart des navigateurs, non. Vous pourrez peut-être le faire fonctionner à l'aide d'ActiveX s'il doit s'exécuter dans Internet Explorer, cependant.

0
icktoofay