2016-10-21 75 views
0

TLDR下面 JS Fiddle To Demo替代錯誤地觸發事件

我已經真正參與重建是首映JS庫的基礎,以便更好地提高我的技能的工具。目前,我正在研究綁定Angular的函數式數據。

數據綁定的想法是獲取數據並將其綁定到元素,這樣如果操作,所有訂閱的元素都會相應地改變。我已經完成了它的工作,但有一件事我沒有考慮到它是innerHTML vs value的問題。根據你需要改變一個或另一個的元素(在上面的演示中,你會看到我需要在條件語句中專門選出按鈕元素,因爲它同時具有,但這是一種邊緣情況)

問題是,爲了捕獲我需要觸發事件發生的SPAN標記更新,最簡單的操作爲Text Boxes/Textareas是'keyup'。

在我的函數中,如果你傳遞一個沒有value屬性的元素,我們假設你將更新innerHTML,並且設置一個觀察者來確定元素是否曾經發生過變化,如果它曾經發生過,觀察員將發出'keyup'事件。

if (watchee.value == void(0)) { 
var keyUpEvent = new Event('keyup'); 
var observer = new MutationObserver(function(mutations) { 
    mutations.forEach(function(mutation) { 
    watchee.dispatchEvent(keyUpEvent); 
    }); 
}); 
observer.observe(watchee, { 
    childList: true 
}); 
} 

現在,它可能只是我的妄想,但似乎我可能是隧道到一罐蠕蟲通過僞造「KEYUP」這本身不具有支持的元素。

TLDR:

我很好奇,如果有做的另一種方式,酸當量除了僞造'keyup'/'keydown'/'change'事件之外,span標籤是否反應?例如,是否有一種方法可以使我自己的純事件(純粹我的意思是不依賴於其他事件)檢查innerHTML或值是否已更改,然後執行函數?我知道這可能是一個計時器,但我覺得這可能會妨礙表現。

編輯:就在旁邊。在演示中,名爲hookFrom的函數通過獲取DOM節點並返回一個函數,該函數將接收dom節點並繼續返回一個函數,該函數將接收其他接收dom節點。 :

hookFrom(sender)(receiver); 
hookFrom(sender)(receiver)(receiver2); 
hookFrom(sender)(receiver)(receiver2)(receiver3)(receiver4)...(receiver999)...etc 

JS Fiddle To Demo (same as above)

回答

0

沒有什麼內在的錯誤創建本身不具有功能的DOM節點上的類似事件。事實上,在很多情況下,當嘗試爲單獨的瀏覽器和平臺填充功能時會發生這種情況。

做這種DOM魔術的唯一問題是它可能導致其他事件的冗餘。例如,本文中給出的示例:https://davidwalsh.name/dont-trigger-real-event-names顯示了使用相同事件名稱的新事件如何導致問題。

該建議很有用,但在這個特定情況下可忽略不計。代碼在文本框,divs,spans等之間添加了相同的功能......並且它們都是以相同方式故意處理的,並且如果事件冒泡到另一個事件,那將是有意和計劃的。

簡而言之:有一種蠕蟲可以在僞造已經明確定義的事件名稱的情況下挖掘到,但在這種情況下,代碼很好!