ทำให้ลิงก์ใช้ POST แทน GET


204

ฉันไม่แน่ใจว่าสิ่งนี้เป็นไปได้หรือไม่ แต่ฉันสงสัยว่าถ้าใครรู้วิธีสร้างไฮเปอร์ลิงก์ผ่านตัวแปรบางตัวและใช้ POST (เหมือนรูปแบบ) ซึ่งต่างจาก GET


HTML ไม่สามารถทำได้ JavaScript สามารถจับคลิกเหตุการณ์บนลิงก์และทำสิ่งที่คุณต้องการหากคุณไม่สามารถเปลี่ยน HTML และ CSS สามารถกำหนดลักษณะปุ่มเช่นลิงก์หากเป็นเรื่องของลักษณะที่ปรากฏ
sylvain

คำตอบ:


98

คุณสร้างแบบฟอร์มที่มีปัจจัยการผลิตที่ซ่อนที่เก็บค่าที่จะโพสต์ตั้งค่าการกระทำของแบบฟอร์มไปยัง URL ปลายทางและวิธีการแบบฟอร์มเพื่อโพสต์ จากนั้นเมื่อคลิกลิงก์ของคุณให้เรียกใช้ฟังก์ชัน JS ที่ส่งแบบฟอร์ม

ดูที่นี่สำหรับตัวอย่าง ตัวอย่างนี้ใช้จาวาสคริปต์แท้โดยไม่มี 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>

16
ทำไมนี่เป็นคำตอบที่ยอมรับได้? คำถามนี้ถามถึงการใช้งาน POST (เช่นแบบฟอร์ม) โดยเฉพาะเมื่อเทียบกับ GETแต่คำตอบนี้บอกว่า " ตั้งค่าการดำเนินการไปยัง URL ปลายทางและวิธีการรับ "
Majid Fouladpour

3
ฉันเข้าใจ. สิ่งที่ฉันไม่เข้าใจคือสิ่งนี้: เราเข้าสู่ปัญหาในการสร้างแบบฟอร์มที่ซ่อนอยู่เพื่อให้เราสามารถโพสต์ แต่หลังจากนั้นสร้างแบบฟอร์มแล้วทำไมคุณเสนอให้ตั้งวิธีเป็นGET? เราgetไม่มีแบบฟอร์มใช่มั้ย
Majid Fouladpour

3
คุณพูดถูก นั่นเป็นข้อผิดพลาด แต่อย่างใด OP ก็ยังทำให้ถูกต้อง (อาจเป็นเพราะลิงก์ที่รวมไว้ซึ่งมีความชัดเจนมาก) ขอบคุณสำหรับการชี้ให้เห็น ฉันใช้ถ้อยคำใหม่ทั้งหมด
Palantir

3
ฉันอัพเดตคำตอบของคุณเพื่อใช้วิธีการที่ทันสมัยกว่านี้ หากคุณไม่เห็นด้วยคุณสามารถย้อนกลับการแก้ไขนี้ได้
MichałPerłakowski

3
ไม่มีเหตุผลที่จะเกี่ยวข้องกับ Javascript ในกระบวนการนี้ ทำไมนี่เป็นคำตอบที่ยอมรับได้?
shacker

322

คุณไม่จำเป็นต้องใช้ 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 ที่แน่นอนที่คุณใช้อาจแตกต่างกันไปขึ้นอยู่กับการเชื่อมโยงปกติบนไซต์ของคุณ


4
ตกลง ฉันต้องการวิธีการทำเช่นนี้ในอีเมลดังนั้น JS จึงไม่ค่อยเป็นตัวเลือกสำหรับฉัน สิ่งนี้จะทำงานได้อย่างสมบูรณ์
SynackSA

7
ฉันสามารถโหวตได้เพียงครั้งเดียวเท่านั้น นั่นเป็นเรื่องที่น่าเศร้าเกือบเท่ากับข้อเท็จจริงที่ว่า 99.728% ของคำถาม HTML ทั้งหมดจะทำให้สับสนกับปัญหา Javascript หรือ jQuery
Rab

3
นี่เป็นวิธีที่ง่ายในการใช้ปุ่มที่ดูเหมือนลิงค์ แต่จริงๆแล้วเป็นการเข้ารหัสยาก คุณต้องรู้เงื่อนไขที่แน่นอนว่าปุ่มนี้จะมีชีวิตอยู่และตั้งค่าอย่างชัดเจนสำหรับทุกกรณี ฉันคิดว่าคำตอบที่ใช้ JS / JQuery นั้นเป็นคำทั่วไปมากกว่าเนื่องจากพวกเขาใช้องค์ประกอบลิงก์เอง (หรือองค์ประกอบใดก็ตาม)
MakisH

