Я не впевнений, чи можливо це навіть можливо. Але мені було цікаво, чи хтось знає, як змусити гіперпосилання передавати деякі змінні та використовувати POST (як форму) на відміну від GET.
Я не впевнений, чи можливо це навіть можливо. Але мені було цікаво, чи хтось знає, як змусити гіперпосилання передавати деякі змінні та використовувати POST (як форму) на відміну від GET.
Відповіді:
Ви створюєте форму із прихованими входами, які містять значення для публікації, встановлюєте дію форми на URL-адресу призначення та метод форми для публікації . Потім, після натискання на ваше посилання, запустіть функцію JS, яка подає форму.
Дивіться тут , для прикладу. У цьому прикладі використовується чистий 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>
GET
? У нас було get
без форми, чи не так?
Для цього вам не потрібен 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, який ви використовуєте, може відрізнятися залежно від способу оформлення регулярних посилань на вашому сайті.
Ви можете використовувати функції JavaScript. У JQuery вбудована функція приємного повідомлення, якщо ви вирішили використовувати її:
<script language="javascript">
function DoPost(){
$.post("WhateverPage.php", { name: "John", time: "2pm" } ); //Your values here..
}
</script>
<a href="javascript:DoPost()">Click Here</A>
$.post('page.php', {param: 1}, function() { window.location.href = 'page'.php' });
<a href="whyjavascript.html" id="postIt">Click Here</a>
і мати$("#postIt").on("click",function(e) { e.preventDefault(); $.post("WhateverPage.php", { name: "John", time: "2pm" } ); });
Це старе запитання, але жодна з відповідей не задовольняє запит у повному обсязі. Тож я додаю ще одну відповідь.
Запитаний код, наскільки я розумію, повинен внести лише одну зміну в спосіб роботи звичайних гіперпосилань: POST
замість цього слід використовувати метод GET
. Безпосередніми наслідками будуть:
href
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>
Ще один робочий приклад, використовуючи подібний підхід, розміщений: створити HTML-форму, використовувати JavaScript для імітації публікації. Це робить 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();
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>
(наприклад, a <span>
або зображення).
Ви можете використовувати цю функцію 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/ )
Як згадується в багатьох публікаціях, це не можливо безпосередньо, але простий і успішний спосіб полягає в наступному: По-перше, ми розміщуємо форму в тілі нашої 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>
Я пропоную більш динамічний підхід, без кодування 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()
})
Замість використання 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>
Перевірте це, це вам допоможе
$().redirect('test.php', {'a': 'value1', 'b': 'value2'});