取消从另一个元素的事件事件触发(模糊)(点击)

取消从另一个元素的事件事件触发(模糊)(点击)

问题描述:

我有几文行,我可以“编辑”通过与输入,后者从该行的文本作为其值属性内联替换该行。取消从另一个元素的事件事件触发(模糊)(点击)

当输入焦点失去,以前的文本被恢复。

当按回车键(键代码13),新的文本被保存,并会在该行中写入。

现在,谁不知道按回车键保存文本的用户,我想补充旁边的输入字段中的“保存”按钮。但是当按下它时,输入字段的模糊事件会先被触发,放弃更改。

那么,有没有一种简单的方法,该按钮。点击()事件可以取消在输入栏.blur()事件?也许是“不要执行其他事件”,或者我可能在模糊事件中看到哪些事件将在下一次被调用以取消它?

这里是一个要的jsfiddle明白我的意思:http://jsfiddle.net/ykY5X/ (我在Firefox(最新每晚),其中按一下按钮将无法正常工作工作我只是测试的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')); 
}); 
+1

不能你刚才保存的值当用户点击编辑,然后再保存时它在onblur上,然后保存按钮功能比较这两个值,如果它们不同,则将其更改为从bl保存的最后一个值UR? – Psyrus

+0

是个好主意!不幸的是,只要'blur'事件移除按钮,'click'事件就不会触发。它只会触发按钮的'mousedown'事件。随着一些临时数据,它很好:)谢谢! – Wulf

+0

很高兴我可以提供一种方法,您可以从中工作:) – Psyrus

我最后工作的解决方案是这样的:

$('#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/

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

编辑

使用​​代替keyup

+0

您没有阅读我的问题或看我的jsfiddle,看看我的问题是什么。如果解除绑定(我当然知道)可以帮助我,请解释一下。 – Wulf

+1

Ohh k我很快就会回到你的身边:D – kritya

我觉得你可以试试这个:

$('#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')); 
}); 
+0

如果我理解正确,这将永远保存新的文本。 (F.e.在窗口的某个地方点击,它会尝试执行click()函数,并且这将始终成功) – Wulf

+0

这样做的麻烦在于,即使在onblur之后,文本也会保存。我以为你想要它保存只是当用户点击输入或保存按钮,在这种情况下看到我对你的问题的评论 – Psyrus

你可以在里面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); 
}); 
+0

@Wulf - 希望这有助于你解决你的问题。如果是,请将其标记为答案。 – ShankarSangoli

+0

我投了票,因为这是一个可能的解决方案。看看我最终的解决方案。 – Wulf

+0

您的解决方案将触发'click'事件处理程序两次,并且如果您只想在blur事件上执行任何逻辑,则不能这样做。 – ShankarSangoli