2
@ Ajedi32 ขออภัยความคิดเห็นของฉันยังไม่ชัดเจน: ฉันส่วนใหญ่พยายามที่จะบอกว่าปุ่มนี้มีสไตล์โดยเฉพาะเพื่อให้ดูเหมือนองค์ประกอบ <a> แต่ถ้าคุณใส่ปุ่มรอบองค์ประกอบ <a> อื่น ๆ ที่มีสไตล์แตกต่างกันเช่นในส่วนต่าง ๆ ของหน้าคุณจะต้องทำซ้ำกฎ css ทั้งหมดของ <a> เช่นเดียวกับปุ่มเพื่อสร้างกฎสำหรับโฮเวอร์เยี่ยมชม ฯลฯ มิฉะนั้นมันจะทำงานแน่นอน แต่มันจะดูน่าเกลียด ด้วยโซลูชันอื่น ๆ ที่คุณไม่จำเป็นต้องเปลี่ยน CSS คุณจะได้รับ <a> องค์ประกอบเหมือนกับที่คุณมีอยู่แล้ว แน่นอนว่า HTML ล้วนๆก็มีข้อดีอยู่บ้าง
MakisH

1
@Robert AFAIK ไม่มีวิธีการแก้ปัญหาใด ๆ ที่นำเสนอทำงานร่วมกับคลิกกลางอย่างใดอย่างหนึ่ง หากคุณต้องการหยิ่งยะโสจริงๆคุณอาจพูดได้ว่าการส่งคำขอ POST พร้อมลิงก์นั้นเป็นไปไม่ได้ คุณสามารถส่งคำขอ POST ด้วยแบบฟอร์มและ JavaScript
Ajedi32

48

คุณสามารถใช้ฟังก์ชั่นจาวาสคริปต์ JQuery มีฟังก์ชั่นโพสต์ที่ดีในตัวหากคุณตัดสินใจใช้:

โพสต์ JQuery

<script language="javascript"> 

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

</script>


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

5
สิ่งนี้ทำให้คำขอ POST ตามที่ถาม แต่ฉันไม่สามารถใช้สิ่งนี้ได้เพราะฉันยังต้องไปที่ตำแหน่ง "Anything.php"
Chris

