Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.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_This_Jquery Events - Fatal编程技术网

Javascript 关于「;这";在jQuery对象中

Javascript 关于「;这";在jQuery对象中,javascript,jquery,this,jquery-events,Javascript,Jquery,This,Jquery Events,在这样的代码中: var test = function (e,name) { this.e = e; this.name = name; this.init(); }; test.prototype.init = function () { var $e = $(this.e); var _this = this; $e.click(function () {

在这样的代码中:

    var test = function (e,name) {
        this.e = e;
        this.name = name;
        this.init();
    };
    test.prototype.init = function () {
        var $e = $(this.e);
        var _this = this;
        $e.click(function () {
            alert(_this.name);
            //show the current name
        });
        $('#AA').click(function () {
            alert(_this.name);
            //show all the name
        })
    };
    new test($("#A"),"A");
    new test($("#B"),"B");
为什么单击“$e”只显示当前名称, 而单击
“$('#AA')”
将显示所有名称


因为
#AA
的点击处理程序被附加了两次

new test($("#A"),"A");
new test($("#B"),"B");
调用
test
构造函数两次,一次用于
\A
,一次用于
\B
init
被调用两次,所以

$('#AA').click(function () {
    alert(_this.name);
    //show all the name
})
也将运行两次


在高级事件处理模型中(
addEventListener
,jQuery当然也使用它),事件处理程序不会相互替换(就像旧的
onclick
和friends),而是相加。因此,如果将同一事件处理程序添加到一个元素5次,那么当事件触发时,它将运行5次。

因为
#AA
的单击处理程序被附加了两次

new test($("#A"),"A");
new test($("#B"),"B");
调用
test
构造函数两次,一次用于
\A
,一次用于
\B
init
被调用两次,所以

$('#AA').click(function () {
    alert(_this.name);
    //show all the name
})
也将运行两次


在高级事件处理模型中(
addEventListener
,jQuery当然也使用它),事件处理程序不会相互替换(就像旧的
onclick
和friends),而是相加。因此,如果将同一事件处理程序添加到元素5次,则当事件触发时,它将运行5次。

发生这种情况是因为您调用:

    $('#AA').click(function () {
        alert(_this.name);
        //show all the name
    })
用于
#A
#B

调用时:
newtest($(“#A”),“A”)
调用方法
init
,该方法将导致click回调的附件,因此当您单击
#AA
时,将发出警报


然后调用:
newtest($(“#B”),“B”)。这导致使用不同的值调用
init
。另一个单击处理程序附加到
#AA
,因此当您单击元素时,会收到两个警报。

这是因为您调用:

    $('#AA').click(function () {
        alert(_this.name);
        //show all the name
    })
用于
#A
#B

调用时:
newtest($(“#A”),“A”)
调用方法
init
,该方法将导致click回调的附件,因此当您单击
#AA
时,将发出警报


然后调用:
newtest($(“#B”),“B”)。这导致使用不同的值调用
init
。另一个单击处理程序附加到
#AA
,因此当您单击元素时,您会收到两个警报。

@kapa和@Minko是正确的

一种快速解决方法是使用
unbind()
,以避免添加两次处理程序:

        $('#AA').unbind("click").click(function () {
            alert(_this.name);
            //show all the name
        })
将删除以前添加的单击处理程序。因此,我们正在确保添加一次


编辑:在严重的应用程序中,使用
off()
而不是
unbind()
。请参见文档中的关闭

@kapa和@Minko是正确的

一种快速解决方法是使用
unbind()
,以避免添加两次处理程序:

        $('#AA').unbind("click").click(function () {
            alert(_this.name);
            //show all the name
        })
将删除以前添加的单击处理程序。因此,我们正在确保添加一次


编辑:在严重的应用程序中,使用
off()
而不是
unbind()
。请参见文档中的
off

看起来像Jquery对我来说就像Jquery对我一样小心,因为调用
unbind()
会从所有事件类型的元素中删除每个事件处理程序。在大多数情况下,这不是一个好主意,因为插件或代码的其他部分可以将事件处理程序附加到同一元素,这样它们就会被销毁。正确的解决办法是使用。顺便说一句,从1.7开始,首选
off()
,而不是
unbind()
。我已经编辑并配置了它,以删除单击处理程序。关于
off()
,您是对的。我仍然建议使用名称空间,因为问题仍然存在,即使现在只适用于
单击
处理程序。如果您只需从元素中删除每个
单击
处理程序,就会出现神秘的、难以追踪的bug。当然不是在20行JSFIDLE中,而是在一个包含多个组件的项目中,所有组件都附加了自己的处理程序。我同意。我在回答中添加了建议,重点是名称空间
unbind()
支持名称空间,基本上
unbind()
off()
相同(如果不考虑事件委派)。无论如何,现在可以在注释中找到所有重要的细节:)。但是要小心,因为调用
unbind()
会从所有事件类型的元素中删除每个事件处理程序。在大多数情况下,这不是一个好主意,因为插件或代码的其他部分可以将事件处理程序附加到同一元素,这样它们就会被销毁。正确的解决办法是使用。顺便说一句,从1.7开始,首选
off()
,而不是
unbind()
。我已经编辑并配置了它,以删除单击处理程序。关于
off()
,您是对的。我仍然建议使用名称空间,因为问题仍然存在,即使现在只适用于
单击
处理程序。如果您只需从元素中删除每个
单击
处理程序,就会出现神秘的、难以追踪的bug。当然不是在20行JSFIDLE中,而是在一个包含多个组件的项目中,所有组件都附加了自己的处理程序。我同意。我在回答中添加了建议,重点是名称空间
unbind()
支持名称空间,基本上
unbind()
off()
相同(如果不考虑事件委派)。不管怎样,现在你可以在评论中找到所有重要的细节:)。