受到this question的启发并处理类似的情况,我想知道是否有人可以解释基本原理决定让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();
或使用针对上述问题提出的其他解决方案(如果存在则必须获取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属性以反映给定名称的特定内容属性。这意味着在获取时,必须运行以下步骤:
使用内容属性的名称获取上下文对象的属性,并将value作为结果。
如果value为null,则返回空字符串。
返回值。
在设置时,使用属性名称和给定值设置上下文对象的属性。
id
属性必须反映“id
”内容属性。
答案 0 :(得分:3)
我很好奇是否有javascript背后的实际原因 element.id行为。
请参阅Element.id
Element.id
属性表示元素的标识符, 反映id
全局属性。
如果规范要返回
null
或undefined
标识符是不透明的字符串。特殊含义不应该是 派生自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/