【问题标题】:jQuery live preventDefault failing on input elementsjQuery live preventDefault 在输入元素上失败
【发布时间】:2010-10-07 21:17:52
【问题描述】:

我有以下sn-p的代码:

$('#messages input').live('keydown', function(e){
  if(e.keyCode == 13) {
    alert($(this).attr('value'));
    e.preventDefault();
    return false;
  }
});

其中“#message input”显然是一组输入文本元素。我想抓住“输入”键并防止它刷新页面。然而,它每次都失败。警报工作正常,但 preventDefault() 似乎不起作用。

有人有什么想法吗?

编辑:我应该提到我正在使用 ASP.NET,它位于表单元素中。从表单元素中删除它可以解决问题,但我想知道为什么 preventDefault() 不起作用。

【问题讨论】:

  • alert 可以对 JS 行为做一些奇怪的事情,因为它是一个模态的阻塞调用。尝试将其更改为使用console.log,看看会发生什么。 (您的代码应该可以工作)
  • 感谢凯文,我自己也得出了同样的结论,这确实是问题所在。

标签: jquery preventdefault


【解决方案1】:

可以试试

e.stopPropagation()

【讨论】:

  • e.stopPropagation() 方法通常对 .live() 没有任何帮助。由于该事件附加到document,因此实际上没有更多的事件冒泡停止。除非它与e.isPropagationStopped() 一起使用?不过,我无法想象。
  • patrick 是正确的,根据定义,live 不能停止传播,因为它附着在身体上。
  • 是的,没想过用 live 代替 bind。
【解决方案2】:

具有讽刺意味的是,导致问题的是警报本身。

AFAICT,警报会在 preventDefault() 生效之前停止 JavaScript 执行,但浏览器继续处理击键,触发表单提交。

很奇怪,但你有它。

【讨论】:

    【解决方案3】:
    $('#form_deal_step1').live('submit',function(){
            $('.column .column_child select').not(':hidden').each(function(ev){
                 if($(this).val()=='?')
                 {
                     alert('Please select the ages of each child.');
                     ev.preventDefault();
                     return false;
                 }
              });
    })
    var age_selected=1;
    $('.column .column_child select').not(':hidden').each(function(){
        if($(this).val()=='?')
        {                
            age_selected=0; 
        }
    });
    if(age_selected==0)
    {
        alert('Please select the ages of each child.');
        return false;
    }
    

    【讨论】:

    • 上面的代码 var age_selected=1;不会阻止页面重新加载。因此来自 var age_selected=1; 的代码是一个如此不同的方式相同
    【解决方案4】:

    我认为表单是在 keypress 上提交的,而不是在 keydown 上提交的。试试

    $('#messages input').live('keypress', function(e){
      if(e.keyCode == 13) {
        alert($(this).attr('value'));
        e.preventDefault();
        return false;
      }
    });
    

    【讨论】:

      【解决方案5】:

      据我所知,页面刷新是表单的默认功能,而不是输入按钮,因此您应该防止默认在表单而不是输入上。

      类似的东西:

      $('#target').submit(function() {
        return false;
      });
      

      【讨论】:

        猜你喜欢
        • 2014-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        相关资源
        最近更新 更多