2014-10-30 109 views
2

我在YUI上工作時遇到了一個煩人的問題。如何用YUI3觸發DOM事件

我有一個主區域和一個導航塊。主區域中的元素可以通過直接單擊或單擊導航區塊中觸發主區域中相應元素的元素來激活。

事實證明,在YUI中以編程方式觸發點擊事件並不像我想象的那麼簡單。查看文檔,我發現有關如何附加和委派事件的信息令人滿意,但不知道如何調用事件。

我發現this question,但它處理創建一個新的自定義事件,而不是調用一個現有的事件。

所有其他類似的問題與使用.simulate()回答,但其實這是不兼容的原因的最佳選擇,它也建議不要被雅虎本身的客戶端使用http://yuilibrary.com/yui/docs/event/simulate.html#faking編輯:重新閱讀部分後,我意識到這個問題的警告是無關緊要的。

我找到了一個解決方案,通過在節點的DOM元素中調用click()命令,但這真的是最後的手段,我想知道是否有通過YUI執行的更「乾淨」的方法。

這裏是什麼,我現在在做一個例子:http://jsfiddle.net/3fso2dg8/

在這個例子中,第二個按鈕是通過使用DOM元素

Y.one('#clickme')._node.click(); 

觸發第一個按鈕的點擊事件結論

經過更多的代碼擺弄我意識到模擬()是大多數情況下的首選選項,但不是全部。

我需要使用的YUI vesrion(3.14)在模擬IE9及更高版本中的單擊事件時存在已知問題。由於 - 出於其他技術原因 - 我無法升級到此問題已解決的任何版本,我需要保持多平臺兼容性,我的原始解決方案仍然是最佳選擇。任何使用YUI組件的人都不會在IE上做出反應,也許你偶然發現了同樣的問題,所以這是解決它的一種方法。

回答

1

在尋找完全相同的功能後,我只是使用模擬在面向用戶的代碼 - 它只是模仿點擊沒有返回方法等(簡單提交按鈕或選擇fil觸發器)。

當我需要「複雜」功能時,我只需添加一個類或新的ID,並在我的代碼中添加新的委託或「on」方法 - 遵循以下內容:「如果函數需要響應用戶操作或被調用在程序上,它應該相應地寫入,並在後一種情況下直接調用。「 prinsipp。

所以總結 - 我用模擬的,沒有回調或其他「先進」的東西,很簡單的效果(黯然)重複其他代表/在哪裏模擬將是棘手的元素......

此前也看着你的方法(._node.click();),我看不出有什麼明顯的區別比較模擬()...

+0

.simulate()在IE 9及更高版本中顯示不一致的結果。僅僅因爲這個原因,我不能完全依靠跨平臺設計。在節點上觸發事件本身確保它可以工作。 – Gil 2014-11-03 14:16:12

+0

我明白了,所以,最好的方法應該是使用普通的舊JS - 比如createEvent或其他東西 - 這樣我們就可以擁有IE6和更高版本的支持...如果YUI有一些跨瀏覽器的方式,但是恐怕它贏了沒有發生 - 因爲YUI幾乎是生命週期結束:( – nettutvikler 2014-11-03 15:52:59