我注意到您可以在表单元素的事件处理程序中调用submit()
。例如,
<input id="myInput" type="button" onclick="submit()" value="Test" />
点击上面代码生成的按钮将提交表单。有趣的是,我不能在事件处理程序之外调用submit()
。没有为input元素定义submit
成员。(document.getElementById("myInput").submit
是undefined
。)那么,这个函数定义在哪里,哪里可以找到对这个函数的引用?
答案 0 :(得分:3)
定义为HTML属性的事件处理程序具有更复杂的范围链(...)
和
事件处理程序的作用域链不会与定义处理程序的对象一起停止:它继续进行包含层次结构。对于前面描述的
onclick
事件处理程序,作用域链以处理函数的调用对象开头。然后它继续进行Button对象,正如我们已经讨论过的那样。之后,它继续向上移动HTML元素包含层次结构,并至少包含包含按钮的HTML<form>
元素和包含该表单的Document
对象。范围链的精确组成从未标准化,并且与实现有关。 Netscape 6和Mozilla包含所有包含对象(甚至包括<div>
标签之类的东西),而IE 6则包含一个包含目标元素的更小的集合,以及包含Form对象(如果有)和Document对象。无论浏览器如何,作用域链中的最终对象都是Window对象,因为它总是在客户端JavaScript中。
所以我想已经很清楚,submit
函数是form
之一。如果事件处理程序是通过HTML属性定义的,那么范围链就是元素本身及其父元素。 但它不是标准化的,所以不应该依赖这种行为。
答案 1 :(得分:0)
您会注意到以下错误:
<input id="myInput" type="button" onclick="this.submit()" value="Test" />
也就是说,submit()不是HTMLInputElement的方法,但是submit()正在解析Form的submit()函数。
例如:
<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!'。