javascript addEventListener在OOPS

时间:2015-08-18 10:01:19

标签: javascript events addeventlistener

function myclass(){
 var _d =document,_w = window,self=myclass;

var addEvent = function (el,e,callback,capture){
    var evt = _w.event;
    if(_w.addEventListener){
      el.addEventListener(e,callback,capture);         
    }else el.attachEvent("on"+e,callback,capture); 

   }
   var removeEvent = function (el,e,callback){ console.log("rmv")
      if(window.removeEventListener)
       el.removeEventListener(e,callback);
    else el.detachEvent("on"+e,callback);
 }

 function startWork(params){
  self.cfUrl  = params.createfolder || ""; 
   var cf = select('[data-action="createfolder"]');
    addEvent(cf,'click',mymethod);   

  }      
  return {         
    addEvent:addEvent,
    init:startWork,
    removeEvent:removeEvent,
 };   
 }     

当我使用我的Javascript oop的menthod点击注册的元素时,它会运行事件我点击元素多少次?

例如:单击“创建文件夹”链接,然后单击“创建”按钮,单击创建文件夹链接的次数。请求发布同一时间。

以下是完整代码jsFiddle代码链接:https://jsfiddle.net/pm6bs5x9/

3 个答案:

答案 0 :(得分:0)

您需要明确禁用"创建文件夹"按钮,直到请求完成。然后在请求完成后,您重新激活该按钮。基本上,您可以像下面的设计示例那样获得对按钮的引用:

var btn = document.getElementById(buttonID);
btn.disabled =true;

然后在成功返回XHR后,您可以通过执行以下操作重新启用该按钮:

btn.disabled = false;

所有这一切的原因是该元素无法告诉您只需要触发一次。因此,一旦您将侦听器附加到元素,它就知道要监听其指定类型的每个事件,无论该事件发生多少次。

为了防止它,您必须明确指示它在当前请求完成之前不响应任何进一步的请求。这可以通过在当前请求返回之前禁用它来实现。

答案 1 :(得分:0)

您只需在第一次调用后删除事件侦听器。

在回调函数本身内调用removeEvent()函数,但是你必须使用外部函数作为回调函数,因为使用ananymous函数你就不会像 {{3}中所说的那样使用removeEventListener。 } 文档。

这是一个简单的用例示例:

var _d = document,
  _w = window;

var addEvent = function(el, e, callback, capture) {
  var evt = _w.event;
  if (_w.addEventListener) {
    el.addEventListener(e, callback, capture);
  } else el.attachEvent("on" + e, callback, capture);

}
var removeEvent = function(el, e, callback) {
  console.log("rmv")
  if (window.removeEventListener)
    el.removeEventListener(e, callback);
  else el.detachEvent("on" + e, callback);
}


var increment = function increment() {
  var inc = document.getElementById("inc");
  inc.value = parseInt(inc.value) + 1;
}

var clickme = document.getElementById("clickme");
addEvent(clickme, 'click', increment);


var increment2 = function increment2() {
  var inc2 = document.getElementById("inc2");
  inc2.value = parseInt(inc2.value) + 1;
  //Remove the event inside your callback
  removeEvent(clickme2, 'click', increment2);
}

var clickme2 = document.getElementById("clickme2");
addEvent(clickme2, 'click', increment2);
<p><h3>Without calling removeEvent</h3></p>
<input type="button" id="clickme" value="Click me!" />
<input type="text" id="inc" value="0" />

<p><h3>With removeEvent</h3></p>
<input type="button" id="clickme2" value="Click me once!" />
<input type="text" id="inc2" value="0" />

你只需要在你的例子中采用相同的逻辑。

答案 2 :(得分:0)

 Here is solution 

 Don`t use anonymous function with addEventListener

 eg. addEvent(clear,"click",function(){
     //your code...
     }); 
  use 
   var CreateFolder = function (e){    
    var form = select(".form-create_folder"),
    clear = select(".form-create_folder a");
    form.style.top ="10px";
    addEvent(clear,"click",upit);  
    addEvent(form,'submit',submitit);   
   }
  function upit(e){ //your code }
  function submitit(e){ //your code }



 use separate handler with name as mentioned above...