【问题标题】:preventDefault() for keypress cancels change event按键的 preventDefault() 取消更改事件
【发布时间】:2012-10-25 23:27:20
【问题描述】:

在下面的代码 sn-p 中,我试图通过使用preventDefault() 来阻止用户在<textarea> 中输入新行。我不想输入新行,而是希望输入键触发模糊事件。但是,下面的代码在用户更改<textarea> 中的文本然后按回车后绕过了更改事件。如何确保更改文本的值时始终触发更改事件?

$('textarea')
.keypress(function (event) {
    if (event.which == '13') {//13 = Enter
        event.preventDefault();
        $(this).blur();
    }
})
.change(function() {// THIS DOES NOT FIRE IF USER PRESSES ENTER
    alert('change event');
})
.blur(function() {
    console.log('blur event');
});//end: blur()

【问题讨论】:

  • 我试图阻止用户在 textarea 中输入新行 嗯……看起来你需要的是文本输入。
  • 这将是一个不错的选择,但在某些情况下,用户需要输入大量文本 - 超过一行。
  • 在阻止默认行为时手动触发更改事件$('textarea').change();$(this).change();
  • 在这个示例中运行良好jsfiddle.net/arunpjohny/g4ybc 您使用哪个浏览器? Chrome 和 Firefox 都可以正常工作
  • @jake 虽然它在 IE 中不起作用,但它在 IE 中起作用 jsfiddle.net/arunpjohny/g4ybc/1,这里不是触发 blur,而是将事件焦点更改为另一个对象

标签: javascript jquery jquery-events event-bubbling


【解决方案1】:

只需手动触发 change 事件,就像触发 blur 事件一样。

【讨论】:

    【解决方案2】:

    看起来这是事件ordering 的问题。在 IE 中首先触发 change 事件,然后触发 blur 事件,但在 Firefox 和 Chrome 中则相反。因此,当您在 Firefox 和 Chrome 中手动触发 blur() 事件时,它会导致触发 focus 事件,但在 IE 中不会触发。

    【讨论】:

    • 由于我不能依赖跨浏览器的更改和模糊事件的顺序,我最终摆脱了更改事件侦听器,而是在模糊事件中内置了相同的功能:期待查看新的 textarea 值是否已更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多