Javascript .on和.off不在jquery中工作

Javascript .on和.off不在jquery中工作,javascript,jquery,Javascript,Jquery,我以这种方式附加了span的点击事件。跨度在一张桌子内 $("#tblImport").find("span").each(function () { $(this).click(function () { appendData(this); }); }); 此事件处理程序“appendData”发出ajax请求并获取数据 function appendData(

我以这种方式附加了span的点击事件。跨度在一张桌子内

 $("#tblImport").find("span").each(function () {
                $(this).click(function () {
                    appendData(this);
                });
            });
此事件处理程序“appendData”发出ajax请求并获取数据

 function appendData(prntSpan) {
            $(prntSpan).append(createElements());//ajax call.
            updateEvents(prntSpan);
        }
我想要的是分离这个单击事件处理程序并附加一个新的处理程序。 所以我试过这个

function updateEvents(curntSpan) {
        $(curntSpan).off('click');//this works
        $(curntSpan).off('click', appendData);// but this does not work strange
        $(curntSpan).on('click', toggleData(curntSpan));//nor a new click handler is attached
    }
当执行上面使用.on的行时调用该函数,但之后当您单击范围时,不会触发任何事件

 $(curntSpan).off('click', appendData);
将不起作用,因为您首先没有将appendData作为处理程序。在处理程序中,您将匿名函数放在运行appendData的内部,而不是appendData本身


将无法工作,因为您没有首先将appendData作为处理程序。在处理程序中,您在运行appendData时将匿名函数放在其中,而不是appendData本身

在函数检查中,
.on()
有错误的语法。因此,在我看来,您应该更改以下代码:

$("#tblImport span").click(function (e) {
                e.stopPropagation();
                appendData(this);
            });
这有更清晰的语法

function updateEvents(curntSpan) {
        $(curntSpan).off('click');//this works
        $("#tblImport").on('click', curntSpan, function() { toggleData(curntSpan); });
    }

函数检查中的
.on()
语法错误。因此,在我看来,您应该更改以下代码:

$("#tblImport span").click(function (e) {
                e.stopPropagation();
                appendData(this);
            });
这有更清晰的语法

function updateEvents(curntSpan) {
        $(curntSpan).off('click');//this works
        $("#tblImport").on('click', curntSpan, function() { toggleData(curntSpan); });
    }
这样做的目的是:

  • 计算
    $(curntSpan)
    ,生成一个jQuery对象
  • 在属性上访问其
  • 计算
    “单击”
    切换数据(curntSpan)
    ,生成字符串和其他内容
  • 使用字符串和上一步中的其他内容作为参数调用
    .on
    属性
  • 我想你想要的是这样的:

    function updateEvents(curntSpan) {
        /* ... */
        $(curntSpan).on('click', function(){ toggleData(curntSpan) });
    }
    
    在步骤3中,这将计算
    function(){toggleData(curntSpan)}
    ,而不是
    toggleData(curntSpan)
    ——结果是调用时调用
    toggleData(curntSpan)
    的函数(即触发
    单击事件时)

    一般规则:

  • 无论何时调用函数,都会计算其参数
  • 当您计算函数调用时,例如
    f(x)
    ,您运行函数并获取结果
  • 当您计算一个函数表达式时,例如,
    function(){/*f(x)*/}
    ,结果就是该函数(这里:一个不带参数且具有空体的函数,因为它被注释掉了)
  • 同样的逻辑就是为什么在页面“启动”时运行一些代码,而不是执行
    $(function(){/*…*/})

    这样做的目的是:

  • 计算
    $(curntSpan)
    ,生成一个jQuery对象
  • 属性上访问其
    
    
  • 计算
    “单击”
    切换数据(curntSpan)
    ,生成字符串和其他内容
  • 使用字符串和上一步中的其他内容作为参数调用
    .on
    属性
  • 我想你想要的是这样的:

    function updateEvents(curntSpan) {
        /* ... */
        $(curntSpan).on('click', function(){ toggleData(curntSpan) });
    }
    
    在步骤3中,这将计算
    function(){toggleData(curntSpan)}
    ,而不是
    toggleData(curntSpan)
    ——结果是调用时调用
    toggleData(curntSpan)
    的函数(即触发
    单击事件时)

    一般规则:

  • 无论何时调用函数,都会计算其参数
  • 当您计算函数调用时,例如
    f(x)
    ,您运行函数并获取结果
  • 当您计算一个函数表达式时,例如,
    function(){/*f(x)*/}
    ,结果就是该函数(这里:一个不带参数且具有空体的函数,因为它被注释掉了)

  • 同样的逻辑就是为什么在页面“启动”后运行一些代码时,您要执行
    $(function(){/*…*/})而不是
    $(f(x))

    那么这段代码将是什么呢?on也不起作用。尝试
    $(“#tblImport”)。查找(“span”)。on('click',appendData)
    首先,在附录数据中将prntSpan更改为此。那么.off应该可以工作,那么那段代码会是什么呢?on也不工作。试试
    $(“#tblImport”)。首先找到(“span”).on('click',appendData)
    ,然后在appendData中将prntSpan更改为这个。那么.off应该起作用。最后一件事是,我们如何避免在注册时触发此事件,以及为什么再次单击后不会触发此事件。要防止触发第二个事件,可以使用
    e.stopPropagation()并添加
    e
    参数以在
    单击
    事件中运行。看看我做的更新。不,它不起作用,而且下次事件也不会触发。如果它对您不起作用,我建议您检查您在中调用的函数中是否没有任何错误。在这里,您在处理alerts@ankur时,缺少了toggleData调用周围的函数(){}包装。这导致它执行函数,而不是传递对click事件的引用。我现在已经在这个答案中修复了它。最后一件事是,我们如何避免在注册时触发此事件,以及为什么再次单击后不会触发此事件。要防止触发第二个事件,可以使用
    e.stopPropagation()并添加
    e
    参数以在
    单击
    事件中运行。看看我做的更新。不,它不起作用,而且下次事件也不会触发。如果它对您不起作用,我建议您检查您在中调用的函数中是否没有任何错误。在这里,您在处理alerts@ankur时,缺少了toggleData调用周围的函数(){}包装。这导致它执行函数,而不是传递对click事件的引用。我现在已经在这个答案中解决了。