2013-02-15 51 views
2

这是相当棘手的问题,但请耐心等待。 这是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

是否有访问本地属性的方式在这样的情况下呢?

谢谢。

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

  • 我希望能够访问任何财产,而不仅仅是功能
  • 我的意思是这是一个普遍的问题。合乎逻辑的解决办法不是首先引起名称冲突。
+0

您可以使用onsubmit吗?可能是解决问题的方法... – Giles 2013-02-15 17:22:09

+0

@Giles谢谢,但请参阅我的编辑。 – entonio 2013-02-15 18:11:55

回答

1

我不认为有一种方法来访问本机函数,如果你有一个名为'提交'的输入。我只是跑过了约翰Resig和熊比伯的Secrets of the Javascript Ninja第11章中的同一主题。我想如果有人知道JS和DOM的来龙去脉,那就是他们。

+0

在某种程度上,这是正确的,但请参阅其他答案。 – entonio 2013-02-18 18:59:05

1

下应该做的伎俩:

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

它将使用本地方法,并在这页面上的元素的情况下调用它。

+0

谢谢。我很想接受这个,但我想看到两件事:1)以便携的方式访问原型的提示,2)访问函数以外的其他属性的方式,如果可能的话,我担心它会更棘手在所有。 – entonio 2013-02-15 17:42:25

+0

+1适用于本机功能(尽管不适用于属性) – entonio 2013-02-18 18:59:34

0

我试图将此作为编辑发布到伊沃的答案,但它被拒绝。这个信息是神秘的,但如果他们的意思是我加了太多原文,那么我认为这是错误的,因为我只是想完成它。如果原因不同,请随时发表评论。有了这个编辑,我会接受伊沃的答案,但如果没有它,我认为这是不完整的。

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中,它似乎很没用。

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