2

这是一个相当令人烦恼的问题,但请耐心等待。javascript DOM 的一个众所周知的特性是,如果您有一个带有 的表单字段name="something",则表单的 javascript DOM 表示将具有一个something属性,该属性是对该字段的 DOM 表示的引用。

现在,如果字段的名称(“某物”)等于表单的本机属性之一,它将在 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

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

谢谢。

编辑:只是为了澄清两点:

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

3 回答 3

1

以下应该可以解决问题:

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

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

于 2013-02-15T17:25:15.190 回答
1

如果您有一个名为“提交”的输入,我认为没有办法访问本机函数。我刚刚在John Resig 和 Bear Bibeault 撰写的 Javascript Ninja的秘密第 11 章中遇到了同样的话题。我想如果有人知道 JS 和 DOM 的来龙去脉,那就是他们。

于 2013-02-15T17:11:32.190 回答
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 中,它似乎毫无用处。

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

于 2013-02-18T18:57:58.287 回答