【问题标题】:How can I submit a POST form using the <a href="..."> tag?如何使用 <a href="..."> 标签提交 POST 表单?
【发布时间】:2011-12-31 10:14:06
【问题描述】:

如何仅使用&lt;a href="..."&gt; 标签向showMessage.jsp 提交POST 表单?

<form action="showMessage.jsp" method="post">
    <a href="showMessage.jsp"><%=n%></a>
    <input type="hidden" name="mess" value=<%=n%>/>
</form>

【问题讨论】:

标签: html forms jsp


【解决方案1】:

如果您使用按钮,则无需 JavaScript:

<form action="your_url" method="post">
    <button type="submit" name="your_name" value="your_value" class="btn-link">Go</button>
</form>

您可以style a button to look like a link,例如:

.btn-link {
    border: none;
    outline: none;
    background: none;
    cursor: pointer;
    color: #0000EE;
    padding: 0;
    text-decoration: underline;
    font-family: inherit;
    font-size: inherit;
}

【讨论】:

  • 因为你的“方法”没有使用a标签。
  • 一切都很好,但您仍然选择回答与被问到不同的问题。鉴于可擦墨水实际上是一种工业规模生产的可行产品......
  • FWIW,我对您的回答表示同情,这是我个人宁愿在我必须维护的网络应用程序中看到的内容。我只是在解释反对票——顺便说一句,我没有离开。 ;)
  • class="btn btn-link" 用于引导
  • 完美满足我的需求!
【解决方案2】:

您需要为此使用 javascript。

<form id="form1" action="showMessage.jsp" method="post">
    <a href="javascript:;" onclick="document.getElementById('form1').submit();"><%=n%></a>
    <input type="hidden" name="mess" value=<%=n%>/>
</form>

【讨论】:

    【解决方案3】:

    您必须在您的 form 对象上使用 Javascript submit 函数。看看其他 functions

    <form action="showMessage.jsp" method="post">
        <a href="javascript:;" onclick="parentNode.submit();"><%=n%></a>
        <input type="hidden" name="mess" value=<%=n%>/>
    </form>
    

    【讨论】:

    • 表单元素不一定总是锚标签的父节点。
    【解决方案4】:

    如果你使用 MVC 来完成它 - 你将不得不做这样的事情

     <form action="/ControllerName/ActionName" method="post">
            <a href="javascript:;" onclick="parentNode.submit();"><%=n%></a>
            <input type="hidden" name="mess" value=<%=n%>/>
        </form>
    

    我只是在这里浏览了一些示例,并没有看到 MVC 认为发布它不会有什么坏处。

    然后在控制器中的操作上,我只需将&lt;HTTPPost&gt; 放在它的顶部。 我相信,如果您没有在其顶部添加&lt;HTTPGET&gt;,它仍然可以工作,但明确地将其放在那里感觉更安全。

    【讨论】:

      【解决方案5】:

      似乎没有办法将&lt;a href= .. 欺骗成 POST 方法。但是,鉴于您可以访问页面的 CSS,这可以通过使用表单来代替。

      不幸的是,在 CSS 中将按钮样式设置为锚标记的明显方式不兼容跨浏览器,因为不同的浏览器对待 &lt;button value= ... 的方式不同。

      Incorrect:
      
      <form action='actbusy.php' method='post'>
        <button type='submit' name='parameter' value='One'>Two</button>
      </form>
      

      上面的例子将在 FireFox 中显示“Two”并传输“parameter:One”,而在 IE8 中将显示“One”并同时传输“parameter:One”。

      解决方法是使用隐藏的输入字段来传递数据并使用按钮来提交数据。

      <form action='actbusy.php' method='post'>
         <input class=hidden name='parameter' value='blaah'>
         <button type='submit' name='delete' value='Delete'>Delete</button>
      </form>
      

      请注意,此方法有一个副作用,即除了 'parameter:blaah' 之外,它还会在 POST 中将 'delete:Delete' 作为多余参数传递。

      您希望为按钮保持标签之间的值属性和按钮标签相同(在这种情况下为“删除”),因为(如上所述)一些浏览器将显示一个,而另一些浏览器将另一个显示为按钮标签。

      【讨论】:

      • 你确定 IE8 能做到吗?刚刚在 IE7 中尝试了&lt;button value="Bad"&gt;Good&lt;/button&gt;,它显示“Good”。
      【解决方案6】:

      我使用 jQuery 脚本为我的 POSTable 链接创建“影子”表单。

      我写的是&lt;a data-post="/some/action" data-var-foo="bar" href="#do_action_foo_bar"&gt;,而不是&lt;a href="/some/action?foo=bar"&gt;。该脚本创建一个带有隐藏输入的隐藏表单,并在单击链接时提交。

      $("a[data-post]")
          .each(function() {
              let href = $(this).data("post"); if (!href) return;
              let $form = $("<form></form>").attr({ method:"POST",action:href }).css("display","none")
              let data = $(this).data()
              for (let dat in data) {
                  if (dat.startsWith("postVar")) {
                      let varname = dat.substring(7).toLowerCase()  // postVarId -> id
                      let varval = data[dat]
                      $form.append($("<input/>").attr({ type:"hidden",name:varname,value:varval }))
                  }
              }
              $("body").append($form)
              $(this).data("postform",$form)
          })
          .click(function(ev) {
              ev.preventDefault()
              if ($(this).data("postform")) $(this).data("postform").submit(); else console.error("No .postform set in <a data-post>")
          })
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <a data-post="/some/action" data-var-foo="bar" href="#do_action_foo_bar">click me</a>

      【讨论】:

        【解决方案7】:

        如果您使用的是 express/node.js,一个很好的覆盖 http 函数的方法是使用 npm 包方法覆盖。 Method-override example.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-19
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 2019-10-17
          相关资源
          最近更新 更多