Javascript .on和.off不在jquery中工作
我以这种方式附加了span的点击事件。跨度在一张桌子内Javascript .on和.off不在jquery中工作,javascript,jquery,Javascript,Jquery,我以这种方式附加了span的点击事件。跨度在一张桌子内 $("#tblImport").find("span").each(function () { $(this).click(function () { appendData(this); }); }); 此事件处理程序“appendData”发出ajax请求并获取数据 function appendData(
$("#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事件的引用。我现在已经在这个答案中解决了。