0

我有以下代碼,它將HTML事件監聽器附加到HTML文檔的每個鏈接上。如何在HTML頁面上的每個鏈接上正確添加事件監聽器

問題是,evt.target.href總是返回頁面上的最後一個鏈接,而不是引發事件的確切鏈接。我錯過了什麼?

var links = document.getElementsByTagName('a'); 

for (i = 0; i < links.length; i++) { 
    links[i].addEventListener('MSGestureHold', eventListener, false); 
    links[i].addEventListener('MSPointerDown', eventListener, false); 
    gestureHandler = new MSGesture(); 
    gestureHandler.target = links[i]; 
}; 

function eventListener(evt) { 
    if (evt.type == 'MSPointerDown') { 
     gestureHandler.addPointer(evt.pointerId); 
     return; 
    } 

    if (evt.detail & evt.MSGESTURE_FLAG_BEGIN) { 
     window.external.notify(evt.target.href); 
    } 
}; 

編輯 我要指出,我對Windows Phone的開發和使用它運行IE10瀏覽器的控制。所以我不關心兼容性。

回答

0

你沒有定義gestureHandler爲VAR所以它是你不斷設置新的值全球..

var links = document.getElementsByTagName('a'); 
    for (i = 0; i < links.length; i++) 
    { 
     links[i].addEventListener('MSGestureHold', eventListener, false); 
     links[i].addEventListener('MSPointerDown', eventListener, false); 
     var gestureHandler = new MSGesture(); // <--- notice the var, only local 
     gestureHandler.target = links[i]; 
    }; 
+0

感謝遺憾的是它仍然只是返回的最後一個環節.. – PutraKg

0

你想使用jQuery或原型爲,否則將不跨瀏覽器兼容。 同樣適用於MSPointerEvents,它只是IE。

JQuery的例子:

$('#foo').bind({ 
    click: function() { 
    // do something on click 
    }, 
    mouseenter: function() { 
    // do something on mouseenter 
    } 
}); 

如果你不想使用庫(但我強烈建議你看看他們),你應該這樣寫:

var addEvent = function (el, ev, fn) { 
    if (el.addEventListener) { 
     el.addEventListener(ev, fn, false); 
    } else if (el.attachEvent) { 
     el.attachEvent('on' + ev, fn); 
    } else { 
     el['on' + ev] = fn; 
    } 
}; 

而現在實際嘗試並回答你的問題: 事件冒泡,所以如果你在鏈接中放置一個鏈接,如果你點擊子元素內部,你將觸發兩個事件。

+0

我無法使用任何庫,因爲我正在爲Windows Phone開發,並使用它隨附的瀏覽器控件。我正在開發的應用程序是一個瀏覽器應用程序,所以我無法控制頁面的結構。實際上,我對Javascript並不太熟悉,你能分享一個例子,我怎樣才能根據你的例子重寫代碼? – PutraKg

1

我有點不清楚你的問題,但我認爲你正在嘗試做這個

var links = document.getElementsByTagName('a'); 

function eventListener(evt, gestureHandler) { 
    if (evt.type == 'MSPointerDown') { 
     gestureHandler.addPointer(evt.pointerId); 
     return; 
    } 

    if (evt.detail & evt.MSGESTURE_FLAG_BEGIN) { 
     window.external.notify(evt.target.href); 
    } 
}; 

[].forEach.call(links, function (link) { 
    link.addEventListener('MSGestureHold', function (evt) { 
     var gestureHandler = new MSGesture(); 

     gestureHandler.target = link; 
     eventListener(evt, gestureHandler); 
    }, false); 

    link.addEventListener('MSPointerDown', function (evt) { 
     var gestureHandler = new MSGesture(); 

     gestureHandler.target = link; 
     eventListener(evt, gestureHandler); 
    }, false); 
}); 

注:這可以進一步優化

+0

是的,我認爲這是我想要做的。但是,我收到一個錯誤'發生了未知的錯誤。錯誤:80020101.'。嘗試調用腳本時,這在Visual Studio中引發。我認爲'forEach'循環中的某些內容導致了錯誤。 – PutraKg

+0

這顯然是一個單獨的問題,你應該讀一些這些:http://stackoverflow.com/search?q=80020101+%5Bjavascript%5D – Xotic750

+0

其中一個有關WP瀏覽器控制的結果http:// stackoverflow .com/questions/9501058/wp7-browser-control-wont-invoke-javascript-error-80020101。看起來,如果我們在函數參數中傳入錯誤的類型,則會引發此錯誤。但不知道它如何與上面的代碼相關 – PutraKg

相關問題