Поиск FORM, к которому принадлежит элемент в JavaScript
Как узнать, какой FORM-элемент HTML содержится внутри, используя простой/маленький бит JavaScript? В приведенном ниже примере, если я уже получил SPAN под названием "сообщение", как я могу легко перейти к элементу FORM?
<form name="whatever">
<div>
<span id="message"></span>
</div>
</form>
SPAN может быть вложен в другие таблицы или DIV, но кажется слишком затянутым для повторения вокруг .parentElement и работы по пути вверх по дереву. Есть ли более простой и более короткий способ?
Если бы это был не SPAN, а элемент INPUT, это было бы проще? У них есть свойство, которое указывает на содержащую FORM? Google не говорит...
Ответы
Ответ 1
К форме, к которой принадлежит элемент формы, можно получить доступ через element.form
.
Когда элемент, который вы используете в качестве ссылки, не является элементом формы, вам все равно придется выполнять итерацию через parentElement
или использовать какой-либо другой селектор.
Используя прототип, вы можете упростить это, используя Element.up():
$(element).up('form');
Другие ответы на этот вопрос указали, как сделать то же самое в jQuery.
Ответ 2
Почему бы просто не использовать:
var nodesForm = node.form;
?
Он работает на FF3, FF4, google chrome, Opera, IE9 (я сам тестировал)
Ответ 3
Угадайте, что вам нужно повторить все элементы.
Вы можете попробовать использовать jQuery:
$("input").parent("form")
http://docs.jquery.com/Traversing/parent#expr
Ответ 4
Относительно сообщения Gumbo:
Насколько прототип и jQuery полезны, некоторые люди не внедряют их в свои проекты.
Может кто-нибудь объяснить, почему решение Gumbo было понижено, кроме того, что он повторил то, что первоначально пытался избежать OP?
node = document.getElementById(this.id);
while (node.nodeName != "FORM" && node.parentNode) {
node = node.parentNode;
}
Чтобы ответить на вопрос OP:
Прохождение DOM - это самый быстрый способ добиться этого эффекта - воспринимаемая скорость достигается 1) лучшим написанием JS-кода или 2) временем выполнения (если вы сохраняете форму на загрузке страницы для этого элемента, вы все равно будете проходить, но у вас будет быстрый вызов хранимой переменной, когда вам нужно получить эту информацию).
Нет атрибутов, вложенных в элементы неформы, которые связывают его с формой (span.form не существует).
Если вы создаете страницу script (php/perl), и вы собираетесь делать много звонков в форму, вы можете вставить идентификатор формы в HTML для этого элемента. Тем не менее, поиск должен произойти.
Я надеюсь, что это поможет,
vol7ron
Ответ 5
Вы можете вернуться в дерево DOM до тех пор, пока вы не вернетесь вправо node:
node = document.getElementById("message");
while (node.nodeName != "FORM" && node.parentNode) {
node = node.parentNode;
}
Ответ 6
Или небольшой jQuery (игнорируя сам jQuery):
$("#message").parents("form:first")
Ответ 7
Кроме node.parentNode, я не верю, что существует способ найти конкретного предка данного node. Большинство библиотек обычно делают то, что вы описываете, и итерации через parentNode.
Если вы не используете библиотеку, такую как прототип, jquery или Ext, это, вероятно, будет хорошей идеей. К настоящему времени они разрешили все несовместимости и причуды в DOM, чтобы сделать большинство операций вроде этого пустяком.