2013-03-31 170 views
3

如何觸發keypress以便它模擬真實的用戶行爲?執行觸發按鍵javascript

如果我使用$('#input').trigger(jQuery.Event('keypress', {which: 65}))我期待字母「A」出現在該輸入,但即使按鍵被觸發沒有出現。

是否有可能在不直接改變輸入的value顯示按鍵?

演示:http://jsfiddle.net/KrHYn/

+0

@Juhana OP想輸入一個密鑰,相關的問題是關於_replacing_一個按鍵。另外,在相關問題中,他沒有使用價值的限制。這個問題是關於DOM事件如何工作的,這個問題是關於如何完成不受限制的事情。 –

回答

4

很抱歉,但沒有,這就是DOM事件只是沒有如何工作的。當你用JavaScript觸發事件時,它不是一個可信的事件,這意味着它不會(除了後面提到的情況)更改DOM。

當你觸發一個jQuery(或DOM)事件,它就像DOM告訴一個關鍵是在輸入按下你的JavaScript代碼。它通常不會更改DOM本身。

根據specification觸發是click and DOMActivate時將執行默認行爲的唯一事件。從規範:

大多數不受信任的事件不應觸發默認操作,但單擊或DOMActivate事件除外。這些事件觸發激活觸發器的默認操作(有關更多詳細信息,請參閱激活觸發器和行爲);這些不受信任的事件的isTrusted屬性值爲false,但仍會啓動任何默認操作以實現向後兼容。

所有其他非信任的事件,必須表現得好像Event.preventDefault()方法被稱爲該事件。

你必須改變輸入的value.val() jQuery中)。

+2

+1你教了我一些東西:) –

1

假設瀏覽器分爲三部分:HTML,DOM和JavaScript。 DOM是HTML和JS可以通話的中間人。

當使用JavaScript document.getElementById時加載的元素,它告訴DOM:「嘿,我需要這個元素!」。如果DOM找到它,它將返回一個名爲DOM元素的特殊對象中的元素。

當HTML改變時(你在字段中輸入一些值),它發送一條消息給DOM:「嘿,我的value在這裏是不一樣的。」因此DOM更新了它的DOM元素。

當JavaScript在keypress上添加事件偵聽器時,它會告訴DOM:「嗨,無論何時發送keypress事件,請告訴我。」因此,當HTML更改(按鍵在輸入中完成)時,它會告訴DOM:「嘿,那裏有按鍵事件!」。而且由於DOM知道JS正在等待按鍵事件的更新,所以它告訴JS:「嘿,夥計,這裏引發了一個事件。」

如果你從JS本身運行事件,DOM將馬上發回JS:「嘿,一個keypress事件被觸發了,以爲你可能會感興趣。」它不會轉到HTML並對其進行更改。

爲什麼?因爲DOM不信任JS。它知道JS是個壞男孩。這裏的關鍵字是「信任」。正如@Benjamin指出的那樣,受信任的事件。雖然他們中很少。還有「可靠的向後兼容」。

是的,DOM是一團糟。