【问题标题】:Make a link use POST instead of GET使链接使用 POST 而不是 GET
【发布时间】:2011-04-24 08:59:45
【问题描述】:

我不确定这是否可能。但我想知道是否有人知道如何让超链接传递一些变量并使用 POST(如表单)而不是 GET。

【问题讨论】:

  • HTML 无法做到这一点。如果您无法更改 HTML,JavaScript 可以捕获链接上的点击事件并执行您想要的操作,如果只是外观问题,CSS 可以像链接一样设置按钮样式。
  • 是的,HTML不能做到这一点。答案都建议使用带有提交按钮的<form>,该按钮的样式看起来像一个链接。正如问题所问的那样,使用 http POST 方法创建实际链接是不可能的。

标签: javascript html http


【解决方案1】:

您不需要 JavaScript。 只是想澄清一下,因为截至发布此答案时,所有此问题的答案涉及以某种方式使用 JavaScript。

你可以很容易地做到这一点使用纯 HTML 和 CSS,方法是创建一个包含要提交的数据的隐藏字段的表单,然后将表单的提交按钮设置为看起来像一个链接。

例如:

.inline {
  display: inline;
}

.link-button {
  background: none;
  border: none;
  color: blue;
  text-decoration: underline;
  cursor: pointer;
  font-size: 1em;
  font-family: serif;
}
.link-button:focus {
  outline: none;
}
.link-button:active {
  color:red;
}
<a href="some_page">This is a regular link</a>

<form method="post" action="some_page" class="inline">
  <input type="hidden" name="extra_submit_param" value="extra_submit_value">
  <button type="submit" name="submit_param" value="submit_value" class="link-button">
    This is a link that sends a POST request
  </button>
</form>

您使用的确切 CSS 可能会有所不同,具体取决于您网站上常规链接的样式。

【讨论】:

【解决方案2】:

您创建一个带有隐藏输入的表单,其中包含要发布的值,将表单的 action 设置为目标 url,并将表单方法设置为 post。然后,当你的链接被点击时,触发一个提交表单的 JS 函数。

例如,请参阅here。这个例子使用纯 JavaScript,没有 jQuery——如果你不想安装任何你已经拥有的东西,你可以选择这个。

<form name="myform" action="handle-data.php" method="post">
  <label for="query">Search:</label>
  <input type="text" name="query" id="query"/>
  <button>Search</button>
</form>

<script>
var button = document.querySelector('form[name="myform"] > button');
button.addEventListener(function() {
  document.querySelector("form[name="myform"]").submit();
});
</script>

【讨论】:

  • 如果没有 javascript,您将无法发送 A POST。只有一个表单可以做到这一点(或者 AJAX 或 JS)。所以这是一个解决方法:创建一个隐藏表单,并让 A 链接通过 JS 提交。
  • 我更新了您的答案以使用更现代的方法。如果您不同意,请随时回滚此修改。
  • 您可以使用类似的策略,将表单设置为页面其他位置的display:none;
  • 没有理由在这个过程中涉及到 Javascript。为什么这是公认的答案?
  • @shacker 因为这两个答案都不完美。如果您已经在使用 JS(可能是 OP),那么这比尝试使用 CSS 将按钮重新装饰为链接并发现您错过了在 SuperBrowser 时取消设置 button 样式要好得多V1.2 出来了。
【解决方案3】:

您可以使用 javascript 函数。如果您决定使用 JQuery,它内置了一个不错的 post 功能:

JQuery Post

<script language="javascript"> 

   function DoPost(){
      $.post("WhateverPage.php", { name: "John", time: "2pm" } );  //Your values here..
   }

</script>


<a href="javascript:DoPost()">Click Here</A> 

