重新启用preventDefault

时间:2012-06-21 10:43:45

标签: jquery click preventdefault

我试图在提交点击之前修改锚点中的href。

但是,以下内容会创建一个无限循环:

$('.preview').live('click', function(e){
    e.preventDefault();
    var _this = this;
    var content = $('#redactor_content').getCode();
    var page_id = $('#page_id').val();
    $.ajax({
        url: ADMIN_CORE_URL + 'pages/autosave.php',
        dataType: 'json',
        type: 'POST',
        data: {page_id : page_id, content : content},
        success: function(data){
            var url = $(_this).attr('href') + data.revision_id;
            $(_this).attr('href', url);
            $(_this).unbind('click').click();
        }
    });
});

要么我无法点击提交,要么我得到循环。

如何在没有循环的情况下重新启用点击?

3 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情。 这样,只有当链接具有类x(或任何你想要调用它)时,处理程序才会被执行 在ajax响应之后,删除该类,不再执行click处理程序。

$(body).on('click', '.preview.x', function(e){
    e.preventDefault();
    var _this = this;
    var content = $('#redactor_content').getCode();
    var page_id = $('#page_id').val();
    $.ajax({
        url: ADMIN_CORE_URL + 'pages/autosave.php',
        dataType: 'json',
        type: 'POST',
        data: {page_id : page_id, content : content},
        success: function(data){
            var url = $(_this).attr('href') + data.revision_id;


            // $(_this).attr('href', url);
            // $(_this).removeClass('x').click();
            //
            // edit: version 2:
            window.open(url);
        }
    });
});

答案 1 :(得分:0)

这是循环我假设因为unbind()没有按照你的预期进行,然后你每次ajax调用成功时都会手动强制点击链接,这可能会一次又一次地运行相同的代码。

带走额外的.click()并首先确定如何正确解开原始点击,然后在需要时重新添加click()。作为旁注,由于您使用live()进行绑定,因此使用.die()取消绑定会更有意义(此后这两种方法已被.on()和{{替换1}} API也是)

答案 2 :(得分:0)

替换

$(_this).unbind('click').click();

$(_this).off('click');

自jquery 1.7.2 .live起,不推荐使用.on

$('body').on('click','.preview', handler);

取消绑定后,您将按.click()触发点击事件。

删除它应解决问题

修改

var handler = function(event){
    event.preventDefault();
    var _this = this;
    alert('called');
    $(_this).off('click').on(handler);
}


$('body').on('click','.preview', handler);

使用.on()附加事件处理程序,.off()删除它。

<强> DEMO

希望这有帮助