访问由字段名称覆盖的本机表单属性?

时间:2013-02-15 17:02:35

标签: javascript forms dom

这是一个非常棘手的问题,但请耐心等待。 这是javascript DOM的一个众所周知的功能,如果你有一个带有name="something"的表单字段,那么表单的javascript DOM表示将具有something属性,该属性是对该字段的DOM表示的引用。

现在,如果字段的名称(“something”)等于表单的一个本机属性,它将取代javascript对象。例如,对于表单:

<form id="Form"><input name="submit" /></form>

我们将:

var s=document.getElementById("Form").submit; // s is the input

而不是

var s=document.getElementById("Form").submit; // s is the native submit function

在这样的情况下,有没有办法访问本机属性?

感谢。

编辑:澄清两点:

  • 我希望能够访问任何属性,而不仅仅是函数
  • 我的意思是这是一个普遍的问题。一个合乎逻辑的解决方案不是首先引发名称冲突。

3 个答案:

答案 0 :(得分:1)

如果您有一个名为“submit”的输入,我认为没有办法访问本机函数。我只是在John Resig和Bear Bibeault的Secrets of the Javascript Ninja第11章中遇到了同样的主题。我想如果有人知道JS和DOM的来龙去脉,就是他们。

答案 1 :(得分:1)

以下应该可以解决问题:

HTMLFormElement.prototype.submit.call(document.getElementById("Form"))

它将使用本机方法并在页面上的元素的上下文中调用它。

答案 2 :(得分:0)

我试图发布这个作为Ivo答案的编辑,但它被拒绝了。这个消息很神秘,但如果他们的意思是我在原版中添加了太多内容,那么我认为这是错误的,因为我只是想完成它。如果原因不同,请随时发表评论。通过这次编辑,我已经接受了Ivo的答案,但没有它,我认为它是不完整的。

Ivo的答案适用于本机功能,但它不适用于属性。对于属性来说,似乎有许多方法,都是相似的,但没有一个完美,以检索价值。我已经在 IE9 上测试了以下内容,这是我在这里提供的全部内容,但是http://www.quirksmode.org/dom/w3c_core.html#attributes表示行为通常(如果不是完全)一致:

form.attributes['name']       // node representing the 'name' attribute

form.getAttribute('name')     // input with name="name"

form.attributes['submit']     // null

form.getAttribute('submit')   // input with name="submit"

form.attributes['onsubmit']   // node representing the 'onsubmit' attribute, 
                              // whose value is a string

form.getAttribute('onsubmit') // input with name="submit"

基于此,似乎(再次,请注意我没有彻底测试):

  • 对于值属性,可以使用attributes['attribute name']方法,该方法应该适用于IE6。
  • 对于原型函数,可以使用prototype.fn.call方法
  • 对于函数属性,也许可以检索属性的源代码并使用它,但我宁愿不必这样做。
  • 由于getAttribute似乎返回了命名输入而不是属性,至少在IE中,它似乎没用。

回答我的原始问题,看起来在大多数情况下会有办法访问属性,但这取决于属性,最终取决于浏览器。