Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery(和其他)事件处理程序包装难题_Javascript_Jquery_Raphael_Jquery Events - Fatal编程技术网

Javascript jQuery(和其他)事件处理程序包装难题

Javascript jQuery(和其他)事件处理程序包装难题,javascript,jquery,raphael,jquery-events,Javascript,Jquery,Raphael,Jquery Events,在底部更新 原创 这说明了我的问题。我马上就来描述这个问题。这是代码,因为SO希望我粘贴它: HTML JS (函数($){ var wrap=函数(func){ 返回函数(e){ log('click some special logic'); func.apply(这个,[].slice.call(参数,0)); }; }; 函数通用函数单击函数(e){ log('generic click called'); }; 函数generic_mouseover_func(e){ log('g

在底部更新

原创

这说明了我的问题。我马上就来描述这个问题。这是代码,因为SO希望我粘贴它:

HTML


JS

(函数($){
var wrap=函数(func){
返回函数(e){
log('click some special logic');
func.apply(这个,[].slice.call(参数,0));
};
};
函数通用函数单击函数(e){
log('generic click called');
};
函数generic_mouseover_func(e){
log('generic mouseover called');
};
函数generic_mouseout_func(e){
log('generic mouseout called');
};
$('.on').on('click',function(){
$('.subject')。在('click',wrap(generic_click_func))
.on('mouseover',wrap(generic_mouseover_func))
.on('mouseout',wrap(generic_mouseout_func));
});
$('.off').on('click',function(){
$('.subject').off('click',wrap(generic\u click\u func))
.off('mouseover',wrap(generic_mouseover_func))
.off('mouseout',wrap(generic_mouseout_func));
});
})(jQuery);
CSS

.subject{高度:20px;宽度:20px;背景色:#ff0000;}
问题

我的代码的问题是,当调用
wrap()
时,即使使用相同的
func
param,结果函数也是该函数的新版本。因此,与具有相同
func
param的上一个结果函数相比,它并不相等。jsfiddle演示了这一点

在小提琴中,我们在两个位置调用
wrap(somefunction)
,一个用于
.on()
,另一个用于
.off()
,但是每次调用的结果函数与另一个相比被认为是不同的函数。这在技术上是正确的,因为
wrap()
函数每次调用时都返回一个新函数。因此,当使用此
wrap(somefunction)
参数调用
.on()
函数,然后使用相同的参数调用
.off()
(我知道不一样)时,
.off()
函数在列表中找不到该函数(由于比较方法),因此不会删除处理程序

我知道,如果我控制函数比较代码,我可以这样做:

if(“”+func1==“”+func2){remove_handler(ele,func2);};
但遗憾的是,我不是,因为这是jQuery的一部分。具体来说,它是
inaray()
函数的一部分,因为jQuery使用它来删除事件处理程序,这也是正确的,因为
inaray()
具有多用途,不总是需要进行字符串比较

我需要什么

我需要解决这个问题,这样我就可以有一个像
wrap
这样的包装函数,它返回
func
param的包装,以后可以将它与使用完全相同的代码创建的另一个包装函数进行比较,并且根据jQuery,它是相等的,因此
.off()
函数实际上可以删除它。jsfiddle就是一个确切的例子。我需要的是使
.off()
函数实际工作,同时维护包装器函数序列

旁注:在示例代码中,我添加了
mouseover
mouseout
事件,以简单地证明此包装函数是一段多用途、完全可重用的代码,它不是
click
事件所独有的。就这一点而言,它不是单一元素所独有的。它需要为页面上的多个元素以及每个元素的多个事件工作

更新


在Andrew发表了深刻的评论之后,我通过简单地利用jQuery的名称空间功能实现了这一点。这解决了jQuery事件的问题;但是,RaphaelJS的
.click()
.unclick()
函数也有同样的问题。有人能提供帮助吗?下面是一个使用RaphaelJS演示相同问题的示例。

是否可以为事件命名空间并在以后删除命名空间的事件?这样你就可以一起避免这个问题。哇!好主意!让我试一试。我没有想到要从另一个角度来看它,哈哈,布尔博克。这很有效。不过,让我用第二部分来更新这个问题。这适用于jQuery事件,但是现在我需要它来处理RaphaelJS事件。secok我添加了raphaeljs问题,以及带有raphaeljs代码的JSFIDLE,演示了raphaeljs的相同问题