0

我以这种方式附加了一个跨度的点击事件。跨度在表内。

 $("#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 的行时调用该函数,但之后单击 span 时不会触发任何事件。

4

3 回答 3

2

.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); });
    }
于 2012-07-19T11:20:33.660 回答
1
function updateEvents(curntSpan) {
    /* ... */
    $(curntSpan).on('click', toggleData(curntSpan));
}

这将做的是:

  1. 评估$(curntSpan),产生一个 jQuery 对象
  2. 访问其.on属性
  3. 评估'click'and toggleData(curntSpan),产生一个字符串和其他东西
  4. .on使用字符串和上一步中的其他内容作为参数调用属性

我认为你想要的是这样的:

function updateEvents(curntSpan) {
    /* ... */
    $(curntSpan).on('click', function(){ toggleData(curntSpan) });
}

在第 3 步中,这将评估function(){ toggleData(curntSpan) }而不是toggleData(curntSpan)— 结果是一个在调用toggleData(curntSpan)时调用的函数(即当click事件被触发时)。

一般规则:

  1. 每当你调用一个函数时,它的参数都会被评估
  2. 例如,当您评估一个函数调用f(x)时,您运行该函数并获取结果
  3. 当你评估一个函数表达式时,例如function() { /* f(x) */ },结果就是那个函数(这里:一个不带参数并且有一个空主体的函数,因为它被注释掉了)。

同样的逻辑就是为什么你这样做$(function() { /* ... */ })而不是$(f(x))在页面“启动”时运行一些代码。

于 2013-07-07T06:01:03.607 回答
0
 $(curntSpan).off('click', appendData);

将不起作用,因为您首先没有将 appendData 作为处理程序。在处理程序中,您将匿名函数放入运行 appendData,而不是 appendData 本身

于 2012-07-19T10:47:52.897 回答