addEventListener似乎捕获了我的全局变量

时间:2015-02-08 21:45:26

标签: javascript native addeventlistener

我在按钮上有一个带有 addEventListener 的非jquery脚本。这在第一次运行时工作正常但我希望在第一次点击后将“发送”更改为其他值。 (表单的成功插入成为更新表单)。但是,即使sendurl填充了新的id值,它也不会在事件再次触发后发生变化。而是通过第二次点击,它将新创建的事件与旧值一起激活。

console.log中的结果值:

  1. 第一次点击:使用url:input.php
  2. 触发事件“click”
  3. 第二次点击:
      使用url:input.php 触发
    • 事件“click”
    • 使用url触发事件“click”:update.php?io = items& id = 693
  4. 所以我想摆脱第一次点击后触发的输入。有人知道如何解决这个问题吗?

    var itemid = getHash();
    ini(prepare); // using window.onload to execute
    
    
    function prepare() {
      if (itemid) {
        // update
        var sendingurl = 'update.php?io=items&id=' + itemid;
      } else {
        // input
        var sendingurl = 'input.php';
      }
    
      // submitevent
      æ($("submitBtn"), 'click', function() {
        console.log("event \"click\" is fired with url: " + sendingurl);
        var json = new FormData(document.forms[0]);
        ajax(sendingurl, json, submittedInput);
      });
    }
    
    
    // callback function after ajax did his magic
    function submittedInput(response) {
      if (response) {
        if (!itemid) {
          itemid = response;
          prepare();
        }
      } else {
        $("status").innerHTML = "something went wrong with the input";
      }
    }
    
    // function to add events without the use of jquery or prototype
    function æ(el, evType, fn, useCapture) {
      if (el.addEventListener) {
        el.removeEventListener(evType, fn, useCapture);
        el.addEventListener(evType, fn, useCapture);
        return true;
      } else if (el.attachEvent) {
        el.detachEvent('on' + evType, fn);
        var r = el.attachEvent('on' + evType, fn);
        return r;
      } else {
        el['on' + evType] = fn;
      }
    }

1 个答案:

答案 0 :(得分:0)

第一次,没有要删除的事件处理程序,并且您的匿名函数被添加为事件处理程序。匿名函数创建为闭包,因此senturl的值现在是"常量"无论外部发送如何变化。这就是你获得旧价值的原因。

第二次,传递给removeEventListener的事件处理程序函数尚未绑定到事件,因为第二个匿名函数与第一次传递时的匿名函数不同。因此没有删除事件处理程序。然后使用新的匿名函数添加第二个事件,其中包含senturl的修订值。这就是为什么你看到这两个功能都会被激发的原因。

将您的匿名函数转换为普通函数,改为使用普通函数名称。