2014-01-25 29 views
2

我有jQuery的代碼:現場的addEventListener的mouseenter

$(document).on("mouseenter","a",function(e){ 
    //... 
}); 

如何創建相同,但與本地JavaScript(jQuery的沒有)?

我只需要Chrome兼容。

+1

老兄......談到跨瀏覽器之類的東西,正確的答案,這將是很長! – jAndy

+0

[JavaScript事件委託 - 行爲]的可能重複(http://stackoverflow.com/questions/20227109/javascript-event-delegation-behavior) – undefined

+0

事件委託..OMG..很長的答覆複製和粘貼.. –

回答

3

對於相同的功能,在這裏你可以添加多個事件偵聽到一個單一的元素,使用以下命令:

addEventListener('mouseover', function(e) { 
    if (e.target instanceof HTMLAnchorElement) { 
     //... 
    } 
}); 

,將做完全一樣的。對於其他選擇:

addEventListener('mouseover', function(e) { 
    if (e.target instanceof HTMLAnchorElement) { 
     //matches if the element is an <a> 
    } 
    if (e.target.className.match(/(\s|^)foobar(\s|$)/)) { 
     //matches if the element has the class "foobar" in its classes list 
    } 
    if (e.target.id == 'baz') { 
     //matches if the element has an id of "baz" 
     //same syntax works for attributes like 'name', 'href', 'title', etc. 
    } 
    if (e.target instanceof HTMLLabelElement && e.target.attributes.for.value == 'baz') { 
     //matches a <label> tag that has its 'for' attribute set to 'baz' 
     //the element.attributes.attrName.value is the syntax for getting the value 
     // of any attribute that isn't available otherwise 
    } 
}); 

與雖然委派mouseenter事件的問題是,它僅火災時,它應用的元素懸停。換句話說,如果將一個mouseenter事件附加到文檔中,就像在jQuery代碼中那樣,只有在用鼠標輸入document時纔會觸發,但對於任何子項都不會觸發。爲了使它對孩子有用,你需要使用mouseover

+0

這是不一樣的。它必須是一個「現場」的聽衆,在未來創建的元素的鼠標中觸發。 – holden321

+0

看我的編輯。這工作原理:http://jsfiddle.net/zC83U/ – Joeytje50

+0

mouseover和mouseenter不一樣,但最好沒什麼。謝謝! – holden321

0

這優化了舊版和新版瀏覽器的兼容性。

Live Demo

var links = document.links || document.anchors || document.getElementsByTagName('a'); 
for (var i = 0; i < links.length; i++) { 
    addEvent(links[i], 'mouseenter', action); 
} 

function addEvent(element, myEvent, fnc) { 
    return ((element.attachEvent) ? element.attachEvent('on' + myEvent, fnc) : element.addEventListener(myEvent, fnc, false)); 
} 

function action(evt) { 
    var e = evt || window.event, 
     link = (e.currentTarget) ? e.currentTarget : e.srcElement; 
    link.style.color = "lime"; 
} 
+0

不一樣。如果將來創建新的鏈接會怎樣? – holden321

+0

將前4行放入'function()'中,並且在創建這些鏈接時,重新運行該函數。 – Deryck

+0

我不知道他們什麼時候會創建。 – holden321