jQuery中HTML表单标记的有效/无效名称是什么?

时间:2009-08-18 19:04:50

标签: javascript jquery html forms

这是从我遇到的错误jQuery $(’form’).serialize() returns only one element of a form serialized开始的,其中有一个名为“elements”的表单标签,如下所示:

<form>
<input name="elements"/>
<input name="e2"/>
</form>

阻止你使用jQuery的 $('form')来访问表单的所有命名元素.serialize()(即你得到“elements =”,你应该得到“elements =&amp; amp; E2 =“)。

我希望了解有关表单标记的正确“名称”元素的更多常规信息。即什么是禁区标签(“元素”,“名称”等),以及名称的有效字符是什么。这些东西是在标准或参考手册中定义的,还是试验和错误?

赞赏的想法和意见。

感谢阅读。

9 个答案:

答案 0 :(得分:8)

除了Jonathan Sampson所说的,你不应该使用用于表单对象属性的名称。有a list on Mozilla Developer Center,如果您仔细查看包含对您很重要的elements属性,因为表单元素可以作为表单对象的直接属性进行访问。例如,在您的情况下:

form.elements; // collides with the built-in elements property
form.e2;

因此,请注意不要使用methodaction等名称,这些名称也会与表单元素的methodaction属性的值相冲突。我希望你有这个想法。

答案 1 :(得分:6)

关于DOM属性,“无效”名称与“已取名”之间存在差异。

Jonathan Sampson的答案很好地解决了“无效”名称,但根据您之前的问题,您所问的是“被采用”的名称,例如“表单节点上的所有其他DOM属性是什么” ?“

简短的回答是:很多。

长答案基本上是这些two lists的总和,也就是说“所有节点共有的DOM属性”和“形成节点唯一的DOM属性”

你真正想要担心的最重要的是第二个列表 - 它们可以打破你的表单应该如何运作。

答案 2 :(得分:3)

有很多。

所有这些都可以在FORM元素上找到有效的方法/属性(由于接口继承),并且所有这些方法/属性都可以被同名的字段覆盖。因此,我建议避免使用这些名称,而不是遇到意外冲突:

Node interface members

ELEMENT_NODE
ATTRIBUTE_NODE
TEXT_NODE
CDATA_SECTION_NODE
ENTITY_REFERENCE_NODE
ENTITY_NODE
PROCESSING_INSTRUCTION_NODE
COMMENT_NODE
DOCUMENT_NODE
DOCUMENT_TYPE_NODE
DOCUMENT_FRAGMENT_NODE
NOTATION_NODE
nodeName
nodeValue
nodeType
parentNode
childNodes
firstChild
lastChild
previousSibling
nextSibling
attributes
ownerDocument
insertBefore
replaceChild
removeChild
appendChild
hasChildNodes
cloneNode
normalize
isSupported
namespaceURI
prefix
localName
hasAttributes

HTMLElement interface members

id
title
lang
dir
className

HTMLFormElement interface members

elements
length
name
acceptCharset
action
enctype
method
target
submit
reset
item
namedItem

前段时间我也制作了一个test for these,它允许测试不同浏览器如何“表现”这些名称。

答案 3 :(得分:2)

如果您的目标是避免与javascript中表单对象的任何可能的预先存在的属性冲突,那么我认为您正在寻找的官方标准是文档对象模型。

如果您想尝试并查看表单对象的内置属性在真正的broswer中,请尝试以下操作:

<html><body onLoad="showEm()">
<form id="foo"></form>

<script>
function showEm() {
    for(var e in document.getElementById("foo")) {
      document.writeln(e);
      document.writeln("<br>");
    }
}
</script>

<body>
</html>

但请注意,绝大多数这些对你来说都是无害的“覆盖”,我甚至不确定是否所有这些都可以被覆盖。

答案 4 :(得分:2)

谢谢大家的有用答案。答案似乎是针对DOM上的内容并且不应该使用(即“元素”等)。问题的另一部分是允许使用哪些字符。

我找到了name tokens in HTML4允许使用哪些字符的规范,其中说明了:

  

6.2 SGML基本类型

     

...

     
      
  • ID和NAME令牌必须以字母([A-Za-z])开头,后面可以跟任意数量的字母,数字([0-9]),连字符(“ - ”),下划线(“ _“),冒号(”:“)和句号(”。“)。
  •   

答案 5 :(得分:2)

古老的问题,但仍然适用于今天...

对于表单,您不能拥有与表单属性本身相同名称的输入。没有严格的限制,但无论你做什么都会覆盖表单的属性。表单属性列表很广泛,因浏览器和JS引擎而异,并且可能随时更改,恕不另行通知。因此,静态列表是没有用的。

表单的属性值将被对与该属性同名的任何字段的引用所覆盖。 IE:如果你有一个名为“action”的字段,那么表单的action属性将被一个名为“action”的元素的引用覆盖。如果没有名为“action”的输入:form.action是一个URL。使用名为“action”的输入form.action是一个元素。这里有一些解释:Why JS function name conflicts with element ID?。 “name”,“action”或“id”可能是表单字段的首选名称,JS世界从未考虑过这一点。

JS世界的完全失败可以解决:MSDN(http://msdn.microsoft.com/en-us/library/ie/ms536429%28v=vs.85%29.aspx)上的评论者注意到使用表单对象的getAttributeNode()方法来获取真正的表单属性值。适用于FF电流和IE~7。使用此方法,您可以拥有一个与表单元素属性同名的字段。这应该允许人们从API同时为各种其他客户端类型提供HTML / JS限制。

答案 6 :(得分:1)

不要以数字(“1Cow”)开头,不要使用标点符号(“oneCow!?”),也不要包含空格(“一头牛”)。

如果您是PHP程序员,并且希望从多个共享相同名称的元素创建一个数组,您可以使用方括号[和]。

<input name='colors[]' value='blue'  />
<input name='colors[]' value='black' />

答案 7 :(得分:0)

据我所知,没有“保留字”,所以只要符合有效字符的标准(没有空格,标点符号并且必须以字母开头),则name属性可以包含任何内容。

答案 8 :(得分:0)

鉴于您最初的问题,我怀疑它只是试验和错误,或者您正在使用的库的深入了解(这可能是不现实的,被授予)。

当然,坚持使用字母字符,但是应该可以将数字追加到最后。

ASP.NET中许多为name标记添加美元符号的bug可能会有所帮助,所以你可以尝试一下。我当然有兴趣看看会发生什么。