【问题标题】:Cancel event triggering (blur) from another element's event (click)从另一个元素的事件(单击)取消事件触发(模糊)
【发布时间】:2014-01-01 22:07:01
【问题描述】:

我有几行带有文本,我可以通过用输入替换行内联来“编辑”它们,输入从行中获取文本作为其值属性。

当输入失去焦点时,恢复之前的文本。

当按下回车键(keyCode 13)时,新文本被保存并写入行中。

现在,对于不知道按回车键保存文本的用户,我想在输入字段旁边添加一个“保存”按钮。但是当按下它时,输入字段的模糊事件首先被触发,丢弃更改。

那么有没有一种简单的方法,按钮的 .click() 事件可以取消输入字段上的 .blur() 事件?也许是“不执行其他事件”,或者我可以在模糊事件中看到,接下来会调用哪些事件来取消它?

这是一个 jsfiddle 来了解我的意思:http://jsfiddle.net/ykY5X/ (我在 Firefox(最新的 Nightly)中工作,按钮单击不起作用。我刚刚也在 chrome 中测试了 jsfiddle,keyup 也无法按预期工作。)

$('#showEdit').click(function() {
    $('#row').data('text',$('#row').text());
    $('#row').html('<input type="text" id="editInput" /> <span id="editSave">Save</span>');
    $('#editInput').val($('#row').data('text')).focus();
});

$('#row').delegate('#editInput','keyup',function(e) {
    e.stopPropagation();
    var keycode = e.keyCode || e.which;

    if (keycode == 13) $('#editSave').click();
}).delegate('#editSave','click',function(e) {
    e.stopPropagation();

    $('#row').text($('#editInput').val());
}).delegate('#editInput','blur',function() {
    $('#row').text($('#row').data('text'));
});

【问题讨论】:

  • 你不能在用户点击编辑时保存值,然后在 onblur 时再次保存,然后保存按钮功能比较两个值,如果它们不同,将其更改为最后保存的值从模糊开始?
  • 是个好主意!不幸的是,click 事件不会触发,只要blur 事件删除按钮。它只触发按钮的mousedown 事件。有了一些临时数据,效果很好:) 谢谢!
  • 很高兴我可以提供一种您可以使用的方法:)

标签: javascript jquery events


【解决方案1】:

我的最终解决方案是这样的:

$('#showEdit').click(function() {
    $('#row').data('textOriginal',$('#row').text());
    $('#row').data('textSave',$('#row').text());
    $('#row').html('<input type="text" id="editInput" /> <span id="editSave">Save</span>');
    $('#editInput').val($('#row').data('textOriginal')).focus();
});

$('#row').delegate('#editInput','keyup',function(e) {
    e.stopPropagation();
    var keycode = e.keyCode || e.which;
    if (keycode == 13) {
        $('#row').data('textSave',$(this).val());
        $('#editSave').click();
    }
}).delegate('#editSave','mousedown',function() {
    $('#row').data('textSave',$('#editInput').val());
}).delegate('#editSave','click',function(e) {
    e.stopPropagation();

    if ($('#row').data('textOriginal') == $('#row').data('textSave')) {
        $('#row').text($('#row').data('textOriginal'));
        return;
     }

    $('#row').text($('#row').data('textSave'));

}).delegate('#editInput','blur',function() {
    $('#editSave').click();
});

http://jsfiddle.net/RSUdx/

【讨论】:

    【解决方案2】:

    您可以在blur 事件处理程序中的代码执行之前使用一些延迟。点击保存按钮,您可以取消blur 计时器,使其不会被执行。

    工作demo

    var blurTimer;
    $('#showEdit').click(function() {
            $('#row').data('text',$('#row').text());
            $('#row').html('<input type="text" id="editInput" /> <span id="editSave">Save</span>');
            $('#editInput').val($('#row').data('text')).focus();
    });
    
    $('#row').delegate('#editInput','keyup',function(e) {
        e.stopPropagation();
        var keycode = e.keyCode || e.which;
        if (keycode == 13){
           $('#editSave').click();
        }
    }).delegate('#editSave','click',function(e) {
        clearTimeout(blurTimer);
        $('#row').text($('#editInput').val());
    }).delegate('#editInput','blur',function() {
        blurTimer = setTimeout(function(){
           $('#row').text($('#row').data('text'));
        }, 200);
    });
    

    【讨论】:

    • @Wulf - 希望这能帮助您解决问题。如果是,请将其标记为答案。
    • 我赞成它,因为它是一个可能的解决方案。请参阅我的最终解决方案,了解我最终是如何做到的。
    • 您的解决方案将触发click 事件处理程序两次,而且如果您只想在模糊event 上执行任何逻辑,则不能这样做。
    • 你用什么浏览器?在 Firefox 中,click 事件仅触发一次(由blur 事件),因为按钮将在mouseup(最后是click)事件被按钮缓存之前被删除。对于单个blur 事件功能(因此没有按钮单击或其他任何内容),click 事件中有if-block textOriginal == textSave,当没有进行任何更改并且输入字段模糊时,该事件正在被调用.
    【解决方案3】:

    我想你可以试试这个:

    $('#showEdit').click(function() {
        $('#row').data('text',$('#row').text());
        $('#row').html('<input type="text" id="editInput" /> <span id="editSave">Save</span>');
        $('#editInput').val($('#row').data('text')).focus();
    });
    
    $('#row').delegate('#editInput','keyup',function(e) {
        e.stopPropagation();
        var keycode = e.keyCode || e.which;
        if (keycode == 13) $('#editSave').click();
    }).delegate('#editSave','click',function(e) {
        e.stopPropagation();
    
        $('#row').text($('#editInput').val());
    
    }).delegate('#editInput','blur',function() {
        if($('#editSave').click())
             $('#row').text($('#editInput').val());
        else
        $('#row').text($('#row').data('text'));
    });
    

    【讨论】:

    • 如果我理解正确,这将始终保存新文本。 (例如,单击窗口中的某个位置,它会尝试执行 click() 函数,并且总是会成功)
    • 这样做的问题是即使在 onblur 之后文本也会被保存。我以为您希望它仅在用户按 Enter 或保存按钮时保存,在这种情况下,请参阅我对您的问题的评论
    【解决方案4】:

    .unbind允许你解除绑定。[docs]

    编辑

    使用keydown 代替keyup

    【讨论】:

    • 您没有阅读我的问题或查看我的 jsfiddle 以了解我的问题。如果 unbind (我当然知道)可以帮助我,请解释一下。
    • 哦,我很快就会用小提琴回复你:D
    猜你喜欢
    • 2022-10-17
    • 2019-08-06
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多