【问题标题】:How to properly attach event listerner on each link on a HTML page如何在 HTML 页面上的每个链接上正确附加事件侦听器
【发布时间】:2013-05-27 19:46:41
【问题描述】:

我有以下代码在 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 的浏览器控件。所以我不关心兼容性。

【问题讨论】:

    标签: javascript hyperlink addeventlistener getelementsbytagname


    【解决方案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);
    });
    

    注意:这可以进一步优化

    【讨论】:

    • 是的,我认为这就是我想要做的。但是我收到一个错误An unknown error has occurred. Error: 80020101.。这是在尝试调用脚本时在 Visual Studio 中提出的。我认为forEach 循环中的某些东西导致了错误。
    • 这显然是一个单独的问题,您应该阅读其中的一些:stackoverflow.com/search?q=80020101+%5Bjavascript%5D
    • 与 WP 浏览器控件 stackoverflow.com/questions/9501058/… 相关的结果之一。看来,如果我们在函数参数中传递了错误的类型,则会引发此错误。但不确定它与上面的代码有什么关系
    • 上述代码完全有效,但我不知道你如何使用 MSGesture 及其相关位,也许这就是问题所在。恐怕我不能在那里提供进一步的帮助。您是否没有得到与错误相关的任何行号以便缩小问题范围?
    • 我使用browser.InvokeScript("execScript", gestureHold); 调用脚本,其中gestureHold 是代表整个脚本的字符串。所以错误只表明它发生在InvokeScript
    【解决方案2】:

    您没有将 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]; 
        }; 
    

    【讨论】:

      【解决方案3】:

      您想为此使用 JQuery 或 Prototype,否则它将无法跨浏览器兼容。 仅适用于 IE 的 MSPointerEvents 也是如此。

      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;
          }
      };
      

      现在来实际尝试回答您的问题: 事件会冒泡,因此如果您在链接中放置一个链接,如果您在子元素内部单击,则会触发这两个事件。

      【讨论】:

      • 我不能使用任何库,因为我正在为 Windows phone 开发并使用它附带的浏览器控件。我正在开发的应用程序是一个浏览器应用程序,因此我无法控制页面的结构。我实际上对 Javascript 不太熟悉,你能分享一个例子,我怎样才能按照你的例子重写代码?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      相关资源
      最近更新 更多