SendKeysは、キーストロークをアプリケーションに送信する方法です。
ブラウザでキーストロークを送信するために、Javascriptで実行できますか?
REF:
http://msdn.Microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx
OSレベルでキーストロークを送信できる場合、これは大きなセキュリティ問題になります。必要なインストールダイアログにキーストロークを送信できる場合、(たとえば)クライアントマシンに任意の種類のソフトウェアをインストールできます。
はい、active-xコントロールまたは他のツールをクライアントマシンにインストールすることができます。しかし、このようなツールにはセキュリティ上の問題があるため、制御された環境であっても、それを行いません。
ほとんどの場合、セキュリティを侵害せずに必要な機能を実現する方法があります。
更新:次のタブフィールドにジャンプする場合は、focus()メソッドを使用して次の要素にフォーカスを設定する必要があります。残念ながら、javascriptで次の要素を自分で見つける必要がありますが、これは大きな問題ではないはずです。javascriptですべての要素の順序付きリストを保持できます。
btw: http://forums.devarticles.com/javascript-development-22/moving-to-next-tabindex-on-event-2382.html
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()
を実行してリストを再生成します。
これは私のために動作します。 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);
}
}
ほとんどのブラウザではデフォルトではありません。ただし、ActiveXをInternet Explorerで実行する場合は、ActiveXを使用して機能させることができます。