2016-09-03 64 views
0

我有一个对象:jQuery的事件冲突

var myObject = { 
    open : function() { 
     console.log('Object open'); 

     $(this).trigger('open'); 
    } 
}; 

$(myObject).on('open', function() { 
    console.log('Open event received'); 
}); 

myObject.open(); 

此代码抛出一个“太多递归”。

的问题是触发调用该方法,如果我重新命名open方法,这个工程:

var myObject = { 
    _open : function() { 
     console.log('Object open'); 

     $(this).trigger('open'); 
    } 
}; 

$(myObject).on('open', function() { 
    console.log('Open event received'); 
}); 

myObject._open(); 

这是否有道理的人?

回答

0

那么当你尝试再次触发'open'时,你创建了一个递归循环。
递归循环是一种重复调用自身的函数,直到发生“stackoverflow”错误(没有双关意图)。这是一种更有效的循环方式。
在第二种情况下,您触发_open,然后函数尝试触发'open'事件,这会触发on('open')侦听器。那么简单。

+0

是的,我知道,但是这不是我所期待的,当我说的对象听众,我预计jQuery的触发事件,而不是调用该方法,为什么?因为如果我想调用我的对象的方法,我只是做myObject.myMethod() – user3763667

+0

因为你的方法是与你的事件相同的名称jquery可能认为他们都是事件,当你触发事件时,它也触发该函数以及 – Nicolas

+0

ok,如此愚蠢 ! jQuery真的很烂 – user3763667

0

在你的第一个例子

$(this).trigger('open');

递归触发myObject.open函数的调用。

在第二个

$(this).trigger('open'); 

触发新的自定义事件“开放的”,然后你处理与您通过()方法定义的处理程序此事件。

+0

是的,这是我知道的部分,但我真的不明白为什么jQuery调用方法:) – user3763667

0

所以这听起来像你试图为你的函数执行时创建一个事件监听器?

如果是这样,我就是这样处理了许多这类事件的。我使用绑定到文档的自定义事件,以便它们在全局级别可用。

JS小提琴:https://jsfiddle.net/7eaoe1hp/

var myObject = { 
     open : function() { 
      console.log('Object open'); 

      $(document).triggerHandler('open'); 
     } 
    }; 

    $(document).on('open', function(){ 
     console.log('Open event received'); 
    }); 

    myObject.open(); 
+0

是的,但我不能改变我的结构为jQuery错误。我的方法“开放”触发“开放”事件,就这样。所以唯一的方法是在()off()和trigger()附加对象上创建一个替代 – user3763667