【问题标题】:How to submit form on keypress?如何在按键上提交表单?
【发布时间】:2013-06-14 17:41:08
【问题描述】:

我用这个script 在静态页面中搜索

但是我希望在我输入文本输入时而不是在我单击按钮时进行搜索,我搜索并发现其中任何一个都可以:

onkeypress="this.submit();"
onkeyup="this.submit();"
onkeypress="document.forms["f1"].submit();"
onkeyup="document.forms["f1"].submit();"

但它们都不起作用

我使用与脚本相同的 html

<form id="f1" name="f1" action="javascript:void()" onsubmit="if(this.t1.value!=null &amp;&amp; this.t1.value!='')parent.findString(this.t1.value);return false;">
<input type="text" id="t1" name="t1" value="Search" onfocus="if(this.value=='Search')this.value='';" size="20" onkeypress="this.submit();" />
<input type="submit" name="b1" value="Find" />
</form>

【问题讨论】:

  • action="javascript:void()"...
  • 这有什么问题?
  • chrome 在我使用void() 时出现错误,尝试void(0),添加完整代码的答案。
  • 实际发生了什么以及您预计会发生什么?
  • 我不知道这个“void”是做什么的,代码是从脚本网页的 html 复制粘贴的

标签: javascript html search onkeyup onkeypress


【解决方案1】:

您的报价有问题!这里的颜色编码显示它!

onkeypress="document.forms["f1"].submit();"
           ^                ^
         opens           closes

sumbit 在表单上,​​而不是在元素上,因此this.submit 失败了。

你需要

this.form.submit()

【讨论】:

  • 会发生什么?您需要添加详细信息。
  • 我认为错误引用只是问题上的一个错误,因为 OP 确实说它提交了
【解决方案2】:

也许您应该使用addEventListener() 来分配事件。 此外,你有一个错字。字符串的开头/结尾最好使用单引号,这样内联双引号就没有问题(反之亦然)。

onkeypress='document.forms["f1"].submit();'

并通过 Javascript 提交表单:

document.forms[0].submit()

提交第一个表单。

【讨论】:

    【解决方案3】:

    form.submit() 不会触发 onsubmit。你应该实现一个函数。

    您的 onkeyup 脚本是违反直觉的,因为选择文本 onkeyup 需要模糊文本框焦点。

    使用调用 findString(this.value); 而不是提交的 sn-ps 创建了一个测试:

    http://jsfiddle.net/e9Esz/

    some sample text
    <form id="f1" name="f1" action="javascript:void(0)" onsubmit="if(this.t1.value!=null &amp;&amp; this.t1.value!='')parent.findString(this.t1.value);return false;">
    <input type="text" id="t1" name="t1" value="Search" onfocus="if(this.value=='Search')this.value='';" size="20" onkeyup="findString(this.value);" />
    <input type="submit" id="b1" name="b1" value="Find" />
    </form>
    

    Javascript:

    var TRange=null;
    
    function findString (str) {
     if (parseInt(navigator.appVersion)<4) return;
     var strFound;
     if (window.find) {
    
      // CODE FOR BROWSERS THAT SUPPORT window.find
    
      strFound=self.find(str);
      if (!strFound) {
       strFound=self.find(str,0,1);
       while (self.find(str,0,1)) continue;
      }
     }
     else if (navigator.appName.indexOf("Microsoft")!=-1) {
    
      // EXPLORER-SPECIFIC CODE
    
      if (TRange!=null) {
       TRange.collapse(false);
       strFound=TRange.findText(str);
       if (strFound) TRange.select();
      }
      if (TRange==null || strFound==0) {
       TRange=self.document.body.createTextRange();
       strFound=TRange.findText(str);
       if (strFound) TRange.select();
      }
     }
     else if (navigator.appName=="Opera") {
      alert ("Opera browsers not supported, sorry...")
      return;
     }
     if (!strFound) alert ("String '"+str+"' not found!")
     return;
    }
    

    【讨论】:

    • +1 对于“form.submit() 不会触发 onsubmit”。但是,您建议的修复方法不是很清楚。
    • 添加了一个关于将 onsubmit 更改为findString(this.value); 的 sn-p 但是,这样做的逻辑是在用户键入时立即选择文本。这意味着一旦用户键入一个字母,该文本框就会失去焦点。 (不断地输入一个字母。)或者,你可以用一个模拟“选择”的 css 类将文本包装在一个跨度中,但如果没有 jQuery,我不会费心去研究它。
    • 感谢您的回答,它是唯一真正有效的方法,现在我必须在这个错误功能上做一些工作,但是谢谢
    【解决方案4】:

    正如 Tom 所说,调用 form.submit() 不会触发 onsubmit 处理程序。只有在手动提交表单时才会调用 onsubmit 处理程序。因此,如果您尝试手动提交表单,则必须自行检查错误。

    HTML

    <form id="f1">...<form/>
    

    JS

    // After the DOM is loaded
    var form = document.getElementById('f1');
    function canSubmit(form) {
        if(form.t1.value!=null && form.t1.value!='') {
    
        }
        return false;
    }
    
    form.onsubmit = function() {
        return canSubmit(form);
    }
    
    form.onkeypress = function() {
        if(canSubmit(form)){
            form.submit();
        }
    }
    

    说了这么多,如果你只是有一个更聪明一点的findString,那么你会从两个地方调用它并在空时忽略它

    function findString(value) {
        if (value) {
            parent.findString(form.t1.value);
        }
    }
    
    form.onsubmit = function() {
        findString(form.t1.value);
        return false;
    }
    
    form.onkeypress = function() {
        findString(form.t1.value);
    }
    

    【讨论】:

    • 这仍然没有解决在键上选择文本的逻辑问题,这会模糊输入的焦点。这就是我在回答中所说的。
    • @Tom 是 OP 在问这个问题吗?我没有看到 OP 提到任何内容...问题需要改进...
    • 我已经回答了他原来的问题。所以你认为我们不应该在他们不询问的情况下识别代码的其他主要问题。
    • @Tom 不,那很好,我只是想把注意力集中在被问到的问题上,以使这个问题对其他人更有用......如果这也是一个问题,那应该是另一个问题。这使得 SO 问题更具可重用性和独立性。两个问题合二为一很方便,只是不适合阅读问题的其他人
    • 谢谢你的回答,但汤姆先回答,他的回答是正确的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多