当人们使用jQuery创建元素时,我总是看到他们按照$(<div />)
的方式做了些什么。为什么?据我所知,$('<div>')
同样有效。我错过了什么吗?
答案 0 :(得分:4)
这是自动关闭标签的语法。 <div>
不应该是自我关闭的,但在这种情况下它没有任何区别。 jQuery支持它,它以相同的方式呈现。
$("<div>") // = <div></div>
$("<div />") // = <div></div>
$("<div></div>") // = <div></div>
有关详细信息,请参阅此SO问题:
Why is this jQuery reference '$("<div />")' instead of '$("<div></div>")'?
答案 1 :(得分:3)
不,你没有遗漏任何东西。 jQuery很乐意接受它并呈现适当的标记。我想很多人被绊倒的地方是文档建议你使用XHTML兼容元素。
然而,有些人似乎错过了jQuery没有直接传递给document.createElement()
。相反,它在它上面运行一个正则表达式(或者至少在我上次检查时运行)并找出实际传递给document.createElement()
的内容。
对我来说,创建一个元素没有正确或错误的方法,实际上,你正在传递一些HTML元素的字符串表示。 Resig先生可以很容易地使用$('div');
或$('HTML:DIV');
或者他当时的感觉。相反,他选择使用“像这个正则表达式将HTML正确翻译成实际HTML的字符串”,因此以下所有内容同样有效:
$('<div>');
$('<div/>');
$('<div></div>');
...并且有效并非因为它们可能符合或不符合XHTML,但因为使用的正则表达式能够将其转换为正确的HTML元素。
答案 2 :(得分:3)
永远不会重要。
jQuery(最终)应用以下正则表达式来确定您传递的字符串是否为“单个标记”:
/^<(\w+)\s*\/?>(?:<\/\1>)?$/
如果您传递的字符串与此正则表达式匹配,则jQuery只需使用子模式(\w+)
(标记名称),并将其传递给document.createElement()
。
<div>
,<div />
,<div/>
和<div></div>
都符合此模式,因此它们的处理方式完全相同:createElement('div')
。
答案 3 :(得分:1)
确保跨浏览器兼容性。如果容器元素未关闭<div></div>
或快速关闭<div />
,则某些浏览器可能会失败。非容器元素<img>
有关详细信息,请参阅http://api.jquery.com/jQuery/#jQuery2。
<强>校正强>
对于<div></div>
,<div/>
和<div>
,jQuery会解析它并使用document.createElement。对于任何更复杂的内容,例如<div style="display:none" />
或<div><b></b></div>
,它将使用innerHTML来创建元素。在这种情况下,容器元素需要正确的标记关闭和嵌套,非容器元素需要可选。如果排除它们,代码可能会在某些浏览器上失败。
由于您可能在某些时候将属性或子元素添加到HTML字符串中,因此最好始终使用标记结束练习来避免意外错误。
答案 4 :(得分:0)