为什么没有id的元素上的element.id不返回undefined或null?

时间:2016-01-25 04:30:25

标签: javascript jquery dom

受到this question的启发并处理类似的情况,我想知道是否有人可以解释基本原理决定让element.id在id属性不是时返回一个空字符串本。

如果规范要返回nullundefined,我只需编写

即可
var allIds = $('#my-frm input').map(function() { return this.id; }).get();

相反,我必须在选择器中添加限定符,如

var allIds = $('#my-frm input[id]').map(function() { return this.id; }).get();

或使用针对上述问题提出的其他解决方案(如果存在则必须获取id两次)

var allIds = $('#my-frm input').map(function() { return (this.id) ? this.id : null; }).get();

或者我可以使用jquery属性getter,这似乎没有必要首先将每个元素包装到jquery对象中,但我提到它是为了完整性并且表明jquery使用.attr()方法转向了另一个方向。

var allIds = $('#my-frm input').map(function() { return $(this).attr('id'); }).get();

我很好奇是否有javascript element.id行为背后的实际原因。

更新

我终于找到了相关规范,其中定义当前行为(它没有解释为什么以这种方式定义)

https://www.w3.org/TR/2015/REC-dom-20151119/#element

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;
...

如果创建的元素具有id属性,其值不是空字符串,或者当元素的id属性设置为空字符串以外的值时,请设置元素的ID到了新的价值。

当删除元素的id属性或将其设置为空字符串时,请取消设置元素的ID。

定义了一些IDL属性以反映给定名称的特定内容属性。这意味着在获取时,必须运行以下步骤:

  1. 使用内容属性的名称获取上下文对象的属性,并将value作为结果。

  2. 如果value为null,则返回空字符串。

  3. 返回值。

  4. 在设置时,使用属性名称和给定值设置上下文对象的属性。

    id属性必须反映“id”内容属性。

1 个答案:

答案 0 :(得分:3)

  

我很好奇是否有javascript背后的实际原因   element.id行为。

请参阅Element.id

  

Element.id属性表示元素的标识符,   反映id全局属性。

  

如果规范要返回nullundefined

3.2.5.1 The id attribute

  

标识符是不透明的字符串。特殊含义不应该是   派生自id属性的值。

     

注意对ID的格式没有其他限制;特别是,ID可以只包含数字,以数字开头,   以下划线开头,仅包括标点符号等。

     

注意元素的唯一标识符可用于各种用途,最值得注意的是作为链接到特定部分的一种方式   使用片段标识符的文档,作为定位元素的方法   脚本编写时,以及从CSS设置特定元素样式的方法。

  

结果与意图相反,这很有趣。因为我   想避免调用一个单独的方法来检查是否存在   id

$.map()代替.map()Array.prototype.filter()用参数Boolean替换.get()以返回非空字符串id

var allIds = $.map($("input"), function(el) {
               return el.id
             }).filter(Boolean);

jsfiddle https://jsfiddle.net/gqvfuzqr/