Несколько кнопок отправки в HTML-форме

Короткие и простые: поскольку элементы, которые вы ищете, не существуют в документе (пока).


В оставшуюся часть этого ответа я буду использовать getElementById как пример, но то же самое относится к getElementsByTagName , querySelector и любому другому методу DOM, который выбирает элементы.

Возможные причины

Есть две причины, по которым элемент может не существовать:

  1. Элемент с переданным идентификатором действительно не существует в документе. Вы должны дважды проверить, что идентификатор, который вы передаете на getElementById, действительно соответствует идентификатору существующего элемента в (сгенерированном) HTML и что у вас не было с ошибкой идентификатор (идентификаторы чувствительный !). Кстати, в большинстве современных браузеров , которые реализуют методы querySelector() и querySelectorAll(), нотация стиля CSS используется для извлечения элемента его id, например: document.querySelector('#elementID'), в отличие от способа, с помощью которого элемент извлекается его id в [[16]; в первом символе # необходимо, во втором это приведет к тому, что элемент не будет извлечен.
  2. Элемент не существует в данный момент , который вы вызываете getElementById ].

Последний случай довольно распространен. Браузеры анализируют и обрабатывают HTML сверху вниз. Это означает, что любой вызов элемента DOM, который встречается до появления этого элемента DOM в HTML, не будет выполнен.

Рассмотрим следующий пример:



Появляется div после script. В настоящий момент сценарий выполняется, элемент не существует , но и getElementById вернут null.

jQuery

То же самое относится к все селекторы с jQuery. jQuery не найдет элементов, если вы ошибочно написали ваш селектор, или вы пытаетесь выбрать их , прежде чем они на самом деле существуют .

Добавленный поворот - это когда jQuery не найден потому, что вы загрузили скрипт без протокола и запускаетесь из файловой системы:


этот синтаксис используется, чтобы позволить сценарию загружаться через HTTPS на странице с протоколом https: // и для загрузки HTTP-версии на странице с протоколом http: //

У этого есть неудачный побочный эффект попытки и невозможность загрузить file://somecdn.somewhere.com...


Решения

Прежде чем позвонить getElementById (или любой метод DOM, если на то пошло), убедитесь, что элементы, к которым вы хотите получить доступ, существуют, т. е. загружается DOM.

Это может быть обеспечено просто добавив ваш JavaScript после к соответствующему элементу DOM

, и в этом случае вы также можете поместить код непосредственно перед тегом закрывающего тела () (все DOM элементы будут доступны в момент выполнения скрипта). [/ g3 6]

Другие решения включают прослушивание событий load [MDN] или DOMContentLoaded [MDN] . В этих случаях не имеет значения, где в документе вы помещаете код JavaScript, вам просто нужно запомнить, чтобы весь обработчик DOM обрабатывался в обработчиках событий.

Пример:

window.onload = function() {
    // process DOM elements here
};

// or

// does not work IE 8 and below
document.addEventListener('DOMContentLoaded', function() {
    // process DOM elements here
});

Более подробную информацию об обработке событий и различиях браузера см. в статьях на странице quirksmode.org .

jQuery

Сначала убедитесь, что jQuery загружен правильно , Используйте инструменты разработчика браузера , чтобы узнать, был ли найден файл jQuery и исправлен ли URL-адрес, если он не был (например, добавьте схему http: или https: в начале, отрегулируйте путь, и т. д.)

Прослушивание событий load / DOMContentLoaded - это именно то, что делает jQuery с .ready() [docs] . Весь ваш код jQuery, который влияет на элемент DOM, должен находиться внутри этого обработчика событий.

На самом деле в учебнике j8uery явно указано:

Как почти все, что мы делаем при использовании jQuery, читает или манипулирует объектной моделью документа (DOM), мы должны убедиться, что мы начинаем добавлять события и т. д., как только DOM готов.

Для этого мы регистрируем готовое событие для документа.

$(document).ready(function() {
   // do stuff when DOM is ready
});
blockquote>

В качестве альтернативы вы также можете использовать сокращенный синтаксис:

$(function() {
    // do stuff when DOM is ready
});

Оба эквивалентны.

252
задан Peter Mortensen 14 July 2019 в 04:18
поделиться

10 ответов

Я надеюсь, что это помогает. Я просто добиваюсь цели float луг кнопки направо.

Этот путь Prev кнопку оставляют Next, кнопка, но эти Next на первом месте в структуре HTML:

.f {
  float: right;
}
.clr {
  clear: both;
}
<form action="action" method="get">
  <input type="text" name="abc">
  <div id="buttons">
    <input type="submit" class="f" name="next" value="Next">
    <input type="submit" class="f" name="prev" value="Prev">
    <div class="clr"></div><!-- This div prevents later elements from floating with the buttons. Keeps them 'inside' div#buttons -->
  </div>
</form>

Редактирование: Преимущества по другим предложениям: никакой JavaScript, доступный, обе кнопки, не остается type="submit"

137
ответ дан Peter Mortensen 23 November 2019 в 02:53
поделиться

Kevin,

Это работает без JavaScript или CSS в большинстве браузеров:

