web-dev-qa-db-ja.com

JavascriptでSendKeysを実行できますか?

SendKeysは、キーストロークをアプリケーションに送信する方法です。
ブラウザでキーストロークを送信するために、Javascriptで実行できますか?

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

17
diewland

OSレベルでキーストロークを送信できる場合、これは大きなセキュリティ問題になります。必要なインストールダイアログにキーストロークを送信できる場合、(たとえば)クライアントマシンに任意の種類のソフトウェアをインストールできます。

はい、active-xコントロールまたは他のツールをクライアントマシンにインストールすることができます。しかし、このようなツールにはセキュリティ上の問題があるため、制御された環境であっても、それを行いません。

ほとんどの場合、セキュリティを侵害せずに必要な機能を実現する方法があります。

更新:次のタブフィールドにジャンプする場合は、focus()メソッドを使用して次の要素にフォーカスを設定する必要があります。残念ながら、javascriptで次の要素を自分で見つける必要がありますが、これは大きな問題ではないはずです。javascriptですべての要素の順序付きリストを保持できます。

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

6
rdmueller

Webページ内にJSフレームワークが実装したイベントシミュレーションがたくさんあります。

キープレスイベントをプログラムでシミュレートすることは可能ですか? jQueryの場合

Javascript:リンクのクリックをシミュレートする YUIの場合

ただし、、より簡単な方法は、Ralfフォーム要素内の要素のtabIndexプロパティに関して「次の」テキストフィールドにフォーカスします。

テキストフィールドのIDと希望する順序のリストを作成する場合、より素晴らしい方法があります。

もちろん、tabIndexリストは自分で生成するのではなく、テキストフィールドを歩き回って生成することもできます。

ドキュメントがロードされたときにリストを生成するループを作成します(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);
}
_

そして、「テキスト入力がテキストフィールドの最大長に等しい」というイベント内で:

_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
_

注:フォームのテキストフィールドの構造は変更しないでください。変更しないとエラーが発生します。

テキストフィールドが動的に生成される場合、tabIndexListGeneration()を実行してリストを再生成します。

4
tytsim

これは私のために動作します。 IEでActiveXObjectを開く必要があります。

                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

ほとんどのブラウザではデフォルトではありません。ただし、ActiveXをInternet Explorerで実行する場合は、ActiveXを使用して機能させることができます。

0
icktoofay