【问题标题】:re-enable preventDefault重新启用 preventDefault
【发布时间】:2012-06-21 10:43:44
【问题描述】:

我正在尝试在提交点击之前修改锚点中的 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();
        }
    });
});

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

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

【问题讨论】:

  • 所以你只想更改第一次点击的href?
  • 从这个线程和其他地方的答案看来,似乎没有办法撤消 preventDefault()。我们仅限于 A) 重新注册事件处理程序,或 B) 确保从一开始就不会调用 preventDefault()。

标签: jquery click preventdefault


【解决方案1】:

你可以试试这样的。 这样,只有在链接具有 x 类(或您想调用的任何名称)时,处理程序才会被执行。
在 ajax 响应之后,删除该类并且不应再执行单击处理程序。

$(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);
        }
    });
});

【讨论】:

  • 我想过做这样的事情,但这不意味着链接只能按一次吗?
  • @AsaCarter 好吧,这不是你想要的吗?我以为您想在ajax之后更改链接上的href,然后像常规点击一样加载该href(只是普通的页面重定向,没有preventDefault + jquery)。如果不是,请更具体地说明您的实际目标是什么。
  • 抱歉,链接会在新窗口中打开,因此可以再次点击。
  • @AsaCarter 啊哈!那么在这种情况下,你为什么不直接做window.open(url); 而不是改变链接的href?
  • 因为我想避免弹出窗口拦截器的问题
【解决方案2】:

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

去掉多余的.click(),先弄清楚如何正确解绑原来的点击,如果需要,再添加click()。附带说明一下,由于您使用live() 进行绑定,因此使用.die() 取消绑定会更有意义(这两种方法已被.on().off() API 取代)

【讨论】:

    【解决方案3】:

    替换

    $(_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

    希望对你有帮助

    【讨论】:

    • 在这种情况下,您可以再次附加处理程序
    • 谢谢,您能修改一下演示,在更改 url 的值后点击链接吗?我仍然无法获得点击链接:(
    • 没有点击是什么意思?你能解释一下吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多