6
$.post('page.php', {param: 1}, function() { window.location.href = 'page'.php' });
JREAM

1
@mplungjan href บอกว่าลิงก์นั้นอ้างถึงที่ใดในขณะที่ฉันยอมรับว่ามันเป็นการผิดที่ทำให้เกิดความสับสนในพฤติกรรมและเนื้อหาในกรณีนี้จาวาสคริปต์คือการอ้างอิง กล่าวอีกนัยหนึ่ง "เมื่อคุณคลิกลิงค์มันจะทำการ postback โดยใช้ JavaScript" สิ่งนี้มีความหมายมากกว่าการผูกเหตุการณ์คลิก กฎอย่างหนักเช่น "ไม่เคยใช้จาวาสคริปต์ใน href" ไม่ดีเท่าการปฏิบัติที่ไม่ดีอื่น ๆ
Menol

@ Menol ฉันพูดว่า: ไม่แนะนำ - ไม่ใช่ "ไม่เคยใช้" หากคุณต้องการที่จะทำ<a href="whyjavascript.html" id="postIt">Click Here</a>และมี$("#postIt").on("click",function(e) { e.preventDefault(); $.post("WhateverPage.php", { name: "John", time: "2pm" } ); });
mplungjan

1
@mplungjan มีการแนะนำคำแนะนำแบบอื่น ๆ เพื่อหลีกเลี่ยงความสับสนในเนื้อหา / พฤติกรรม เมื่อข้อเสนอแนะถูกนำไปข้างหน้าในกรณีที่อยู่นอกขอบเขตมันตั้งใจจะเริ่มปรากฏเป็นกฎ ตัวอย่างที่คุณให้ดูเหมือนจะเพิ่มขึ้นเป็นไมล์เพื่อความปลอดภัยของ "กฎ"เพื่อให้ไม่มีใครสามารถตำหนิโปรแกรมเมอร์ในอนาคต แต่ความปลอดภัยนี้เกิดขึ้นได้ด้วยค่าใช้จ่ายในการอ่านและความหมาย มันเป็นเพียงแค่สิ่งที่ปรากฏแก่ผู้พัฒนาที่จริงจังคนอื่น แต่ฉันแน่ใจว่าคุณไม่ได้หมายความอย่างนั้น
Menol

24

นี่เป็นคำถามเก่า แต่ไม่มีคำตอบใดที่ตรงตามคำขอทั้งหมด ดังนั้นฉันจึงเพิ่มคำตอบอีก

รหัสร้องขอที่ผมเข้าใจควรทำเพียงหนึ่งเปลี่ยนแปลงวิธีการทำงานเชื่อมโยงหลายมิติปกติคือวิธีการที่ควรจะนำมาใช้แทนPOST GETผลกระทบทันทีจะเป็น:

  1. เมื่อมีการคลิกลิงก์เราควรโหลดแท็บนั้นไปยัง URL ของ href
  2. เนื่องจากวิธีการคือ POST เราไม่ควรมีสตริงการสืบค้นใน URL ของหน้าเป้าหมายที่เราโหลด
  3. หน้านั้นควรได้รับข้อมูลในพารามิเตอร์ (ชื่อและค่า) โดย POST

ฉันกำลังใช้ jQuery ที่นี่ แต่สามารถทำได้ด้วย apis พื้นเมือง (ยากขึ้นและยาวนานขึ้น)

<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>

12

อีกตัวอย่างการทำงานโดยใช้วิธีการที่คล้ายกันโพสต์: สร้างรูปแบบ html ใช้จาวาสคริปต์เพื่อจำลองการโพสต์ สิ่งนี้ทำได้ 2 อย่าง: โพสต์ข้อมูลไปยังหน้าใหม่และเปิดในหน้าต่าง / แท็บใหม่

HTML

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

JavaScript

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

3

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"จะสร้าง fild ที่จะไม่ถูกแสดงให้เห็น แต่ข้อมูลจะถูกส่งไปยัง eitherways การกระทำ ( ดู W3C ) ฉันเข้าใจว่านี่เป็นประเภทอินพุตที่ง่ายที่สุด

รหัสสำหรับลิงค์:

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

รายละเอียด:

ที่ว่างเปล่าhrefเพียงเป้าหมายหน้าเดียวกัน แต่มันไม่สำคัญในกรณีนี้เนื่องจากreturn falseจะหยุดเบราว์เซอร์จากการติดตามลิงก์ คุณอาจต้องการเปลี่ยนพฤติกรรมนี้แน่นอน ในกรณีเฉพาะของฉันการดำเนินการมีการเปลี่ยนเส้นทางในตอนท้าย

onclickถูกใช้ในการหลีกเลี่ยงการใช้href="javascript:..."เป็นที่สังเกตจาก mplungjan $('#myHiddenFormId').submit();ถูกใช้ในการส่งแบบฟอร์ม (แทนการกำหนดฟังก์ชั่นตั้งแต่รหัสที่มีขนาดเล็กมาก)

ลิงค์นี้จะมีลักษณะเหมือนกับ<a>องค์ประกอบอื่น ๆ คุณสามารถใช้องค์ประกอบอื่น ๆ แทน<a>(ตัวอย่างเช่น<span>หรือรูปภาพ)


2

คุณสามารถใช้ฟังก์ชัน 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 และมันโพสต์แบบฟอร์มไปยังเว็บไซต์นั้นผ่านในค่า
JSWilson

2

ดังที่กล่าวไว้ในโพสต์จำนวนมากสิ่งนี้เป็นไปไม่ได้โดยตรง แต่วิธีที่ง่ายและประสบความสำเร็จมีดังนี้: อันดับแรกเราใส่แบบฟอร์มลงในเนื้อความของหน้า html ของเราซึ่งไม่มีปุ่มใด ๆ สำหรับการส่งและอินพุต ถูกซ่อนอยู่ จากนั้นเราใช้ฟังก์ชันจาวาสคริปต์เพื่อรับข้อมูลและส่งแบบฟอร์ม ข้อดีอย่างหนึ่งของวิธีนี้คือการเปลี่ยนเส้นทางไปยังหน้าอื่นซึ่งขึ้นอยู่กับรหัสฝั่งเซิร์ฟเวอร์ รหัสมีดังนี้: และตอนนี้ในทุกที่ที่คุณต้องการจะอยู่ในวิธีการ "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>

1

ฉันขอแนะนำวิธีการแบบไดนามิกมากขึ้นโดยไม่ต้องเขียนโค้ด 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()
})

0

แทนที่จะใช้ 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>


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.