2011-05-13 302 views
14

SendKeys是嚮應用程序發送擊鍵的方法。
我可以在Javascript中做到這一點,在瀏覽器中發送按鍵?我可以在Javascript中使用SendKeys嗎?

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

+1

這將是一個巨大的安全漏洞,我不建議走下ActiveX路徑 - 它會提示用戶並且只能在IE中工作。另一種選擇是如果您創建一個託管WebBrowser控件的應用程序。似乎有點可疑,它是爲了什麼? – 2011-05-13 07:04:08

+0

用於tabIndex用途。如果我可以這樣做,我不需要在事件處理中實現下一個tabIndex元素邏輯。 – diewland 2011-05-13 07:57:44

+0

你的意思是表單元素的tabindex屬性? http://www.htmlcodetutorial.com/forms/_INPUT_TABINDEX.html爲什麼你需要發送擊鍵? – rdmueller 2011-05-13 09:03:55

回答

6

如果您能夠在操作系統級別上發送擊鍵,這將是一個很大的安全問題。 如果您能夠將鍵擊發送到所需的安裝對話框,您可以(例如)在客戶端計算機上安裝任何類型的軟件。

是的,你可以想出一個active-x控件或一些其他工具來安裝在客戶端機器上。但是由於這種工具存在安全問題,即使在受控環境下,我也不會這樣做。

大多數情況下,有一種方法可以在不違反安全的情況下實現您所需的功能。

更新:如果要跳轉到下一個tabfield,則必須使用focus()方法將焦點設置爲下一個元素。不幸的是,你必須在javascript中自己找到下一個元素,但這不應該是一個大問題 - 你可以在JavaScript中保留所有元素的有序列表。

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

0

缺省情況下大多數瀏覽器,沒有。但是,如果它將在Internet Explorer中運行,您可能可以使用它來使用ActiveX。

+0

這些天不需要瀏覽器特定的解決方案。有太多好的JS庫會做你需要的。 – Maladon 2013-09-05 19:06:55

+1

@Maladon:如果有一個瀏覽器不可知的JavaScript庫可以讓操作系統發送擊鍵,我會很擔心。 – icktoofay 2013-09-06 02:32:12

3

有很多網頁內JS框架實施的事件的模擬。

Is it possible to simulate key press events programmatically? jQuery的

Javascript: simulate a click on a link爲YUI

然而,更簡單的方法是將鏈接的第三個職位由拉爾夫給予其重點就到的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 

注:形式textfields的結構不能突變,否則會出現錯誤。

如果textfield動態生成,則運行tabIndexListGeneration()來重新生成列表。

0

這適用於我。 ActiveXObject需要在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); 
         } 
        } 
相關問題