Форма не отправляется с JS - PullRequest
6 голосов
/ 24 июня 2009

У меня самая простая в мире функция 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']?>">

Очевидно, я не пытаюсь здесь делать что-то особенное, и я использовал подобные подходы в прошлом, что в мире мне здесь не хватает?

Ответы [ 5 ]

28 голосов
/ 04 января 2010

Короче говоря: измените id вашей кнопки отправки на что-то отличное от «отправить». Также не устанавливайте 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. Это перезаписывает предыдущее значение, которое было функцией, которая позволяет вам отправить форму.

EDIT:

Если переименование поля вам не подходит, есть другое решение. Незадолго до написания этого я оставил вопрос на сайте и получил ответ в виде аккуратного хакерского JavaScript-кода:

function hack() {
  var form = document.createElement("form");
  var myForm = document.example;
  form.submit.apply(myForm);
}

См. Как надежно отправить HTML-форму с помощью JavaScript? для получения полной информации

6 голосов
/ 24 июня 2009

Учитывая, что в вашей форме определены и id, и name, вы можете использовать любой из них:

С тегом form id:

document.getElementById('formname').submit();

С атрибутом form тега *1010*:

document.forms['formname'].submit();
5 голосов
/ 24 июня 2009

Попробуйте это:

fnSubmit()
{
  window.print();
  document.getElementById("formname").submit();
}
0 голосов
/ 02 апреля 2012
  1. Поместите кнопку ввода внутри формы.
  2. Дайте tabindex = "- 1" на нем.
  3. Сделать его невидимым, используя style = "display: none;".

Мне нравится

<input type="submit" tabindex="-1" style="display:none;" />
0 голосов
/ 24 июня 2009

Наиболее вероятным виновником является то, что IE запутывает переменные, идентификаторы и имена JavaScript. Ищите в своем источнике что-то, разделяющее название вашей формы.

...