2010-11-07 2 views
2

Я заметил, что вы можете позвонить submit() в обработчики событий элементов формы. Например,submit() в Элементах формы

<input id="myInput" type="button" onclick="submit()" value="Test" /> 

нажав кнопку, сгенерированную кодом, указанным выше, отправит форму. Самое смешное, что я не могу позвонить submit() за пределами обработчика событий. Элемент submit определен для входного элемента. (document.getElementById("myInput").submit is undefined.) Итак, где эта функция определена и где я могу найти ссылку на эту функцию?

+0

Для тех, кто (как я) считает, что он не должен работать: http://jsbin.com/ozodi4 –

+1

Этот ужас - еще одна причина, по которой никогда не использовать атрибуты обработчика inline. – bobince

+0

@bobince Какая лучшая альтернатива? Вы имеете в виду что-то вроде этого? 'document.getElementById ("myInput"). onclick = function foo() {}' –

ответ

3

Описано here in section 19.1.6: обработчики

Событие определяется как HTML атрибуты имеют более сложную цепочку области (...)

и

сферу охвата цепи обработчик событий не останавливается на объекте, который определяет обработчик: он переходит вверх по иерархии сдерживания. Для обработчика событий onclick, описанного ранее, цепочка областей видимости начинается с объекта вызова функции обработчика. Затем он переходит к объекту Button, как мы уже говорили. После этого он продолжает иерархию сдерживания элементов HTML и включает, как минимум, элемент HTML <form>, который содержит кнопку и объект Document, который содержит форму. Точный состав цепи охвата никогда не был стандартизирован и зависит от реализации. Netscape 6 и Mozilla включают все содержащиеся объекты (даже такие вещи, как теги <div>), в то время как IE 6 придерживается более минимального набора, включающего целевой элемент, плюс содержащий объект Form (если есть) и объект Document. Независимо от браузера, конечным объектом в цепочке областей видимости является объект Window, поскольку он всегда находится на клиентском JavaScript.

Так что я думаю, это было уже ясно, что функция submit является одним из form. И если обработчик события определяется через атрибут HTML, то цепочка областей видимости - это сам элемент и его родители. Но не стандартизирован, поэтому не следует полагаться на это поведение.

+0

Ничего себе. Соответствующий бит равен * «Кроме того, поскольку нет стандарта для точного составления цепочки областей действия обработчика события, безопаснее предположить, что он содержит только целевой элемент и глобальный объект Window». *. Или просто используйте обработчики DOM2 и обход. –

0

Вы заметите, вы получите ту же ошибку следующие:

<input id="myInput" type="button" onclick="this.submit()" value="Test" /> 

То есть, подать() не является методом HTMLInputElement, но представить() является разрешающие Форма Передать() функция.

Например:

<form action='test.php' method='get' id='myForm'> 
    <input id="myInput" type="button" onclick="Foo()" value="Test" /> 
</form> 
<script type='text/javascript'> 
document.getElementById('myForm').Foo = function() { 
    alert('Bar!'); 
}; 
</script> 

При нажатии на кнопку Оповещения 'Bar!'.

+0

Да, но ** почему ** ? Что определяет это поведение? Это похоже на массовое предложение «с» или что-то в этом роде. –

+0

... хороший вопрос. Я не могу найти что-либо в спецификации, так как подразумевает ответ Феликса, это конкретная реализация. Страшная мысль. Я предполагаю, что домашнее сообщение - это определение области с помощью «этого», чтобы быть уверенным в совместимости с браузером. – Hamish

Смежные вопросы