Javascript 为什么没有id的元素上的element.id不返回undefined或null?
受类似情况的启发,我想知道是否有人能解释决定让element.id在id属性不存在时返回空字符串的原因 如果规范返回Javascript 为什么没有id的元素上的element.id不返回undefined或null?,javascript,jquery,dom,Javascript,Jquery,Dom,受类似情况的启发,我想知道是否有人能解释决定让element.id在id属性不存在时返回空字符串的原因 如果规范返回null或undefined,我只需编写 var allIds = $('#my-frm input').map(function() { return this.id; }).get(); 相反,我必须向选择器添加一个限定符,如 var allIds = $('#my-frm input[id]').map(function() { return this.id; }).get
null
或undefined
,我只需编写
var allIds = $('#my-frm input').map(function() { return this.id; }).get();
相反,我必须向选择器添加一个限定符,如
var allIds = $('#my-frm input[id]').map(function() { return this.id; }).get();
或者使用针对上述问题提出的其他解决方案(如果id存在,则必须获取两次)
或者我可以使用jquery属性getter,这似乎没有必要先将每个元素包装到jquery对象中,但我之所以提到它是为了完整性,并说明jquery使用.attr()方法的方向正好相反
我很好奇javascript元素.id行为背后是否有实际原因
更新:
我最终找到了相关的规范,它定义了当前的行为(它没有解释为什么会这样定义)
当创建的元素具有值不是空字符串的id
属性时,或者当元素的id
属性设置为空字符串以外的值时,将元素的id设置为新值
当元素的id
属性被删除或设置为空字符串时,取消设置元素的id
某些IDL属性定义为反映给定名称的特定内容属性。这意味着获取时,必须运行以下步骤:
id
属性必须反映“id
”内容属性
我很好奇javascript背后是否有实际原因
element.id行为
看
Element.id
属性表示元素的标识符,
反映全局属性
如果规范返回
null
或未定义
标识符是不透明的字符串。特定含义不应被忽略
从id属性的值派生
注意对于ID的形式没有其他限制;特别是,ID可以仅由数字组成,以数字开头,
以下划线开头,仅由标点符号等组成
注意元素的唯一标识符可用于多种用途,最显著的是作为链接到元素特定部分的方式
使用片段标识符作为元素目标的一种方式来记录文档
在编写脚本时,以及作为从CSS设置特定元素样式的一种方式
有趣的是,结果与意图正好相反。因为我 希望避免调用单独的方法来检查
id
将$.map()
替换为.map()
,将数组.prototype.filter()
替换为.get()
的参数布尔值,以返回非空字符串的id
var allIds = $.map($("input"), function(el) {
return el.id
}).filter(Boolean);
jsfiddle是否返回this.id | | null代码>希望返回空值时返回空值?不能先使用filter
?空字符串是错误的。。。为什么要空值?我很好奇是否有实际原因
-历史?改变它会破坏万维网太多吗?为什么重要?@JaromandaX的+1。你让我笑了。别担心,我不想改变它,也不想冒险破坏整个www.@RudigerW。请注意,这与编程语言JavaScript完全无关——这是一个涉及标准化web API的W3C项目。原则上这些不是特定语言。谢谢参考!有趣的是,结果与意图正好相反。因为我想避免调用一个单独的方法来检查id
的存在,我最终给了空字符串
值特殊的含义;b) 减少方法调用;c) 返回不是空字符串的元素的id
?不确定问题是否仅限于为什么id
未设置时返回空字符串,或者如何返回id
元素中存在的位置,或者如何减少方法调用?因此,您引用的规范部分实际上没有说明属性不存在时的值。否则就会自相矛盾<代码>该值在元素的主子树中的所有id中必须是唯一的,并且必须至少包含一个字符。
那么,所有没有id属性的元素现在都返回空字符串,该空字符串1)不唯一2)长度至少不超过一个字符。@RudigerW。我认为根本问题可能是所有元素都有一个“id”属性,而且null
实际上不是W3CDOM标准的概念。@RudigerW。等等-你已经找到了规格。你在问什么?你是在问为什么规格是这样的吗?
var allIds = $('#my-frm input').map(function() { return $(this).attr('id'); }).get();
interface Element : Node {
readonly attribute DOMString? namespaceURI;
readonly attribute DOMString? prefix;
readonly attribute DOMString localName;
readonly attribute DOMString tagName;
attribute DOMString id;
attribute DOMString className;
...
var allIds = $.map($("input"), function(el) {
return el.id
}).filter(Boolean);