<form>
<p><input type="text" name="field1" /></p>
<p><a href="previous.html">
<button type="button">Previous Page</button></a>
<button type="submit">Next Page</button></p>
</form>

Firefox, Opera, Safari, Google Chrome вся работа.
Как всегда, IE является проблемой.

Эта версия работает, когда JavaScript включен:

<form>
<p><input type="text" name="field1" /></p>
<p><a href="previous.html">
<button type="button" onclick="window.location='previous.html'">Previous Page</button></a>
<button type="submit">Next Page</button></p>
</form>

, Таким образом, дефект в этом решении:
Предыдущая страница не работает при использовании IE с JavaScript прочь.
Мышление Вы, кнопка "Назад" все еще работает!

12
ответ дан Peter Mortensen 23 November 2019 в 02:53
поделиться

Я использовал бы JavaScript для представления формы. Функция была бы инициирована событием OnKeyPress элемента формы и обнаружит, была ли клавиша Enter выбрана. Если это верно, это отправит форму.

Вот две страницы, которые дают методы о том, как сделать это: 1 , 2 . На основе их вот пример использования (на основе здесь ):

<SCRIPT TYPE="text/javascript">//<!--
function submitenter(myfield,e) {
  var keycode;
  if (window.event) {
    keycode = window.event.keyCode;
  } else if (e) { 
    keycode = e.which;
  } else {
    return true;
  }

  if (keycode == 13) {
    myfield.form.submit();
    return false;
  } else {
    return true;
  }
}
//--></SCRIPT>

<INPUT NAME="MyText" TYPE="Text" onKeyPress="return submitenter(this,event)" />
14
ответ дан Peter Mortensen 23 November 2019 в 02:53
поделиться

Kevin, это не может быть сделано с чистым HTML. Необходимо полагаться на JavaScript для этого приема.

Однако при размещении двух форм в страницу HTML можно сделать это.

Form1 имел бы предыдущую кнопку.

Form2 имел бы любые вводы данных пользователем + следующая кнопка.

, Когда пользователь нажимает , Входят в Form2, Следующая кнопка отправки стреляла бы.

15
ответ дан Peter Mortensen 23 November 2019 в 02:53
поделиться

Можно сделать это с CSS.

Помещенный кнопки в разметку с Next кнопка сначала, тогда Prev кнопка впоследствии.

Тогда CSS использования для расположения их для появления пути Вы хотите.

15
ответ дан Jack Bashford 23 November 2019 в 02:53
поделиться

Если Вы действительно просто хотите, чтобы он работал как диалоговое окно установки, что относительно того, чтобы просто дать фокус кнопке "Next" OnLoad. Тот путь, если пользователь поражает Возврат, форму, отправляет и продвигается. Если они хотят возвратиться, они могут поразить Вкладку или нажать на кнопку.

16
ответ дан Peter Mortensen 23 November 2019 в 02:53
поделиться

Если то, что первая кнопка используется по умолчанию, последовательно через браузеры, почему бы не поместить их правильный окольный путь в исходный код, то используйте CSS для переключения их очевидных положений? float их левый и правый для передвижения их визуально, например.

28
ответ дан Peter Mortensen 23 November 2019 в 02:53
поделиться

Дайте Вашим кнопкам отправки то же имя как это:

<input type="submit" name="submitButton" value="Previous Page" />
<input type="submit" name="submitButton" value="Next Page" />

, Когда пользователь нажимает Enter и , Запрос переходит к серверу, можно проверить значение на submitButton на серверном коде, который содержит набор формы name/value пары. Например, в классическом ASP:

If Request.Form("submitButton") = "Previous Page" Then
    ' Code for Previous Page
ElseIf Request.Form("submitButton") = "Next Page" Then
    ' Code for Next Page
End If

Ссылка: Используя несколько кнопок отправки на единственной форме

51
ответ дан Peter Mortensen 23 November 2019 в 02:53
поделиться

Был бы он быть возможным для Вас изменить предыдущий тип кнопки в кнопку как это:

<input type="button" name="prev" value="Previous Page" />

Теперь кнопка Next была бы значением по умолчанию, плюс Вы мог также добавить эти default атрибут к нему так, чтобы Ваш браузер выделил его как так:

<input type="submit" name="next" value="Next Page" default />

Hope, которая помогает.

58
ответ дан Peter Mortensen 23 November 2019 в 02:53
поделиться

Используя пример Вы дали:

<form>
<input type="text" name="field1" /><!-- put your cursor in this field and press Enter -->
<input type="submit" name="prev" value="Previous Page" /> <!-- This is the button that will submit -->
<input type="submit" name="next" value="Next Page" /> <!-- But this is the button that I WANT to submit -->
</form>

при нажатии на "Previous Page" только значение "предыдущих" будет отправлено. При нажатии на "Next Page", только значение "следующих" будет отправлено.

, Если однако, Вы нажимаете Enter где-нибудь на форме, ни "предыдущей" ни "следующей", будет отправлен.

Настолько использующий псевдо код Вы могли сделать следующее:

If "prev" submitted then
    Previous Page was click
Else If "next" submitted then
    Next Page was click
Else
    No button was click
-4
ответ дан Peter Mortensen 23 November 2019 в 02:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: