【问题标题】:How best to make a link submit a form如何最好地使链接提交表单
【发布时间】:2010-09-23 17:32:26
【问题描述】:

让常规锚点 (<a href="...">) 提交单击时嵌入的表单的最佳方法是什么?

<form>
    <ul>
        <li>
            <p>
                The link could be <span>embedded <a href="" onclick="?">at any level</a></span>
                in the form, so "this.parentNode.parentNode..." is no good. :(
            </p>
        </li>
    </ul>
</form>

我知道使用 jQuery 最简单的方法是

$('#myLink').click(function() {
    $(this).parents('form:first').submit();
});

...但我正在尝试找到一种不使用库的方法。


编辑:我真的想找到一种不需要表单知识的方法(例如:它的名称、ID 等)。这类似于将其放在输入元素上的方式:&lt;input onclick="this.form.submit()" /&gt;

【问题讨论】:

  • 不要那样做。使用样式为链接的&lt;button type="submit"&gt;。它在语义上是正确的,浏览器会为你做这件事,并且它不会因禁用 JavaScript 而失败。
  • 你是对的,这将是一个更好的解决方案。

标签: javascript html forms


【解决方案1】:

您为什么不使用&lt;input&gt;&lt;button&gt; 元素并使用CSS 对其进行调整?然后它可以在没有 Javascript 的情况下工作,因此更可靠。

【讨论】:

  • 你不能做 button:hover on IE6.
  • button/input-submit 表现得更好,更像您要建模的东西,因此即使保证 JS 可用,它也是一个更好的选择。例如, href="#" 会表现得很奇怪。中键单击它,右键单击书签等。如果将鼠标悬停在 IE6 上确实很重要,您可以随时添加 JS hack。
  • 同意这个答案。链接是 GET 请求,没有理由改变它。不要让链接做 POST。改用表单提交。
  • 是的,但这不是问题的答案,是吗?我知道您可以使用输入来提交表单,并且它在语义上更好,等等,但我想了解常规 链接。
  • nickf,有时正确的答案是这个问题是错误的。
【解决方案2】:

最简单的方法是使用这样的方法:


<a href="#" onclick="document.formName.submit();">

【讨论】:

【解决方案3】:

我现在每次都在使用它。因为我项目中的提交按钮通常是一个链接(通过包装图像或 CSS),所以我使用这个:

<a href="#" onclick="$(this).closest('form').submit(); return false;">Submit</a>

别忘了它也在使用 jQuery。

您可以包装自己的函数。所以它总是在那个链接上提交父元素(表单)。

【讨论】:

    【解决方案4】:

    只要链接是表单的直接子级,您就可以使用它。您不需要知道表单的名称。至少适用于 Firefox 和 Chrome。

    <form action="">
        <a href="" onclick="parentNode.submit();return false;">Submit</a>
    </form>
    

    quirksmode.org 告诉我 x.parentNode 在所有浏览器中都可以工作,所以这个应该在任何地方都可以工作。

    【讨论】:

    • 有没有办法让父 parentNode 上两层?
    【解决方案5】:

    遍历父节点,直到找到一个带有标记名的元素,表明它是一个表单!

    <form>
        <ul>
            <li>
                <p>
                    The link could be <span>embedded <a href="" onclick="get_form(this).submit(); return false">at any level</a></span>
                    in the form, so "this.parentNode.parentNode..." is no good. :(
                </p>
            </li>
        </ul>
    </form>
    
    
    
    <script type="text/javascript">
        //<![CDATA[
        function get_form( element )
        {
            while( element )
            {
                element = element.parentNode
                if( element.tagName.toLowerCase() == "form" )
                {
                    //alert( element ) //debug/test
                    return element
                }
            }
            return 0; //error: no form found in ancestors
        }
        //]]>
    </script>
    

    【讨论】:

    • 嗨哈森,我已经使用了你的方法并且效果很好,我对该解决方案只有一个问题。如果我想在发送之前修改表单文件(例如加密),有什么办法吗?我的意思是我想在提交之前加密用户名和密码字段的值,这个函数可以吗?
    • @Alper,get_form 将返回表单对象,查看 api:w3schools.com/jsref/dom_obj_form.asp
    【解决方案6】:

    使用如下标记将提交按钮转换为链接:

    <input id="submitlink" type="submit" value="Text" />
    

    还有这样的 CSS:

    input#submitlink {
        background: transparent;
        border: 0;
        cursor:pointer;
        margin: 0;
        padding: 0;
        color: #034af3;
        text-decoration: underline;
    }
    
    input#submitlink:visited {
        color: #505abc;
    }
    
    input#submitlink:hover {
        color: #1d60ff;
        text-decoration: none;
    }
    
    input#submitlink:active {
        color: #12eb87;
    }
    

    【讨论】:

      【解决方案7】:

      最好的办法是

      <a href="#" onclick="document.forms[0].submit();return false;">Submit Form</a>
      

      但是您可能不想这样做,因为它会使禁用 JS 的用户无法提交

      【讨论】:

      • 您可以在提交按钮上放置一个
      • 没想到,实际上你可能连HTML中的链接都不要,只需通过JS以编程方式添加,这样他们就不会在没有启用JS的情况下看到所有内容跨度>
      【解决方案8】:

      类似于solutionhasen j,但使用递归函数来遍历文档。

      function findParentForm(element) {
          if (element.parentNode.tagName.toLowerCase() == 'html') {
              throw('No Parent Form Found');
          } else if (element.parentNode.tagName.toLowerCase() == 'form') {
              return element.parentNode;
          } else {
              return findParentForm(element.parentNode);
          }
      }
      

      当然还有形式……

      <form>
          <ul>
              <li>
                  <p>
                      The link could be <span>embedded <a href="" onclick="findParentForm(this).submit(); return false;">at any level</a></span>
                      in the form, so "this.parentNode.parentNode..." is no good. :(
                  </p>
              </li>
          </ul>
      </form>
      

      【讨论】:

      • 你有理由使用递归而不是循环吗?递归的开销不会更大吗? (在这个级别上显然可以忽略不计,但仍然?)
      • 不确定效率。用萤火虫测试并不难。我在看到 hasan j 的答案之前写了这个例子。我很惊讶他的工作(测试确实如此)并且很高兴学到了一些东西,但我想我也会发布我的。
      【解决方案9】:

      您应该使用按钮(以及输入或提交类型的按钮)来提交表单。

      如果您需要链接具有但输入元素没有的任何附加功能(例如悬停),那么使用 javascript 实现这些功能比提交表单更容易。对于没有 javascript 的人来说,它也会更优雅地降级。

      您甚至可以使用特定于 MSIE 的代码来解决这个问题(并将 :hover 用于其他浏览器):

      <input type="submit" value="send" class="linkstyles"
             onmouseenter="this.className+=' hovered';"
             onmouseleave="this.className=this.className.replace(/(^|\s)hovered(\s|$)/g, '');" />
      

      如果您仍然真的很想倒退,那么我不会这样做:

      function submitByLink ( elm ) {
        // Move up domtree until we hit no parentNode or find a form
        while (elm) {
          elm = elm.parentNode;
          if (elm && elm.tagName == 'FORM') {
            // First chance we get, we submit the form and exit.
            // The return on the node it kills the event bubble by forwarding false to browser
            elm.submit(); 
            return false;
          }
        }
        // If we got here then there is no form parent and user will be sent to link href
      }
      

      HTML 看起来像这样:

      <a href="aPageExplainingWhyYouNeedJavascript.html" onclick="return submitByLink(this);">Send</a>
      

      【讨论】:

        【解决方案10】:

        就个人而言,我更喜欢在 href 中使用 javascript: 协议而不是使用 onclick 事件...如果有任何问题,我很乐意得到纠正。

        如果页面中只有一个表单,这是很常见的情况,您可以这样做:

        <li><p><a href="javascript:document.forms[0].submit();">Click here to submit</a></p></li>
        

        否则,像上面那样冒泡元素是一种解决方案。

        [编辑] 我保留答案,即使它被否决,作为参考(cmets 中给出的信息很有趣)。
        协议技术的另一个缺点:它不生成事件对象。我给的 sn-p 没有问题,但调用处理程序时很烦人。

        【讨论】:

        • documents.forms[0] 是什么?如果在此之前的页面上有多个表单,那不是完全错误吗?
        • 这就是我写的:只有当你确定只有一种形式时它才是可靠的。
        • javascript 伪协议会触发意外行为(通常没有新图像/死脚本线程),它在 HTTPS 模式下的 IE 上存在安全问题,不包含返回可能会重定向到奇怪的地方(尝试“javascript:document.body.style.display='block';”)。非 JS 用户也失败了。
        • @Borgar:感谢提醒,这很有趣。因此,在 https 和带值的表达式之外(我也避免使用,比如书签),应该没问题......无论如何,非 JS 用户的失败也适用于其他形式。
        • javascript: click 上没有事件的原因是浏览器认为你正在离开页面,因此关闭了服务。为避免这种混乱,我建议坚持使用 onclick(小书签除外)。 :-)
        【解决方案11】:
        $(document).ready(function(){$('#submit').click(function(){$('#signup').submit();});});
        

        使用 Jquery,我们检查文档是否已加载,然后等待单击 id 为“提交”的锚标记。然后,它会提交 id 为“signup”的表单。更改“提交”和“注册”以适应。

        【讨论】:

          【解决方案12】:

          继续上面How best to make a link submit a form的答案,我最近一直在做的方式是

          <button class="submit" type="submit"><a href="#" onclick="return false;">Link Text</a></button>
          

          和 CSS

          .submit {
              background: transparent;
              border:0;
              display: inline;
              margin: 0;
              padding: 0;
              cursor:pointer;
          }
          .submit a 
          {
              color: #CEA249;
          }
          .submit:hover a
          {
              color: white;
          }
          

          我发布此内容是因为我找不到完成的 html / css 示例。如果有人有任何改进会更新。

          【讨论】:

            【解决方案13】:
            <form>
            <input type="submit" id="submit" style="display:none;"/>
            <a href="#" onclick="$('#submit').click();">Sample Submit Trick</a> 
            </form>
            

            【讨论】:

              猜你喜欢
              • 2014-06-12
              • 1970-01-01
              • 2011-10-11
              • 2011-05-16
              • 2013-08-02
              • 2019-08-25
              • 2019-11-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多