Javascript Submit не включает значение кнопки Submit. - PullRequest
24 голосов
/ 10 ноября 2009

Хорошо, это не вопрос, а вопрос только для моей информации (потому что я могу вспомнить о 4 различных обходных путях, которые заставят его работать. Но у меня есть форма (ничего особенного), но кнопка отправки имеет определенное значение, связанное с ним.

<input type='submit' name='submitDocUpdate' value='Save'/>

И когда форма отправляется, я проверяю это имя.

if(isset($_POST['submitDocUpdate'])){ //do stuff

Однако однажды я пытаюсь отправить форму с помощью Javascript, а не кнопки отправки.

document.getElementById("myForm").submit();

Который работает нормально, кроме 1 проблемы. Когда я смотрю на значения $ _POST, которые передаются с помощью метода javascript, он не включает submitDocUpdate. Я получаю все остальные значения формы, но не значение кнопки отправки.

Как я уже сказал, я могу придумать несколько способов обойти это (использовать скрытую переменную, проверить isset для другой переменной формы и т. Д.), Но мне просто интересно, является ли это правильным поведением submit (), потому что это кажется мне менее интуитивным. Заранее спасибо.

Ответы [ 7 ]

30 голосов
/ 10 ноября 2009

Да, это правильное поведение HTMLFormElement.submit()

Причина, по которой ваше значение кнопки отправки не отправлено, заключается в том, что HTML-формы разработаны таким образом, что они отправляют значение кнопки отправки, которая была нажата (или иным образом активирована). Это позволяет использовать несколько кнопок отправки для каждой формы, например, в сценарии, в котором требуется действие «Предварительный просмотр» и «Сохранить».

Поскольку вы отправляете форму программным способом, для отдельной кнопки отправки не существует явного действия пользователя, поэтому ничего не отправляется.

11 голосов
/ 09 июля 2011

Использование версии jQuery 1.0 или выше:

$('input[type="submit"]').click();

Я действительно работал над той же проблемой, когда наткнулся на этот пост. click () без аргументов запускает событие click для любых выбранных вами элементов: http://api.jquery.com/click/

7 голосов
/ 10 ноября 2009

Почему бы не использовать следующее вместо этого?

<input type="hidden" name="submitDocUpdate" value="Save" />
2 голосов
/ 12 апреля 2018

Понимание поведения хорошо, но вот ответ с некоторым кодом, который решил мою проблему в jquery и php, который другие могли бы адаптировать На самом деле это удалено из более сложной системы, которая показывает модальное подтверждение начальной загрузки при нажатии кнопки удаления.

TL; DR Раздели вход, как кнопку. При нажатии измените его на hidden input.

HTML

<input
    id="delete" 
    name="delete" 
    type="button" 
    class="btn btn-danger"
    data-confirm="Are you sure you want to delete?"
    value="Delete"></input>

JQuery

$('#delete').click(function(ev) {
        button.attr('type', 'hidden');
        $('#form1').submit();
    return false;
});

PHP

if(isset($_POST["delete"])){
    $result = $foo->Delete();    
}
2 голосов
/ 10 ноября 2009

Значение кнопки отправки отправляется, когда пользователь нажимает кнопку. Вызов form.submit () не нажатие кнопки. У вас может быть несколько кнопок отправки, и функция form.submit () не может узнать, какую из них вы хотите отправить на сервер.

1 голос
/ 22 марта 2017

Хотя полученный ответ является технически правильным. Есть способ передать значение, которое вы хотите присвоить. Фактически, когда from отправляется на сервер, значение кнопки отправки ассоциируется с именем, которое вы дали кнопке отправки. Вот как работает трюк Марцина, и есть несколько способов добиться этого в зависимости от того, что вы используете. Ex. в jQuery вы можете передать

data: { 
    submitDocUpdate = "MyValue" 
}

в MVC я бы использовал:

@using (Html.BeginForm("ExternalLogin", "Account", new { submitDocUpdate = "MyValue" }))

Это на самом деле то, как я выполнил требование Steam по использованию своего собственного изображения в качестве ссылки для входа с помощью oAuth:

@using (Html.BeginForm("ExternalLogin", "Account", new { provider = "Steam" }, FormMethod.Post, new { id = "steamLogin" }))
{
     <a id="loginLink" class="steam-login-button" href="javascript:document.getElementById('steamLogin').submit()"><img alt="Sign in through Steam" src="https://steamcommunity-a.akamaihd.net/public/images/signinthroughsteam/sits_01.png"/></a>
}
0 голосов
/ 06 ноября 2018

Вот идея, которая прекрасно работает во всех браузерах без какой-либо внешней библиотеки.

HTML-код

<form id="form1" method="post" >
    ...........Form elements...............
    <input type='button' value='Save' onclick="manualSubmission('form1', 'name_of_button', 'value_of_button')" />
</form>

Java Script

Поместите этот код непосредственно перед закрытием тега body

<script type="text/javascript">
    function manualSubmission(f1, n1, v1){
    var form_f = document.getElementById(f1);
    var fld_n = document.createElement("input");
    fld_n.setAttribute("type", "hidden");
    fld_n.setAttribute("name", n1);
    fld_n.setAttribute("value", v1);
    form_f.appendChild(fld_n);
    form_f.submit();
}
</script>

Код PHP

<?php if(isset($_POST['name_of_button'])){

       // Do what you want to do.
}
?>

Примечание: Пожалуйста, не называйте кнопку «отправить», так как это может привести к несовместимости браузера.

...