2010-11-23 68 views
0

刚做了这个输入 - 提交表单jQuery脚本。在你开始洪水之前“不要这样做吗?” - 是的,如果你有一个实际的提交按钮,它会。jQuery自动提交输入,请求改进

但我使用<a>标签样式作为按钮来提交表单。除非javascript被禁用,否则<noscript>将显示实际的标准外观提交按钮。

它应该处理浏览器的默认自动完成功能,如果按下向上/向下箭头键,它会在自动完成列表中上下移动,临时禁用自动提交输入。

如果您看到任何警告,或有改进的想法,他们会很多apreciated。

这里的脚本

// Submit form if focus on inputfields and enter is pressed 
// To handle autocomplete, we disable next enter if arrow up/down pressed and autocomplete is not turned off 
$('form input:text, form input:password').keyup(function(e){ 
    var arrowKeys = new Array(38, 40); 
    var key = e.charCode || e.keyCode || 0; 
    if(key == 13){ 
     if($(this).data('entersubmit')) { 
      e.preventDefault(); 
      $(this).closest('form').submit(); 
      return false; 
     } 
     $(this).data('entersubmit', true); 
    } else if($.inArray(key, arrowKeys) > -1) { 
     if($(this).attr('autocomplete') != 'off') { 
      $(this).data('entersubmit', false); 
     } 
    } 
}) 
.blur(function(){ 
    $(this).data('entersubmit', true); 
}) 
.focus(function(){ 
    $(this).data('entersubmit', true); 
}); 
+0

我大概可以省略onFocus或onBlur – Phliplip 2010-11-23 12:39:58

回答

0

我会缩短下来使用.bind()和对象映射,$.data(),以消除不必要的jQuery对象和event.which,这已经是标准化,并缩短数组语法,就像这样:

$('form input:text, form input:password').bind({ 
    keyup: function(e){ 
    var arrowKeys = [38, 40]; 
    if(e.which == 13){ 
     if($.data(this, 'entersubmit')) { 
      $(this).closest('form').submit(); 
      return false; 
     } 
     $.data(this, 'entersubmit', true); 
    } else if($.inArray(key, arrowKeys) > -1) { 
     if($(this).attr('autocomplete') != 'off') { 
      $.data(this, 'entersubmit', false); 
     } 
    } 
    }, 
    blur: function() { 
    $.data(this, 'entersubmit', true); 
    }, 
    focus: function(){ 
    $.data(this, 'entersubmit', true); 
    } 
}); 

还要注意你不需要两个.preventDefault()return false,重新调整false呼叫.preventDefault().stopPropagation()

+0

我用e.which开头,但不知何故方向键返回0(零)!? – Phliplip 2010-11-24 09:52:38