【讨论】:

  • 这确实会按照要求发出 POST 请求,但我无法使用它,因为我仍然需要转到“Whatever.php”位置。
  • $.post('page.php', {param: 1}, function() { window.location.href = 'page'.php' });
  • @mplungjan href 说明了链接所指的位置,而我同意混淆行为和内容是错误的,在这种情况下,javascript is 是引用。换句话说,“当您单击链接时,它将使用 JavaScript 执行回发”。这比绑定点击事件更有意义。像“永远不要在 href 中使用 javascript”这样的硬规则与任何其他不良做法一样糟糕。
  • @Menol 我说:不推荐。 - 不是“永远不要使用”。如果你真的想你可以&lt;a href="whyjavascript.html" id="postIt"&gt;Click Here&lt;/a&gt;$("#postIt").on("click",function(e) { e.preventDefault(); $.post("WhateverPage.php", { name: "John", time: "2pm" } ); });
  • @mplungjan 像其他任何推荐一样被引入以避免混淆内容/行为。当在超出预期范围的情况下提出建议时,它开始显示为硬性规则。您给出的示例似乎只是为了“规则”的安全方面而加倍努力,因此将来没有人可以责怪程序员,但是实现了这个安全以牺牲可读性和意义为代价。这只是其他务实的开发人员的看法,但我敢肯定你不是那个意思。
【解决方案4】:

这是一个老问题,但没有一个答案能完全满足要求。所以我要添加另一个答案。

据我所知,请求的代码应该只对普通超链接的工作方式进行一项更改:应该使用POST 方法而不是GET。直接影响是:

  1. 点击链接时,我们应该将标签重新加载到href的url
  2. 由于方法是POST,所以我们加载的目标页面的URL中应该没有查询字符串
  3. 该页面应该通过POST接收参数(名称和值)中的数据

我在这里使用 jquery,但这可以使用原生 api 来完成(当然更难也更长)。

<html>
<head>
    <script src="path/to/jquery.min.js" type="text/javascript"></script>
    <script>
        $(document).ready(function() {

            $("a.post").click(function(e) {
                e.stopPropagation();
                e.preventDefault();
                var href = this.href;
                var parts = href.split('?');
                var url = parts[0];
                var params = parts[1].split('&');
                var pp, inputs = '';
                for(var i = 0, n = params.length; i < n; i++) {
                    pp = params[i].split('=');
                    inputs += '<input type="hidden" name="' + pp[0] + '" value="' + pp[1] + '" />';
                }
                $("body").append('<form action="'+url+'" method="post" id="poster">'+inputs+'</form>');
                $("#poster").submit();
            });
        });
    </script>
</head>
<body>
    <a class="post" href="reflector.php?color=blue&weight=340&model=x-12&price=14.800">Post it!</a><br/>
    <a href="reflector.php?color=blue&weight=340&model=x-12&price=14.800">Normal link</a>
</body>
</html>

要查看结果,请将以下内容另存为 reflector.php,并保存在与上述文件相同的目录中。

<h2>Get</h2>
<pre>
<?php print_r($_GET); ?>
</pre>

<h2>Post</h2>
<pre>
<?php print_r($_POST); ?>
</pre>

【讨论】:

    【解决方案5】:

    另一个工作示例,使用类似的方法发布:创建一个 html 表单,使用 javascript 模拟发布。这做了两件事:将数据发布到新页面并在新窗口/标签中打开。

    HTML

    <form name='myForm' target="_blank" action='newpage.html' method='post'>
    <input type="hidden" name="thisIsTheParameterName" value="testDataToBePosted"/>
    </form>
    

    JavaScript

    document.forms["myForm"].submit();
    

    【讨论】:

      【解决方案6】:

      HTML + JQuery:使用 POST 提交隐藏表单的链接。

      由于我花了很多时间来理解所有这些答案,而且它们都有一些有趣的细节,所以这里是最终对我有用的组合版本,我更喜欢它的简单性。

      我的方法是再次创建一个隐藏表单并通过单击页面中其他位置的链接来提交它。将表单放置在页面正文的哪个位置并不重要。

      表单代码:

      <form id="myHiddenFormId" action="myAction.php" method="post" style="display: none">
        <input type="hidden" name="myParameterName" value="myParameterValue">
      </form>
      

      说明:

      display: none 隐藏表单。您也可以将其放在 div 或其他元素中,并在元素上设置 display: none

      type="hidden" 将创建一个不会显示的字段,但其数据将传输到操作(see W3C)。我知道这是最简单的输入类型。

      链接代码:

      <a href="" onclick="$('#myHiddenFormId').submit(); return false;" title="My link title">My link text</a>
      

      说明:

      空的href 只是targets the same page。但在这种情况下这并不重要,因为return false 将阻止浏览器跟踪链接。当然,您可能希望更改此行为。在我的具体情况下,该操作最后包含重定向。

      onclick 用于避免将href="javascript:..." 用作noted by mplungjan$('#myHiddenFormId').submit(); 用于提交表单(而不是定义函数,因为代码非常小)。

      此链接看起来与任何其他 &lt;a&gt; 元素完全相同。您实际上可以使用任何其他元素来代替 &lt;a&gt;(例如 &lt;span&gt; 或图像)。

      【讨论】:

        【解决方案7】:

        你可以使用这个jQuery函数

        function makePostRequest(url, data) {
            var jForm = $('<form></form>');
            jForm.attr('action', url);
            jForm.attr('method', 'post');
            for (name in data) {
                var jInput = $("<input>");
                jInput.attr('name', name);
                jInput.attr('value', data[name]);
                jForm.append(jInput);
            }
            jForm.submit();
        }
        

        这是 jsFiddle 中的一个示例 (http://jsfiddle.net/S7zUm/)

        【讨论】:

        • @DaoLam 代码确实有效。我用leserged.free.fr/phpinfo.php 替换了phpref 中的值,并将表单发布到传递值的那个站点。
        【解决方案8】:

        正如许多帖子中提到的,这不是直接可能的,但是一个简单而成功的方法如下: 首先,我们在 html 页面的主体中放置了一个表单,它没有任何提交按钮,并且它的输入也被隐藏了。 然后我们使用 javascript 函数来获取数据并发送表单。这种方法的优点之一是重定向到其他页面,这取决于服务器端代码。 代码如下: 现在在任何你需要使用“POST”方法的地方:

        <script type="text/javascript" language="javascript">
        function post_link(data){
        
            $('#post_form').find('#form_input').val(data);
            $('#post_form').submit();
        };
        </script>
        
           <form id="post_form" action="anywhere/you/want/" method="POST">
         {% csrf_token %}
            <input id="form_input" type="hidden" value="" name="form_input">
        </form>
        
        <a href="javascript:{}" onclick="javascript:post_link('data');">post link is ready</a>
        

        【讨论】:

          【解决方案9】:

          除了使用 javascript,您还可以使用发送隐藏表单的标签。非常简单和小的解决方案。标签可以在您的 html 中的任何位置。

          <form style="display: none" action="postUrl" method="post">
            <button type="submit" id="button_to_link"> </button>
          </form>
          <label style="text-decoration: underline" for="button_to_link">  link that posts </label>

          【讨论】:

          • 这个解决方案是我最终使用的。不需要 JavaScript 是一个优点。
          【解决方案10】:

          我建议更动态的方法,页面不用html编码,严格保持JS:

          $("a.AS-POST").on('click', e => {
            e.preventDefault()
            let frm = document.createElement('FORM')
            frm.id='frm_'+Math.random()
            frm.method='POST'
            frm.action=e.target.href
            document.body.appendChild(frm)
            frm.submit()
          })
          

          【讨论】:

            【解决方案11】:

            勾选这个对你有帮助

            $().redirect('test.php', {'a': 'value1', 'b': 'value2'});
            

            【讨论】:

            猜你喜欢
            • 2018-01-09
            • 2011-08-04
            • 2010-09-07
            • 1970-01-01
            • 2016-12-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多