Форма не отправляется с помощью JS
-
10-07-2019 - |
Вопрос
У меня есть самая простая в мире функция javascript:
fnSubmit()
{
window.print();
document.formname.submit();
}
Который вызывается:
<button type="button" id="submit" onclick="fnSubmit()">Submit</button>
Все в порядке, появляется диалоговое окно печати, однако после печати или ее отмены я получаю следующую ошибку:
«document.formname.submit не является функцией»
Моя форма определяется следующим образом:(очевидно, я не использую имя формы в реальном коде, но вы поняли)
<form name="formname" id="formname" method="post" action="<?=$_SERVER['SCRIPT_NAME']?>">
Очевидно, я не пытаюсь сделать здесь что-то особенное и использовал подобные подходы в прошлом, чего мне здесь не хватает?
Решение
Суммируя:изменить идентификатор вашей кнопки отправки на нечто иное, чем «отправить».Также не устанавливайте имя к этому значению тоже.
Теперь немного более глубокого понимания.Общий случай заключается в том, что document.formname.submit
— это метод, который при вызове отправляет форму.Однако в вашем примере document.formname.submit
это больше не метод, а узел DOM, представляющий кнопку.
Это происходит потому, что элементы формы доступны как атрибуты ее узла DOM через их name
и id
атрибуты.Эта формулировка немного сбивает с толку, поэтому вот пример:
<form name="example" id="example" action="/">
<input type="text" name="exampleField" />
<button type="button" name="submit" onclick="document.example.submit(); return false;">Submit</button>
</form>
На этом примере document.forms.example.exampleField
— это узел DOM, представляющий поле с именем «exampleField».Вы можете использовать JS для доступа к его свойствам, таким как его значение: document.forms.example.exampleField.value
.
Однако в этом примере есть элемент формы под названием «отправить», и это кнопка отправки, доступ к которой можно получить с помощью document.forms.example.submit
.Это перезапишет предыдущее значение, которое было функцией, позволяющей отправить форму.
РЕДАКТИРОВАТЬ:
Если переименование поля вам не подходит, есть другое решение.Незадолго до написания этой статьи я оставил вопрос на сайте и получил ответ в виде аккуратного JavaScript-хака:
function hack() {
var form = document.createElement("form");
var myForm = document.example;
form.submit.apply(myForm);
}
Видеть Как надежно отправить HTML-форму с помощью JavaScript? для получения полной информации
Другие советы
Учитывая, что в вашей форме определены и id
, и name
, вы можете использовать любой из них:
С тегом form
<=>:
document.getElementById('formname').submit();
С атрибутом <=> тега <=>:
document.forms['formname'].submit();
Попробуйте это:
fnSubmit()
{
window.print();
document.getElementById("formname").submit();
}
Наиболее вероятный виновник - путаница в IE переменных, идентификаторов и имен JavaScript. Найдите в своем источнике что-то, разделяющее имя вашей формы.
Нравится это
<input type="submit" tabindex="-1" style="display:none;" />