Answers:
如果只需要DOM属性,则attributes
在元素本身上使用节点列表可能会更简单:
var el = document.getElementById("someId");
for (var i = 0, atts = el.attributes, n = atts.length, arr = []; i < n; i++){
arr.push(atts[i].nodeName);
}
请注意,这仅用属性名称填充数组。如果需要属性值,则可以使用nodeValue
属性:
var nodes=[], values=[];
for (var att, i = 0, atts = el.attributes, n = atts.length; i < n; i++){
att = atts[i];
nodes.push(att.nodeName);
values.push(att.nodeValue);
}
getElementById
-var el = document.getElementById($(myObj).attr("id"));
get
方法从jQuery对象获取DOM对象:例如:var obj = $('#example').get(0);
您可以将此简单插件用作$('#some_id')。getAttributes();
(function($) {
$.fn.getAttributes = function() {
var attributes = {};
if( this.length ) {
$.each( this[0].attributes, function( index, attr ) {
attributes[ attr.name ] = attr.value;
} );
}
return attributes;
};
})(jQuery);
因为在IE7中,elem.attributes列出了所有可能的属性,而不仅仅是当前属性,所以我们必须测试属性值。该插件可在所有主流浏览器中使用:
(function($) {
$.fn.getAttributes = function () {
var elem = this,
attr = {};
if(elem && elem.length) $.each(elem.get(0).attributes, function(v,n) {
n = n.nodeName||n.name;
v = elem.attr(n); // relay on $.fn.attr, it makes some filtering and checks
if(v != undefined && v !== false) attr[n] = v
})
return attr
}
})(jQuery);
用法:
var attribs = $('#some_id').getAttributes();
塞特和吸气剂!
(function($) {
// Attrs
$.fn.attrs = function(attrs) {
var t = $(this);
if (attrs) {
// Set attributes
t.each(function(i, e) {
var j = $(e);
for (var attr in attrs) {
j.attr(attr, attrs[attr]);
}
});
return t;
} else {
// Get attributes
var a = {},
r = t.get(0);
if (r) {
r = r.attributes;
for (var i in r) {
var p = r[i];
if (typeof p.nodeValue !== 'undefined') a[p.nodeName] = p.nodeValue;
}
}
return a;
}
};
})(jQuery);
用:
// Setter
$('#element').attrs({
'name' : 'newName',
'id' : 'newId',
'readonly': true
});
// Getter
var attrs = $('#element').attrs();
jQuery.attr
。
jQuery.attr
setter,但也可以在getter中使用它。
.slice
该转换attributes
属性阵列attributes
DOM节点的属性是NamedNodeMap
,这是一个类似于数组的对象。
类数组对象是具有length
属性并枚举属性名称的对象,否则具有其自己的方法并且不会从其继承Array.prototype
该slice
方法可用于将类似Array的对象转换为新的Array。
var elem = document.querySelector('[name=test]'),
attrs = Array.prototype.slice.call(elem.attributes);
console.log(attrs);
<span name="test" message="test2">See console.</span>
attrs
,您可以使用项目上的属性访问属性名称name
。
如果需要在数组中返回的对象中获取具有名称和值的所有属性,则此方法效果很好。
输出示例:
[
{
name: 'message',
value: 'test2'
}
...
]
function getElementAttrs(el) {
return [].slice.call(el.attributes).map((attr) => {
return {
name: attr.name,
value: attr.value
}
});
}
var allAttrs = getElementAttrs(document.querySelector('span'));
console.log(allAttrs);
<span name="test" message="test2"></span>
如果只需要该元素的属性名称数组,则可以映射结果:
var onlyAttrNames = allAttrs.map(attr => attr.name);
console.log(onlyAttrNames); // ["name", "message"]
Roland Bouman的答案是最好的简单香草方式。我注意到有人尝试了jQ插头,但对我来说它们似乎还不够“饱满”,所以我自己做了。到目前为止,唯一的挫折是无法直接调用无法访问动态添加的attrs elm.attr('dynamicAttr')
。但是,这将返回jQuery元素对象的所有自然属性。
插件使用简单的jQuery样式调用:
$(elm).getAttrs();
// OR
$.getAttrs(elm);
您还可以添加第二个字符串参数,以仅获取一个特定的属性。正如jQuery所提供的那样$(elm).attr('name')
,实际上并不需要一个元素选择,但是我的插件版本允许多次返回。例如,像
$.getAttrs('*', 'class');
将导致[]
对象返回数组{}
。每个对象看起来像:
{ class: 'classes names', elm: $(elm), index: i } // index is $(elm).index()
;;(function($) {
$.getAttrs || ($.extend({
getAttrs: function() {
var a = arguments,
d, b;
if (a.length)
for (x in a) switch (typeof a[x]) {
case "object":
a[x] instanceof jQuery && (b = a[x]);
break;
case "string":
b ? d || (d = a[x]) : b = $(a[x])
}
if (b instanceof jQuery) {
var e = [];
if (1 == b.length) {
for (var f = 0, g = b[0].attributes, h = g.length; f < h; f++) a = g[f], e[a.name] = a.value;
b.data("attrList", e);
d && "all" != d && (e = b.attr(d))
} else d && "all" != d ? b.each(function(a) {
a = {
elm: $(this),
index: $(this).index()
};
a[d] = $(this).attr(d);
e.push(a)
}) : b.each(function(a) {
$elmRet = [];
for (var b = 0, d = this.attributes, f = d.length; b < f; b++) a = d[b], $elmRet[a.name] = a.value;
e.push({
elm: $(this),
index: $(this).index(),
attrs: $elmRet
});
$(this).data("attrList", e)
});
return e
}
return "Error: Cannot find Selector"
}
}), $.fn.extend({
getAttrs: function() {
var a = [$(this)];
if (arguments.length)
for (x in arguments) a.push(arguments[x]);
return $.getAttrs.apply($, a)
}
}))
})(jQuery);
;;(function(c){c.getAttrs||(c.extend({getAttrs:function(){var a=arguments,d,b;if(a.length)for(x in a)switch(typeof a[x]){case "object":a[x]instanceof jQuery&&(b=a[x]);break;case "string":b?d||(d=a[x]):b=c(a[x])}if(b instanceof jQuery){if(1==b.length){for(var e=[],f=0,g=b[0].attributes,h=g.length;f<h;f++)a=g[f],e[a.name]=a.value;b.data("attrList",e);d&&"all"!=d&&(e=b.attr(d));for(x in e)e.length++}else e=[],d&&"all"!=d?b.each(function(a){a={elm:c(this),index:c(this).index()};a[d]=c(this).attr(d);e.push(a)}):b.each(function(a){$elmRet=[];for(var b=0,d=this.attributes,f=d.length;b<f;b++)a=d[b],$elmRet[a.name]=a.value;e.push({elm:c(this),index:c(this).index(),attrs:$elmRet});c(this).data("attrList",e);for(x in $elmRet)$elmRet.length++});return e}return"Error: Cannot find Selector"}}),c.fn.extend({getAttrs:function(){var a=[c(this)];if(arguments.length)for(x in arguments)a.push(arguments[x]);return c.getAttrs.apply(c,a)}}))})(jQuery);
更多简洁的方法:
var element = document.querySelector(/* … */);
[].slice.call(element.attributes).map(function (attr) { return attr.nodeName; });
[...document.querySelector(/* … */).attributes].map(attr => attr.nodeName);
document.querySelector()
返回文档中与指定选择器匹配的第一个Element。Element.attributes
返回一个NamedNodeMap对象,该对象包含相应HTML元素的分配属性。[].map()
创建一个新数组,并在调用数组中的每个元素上调用提供的函数。这有帮助吗?
此属性为您返回元素的所有属性到数组中。这是一个例子。
window.addEventListener('load', function() {
var result = document.getElementById('result');
var spanAttributes = document.getElementsByTagName('span')[0].attributes;
for (var i = 0; i != spanAttributes.length; i++) {
result.innerHTML += spanAttributes[i].value + ',';
}
});
<span name="test" message="test2"></span>
<div id="result"></div>
为了获得许多元素的属性并组织它们,我建议对要循环遍历的所有元素制作一个数组,然后为循环遍历的每个元素的所有属性创建一个子数组。
这是一个脚本示例,它将循环遍历收集的元素并打印出两个属性。该脚本假定始终有两个属性,但是您可以通过进一步的映射轻松地解决此问题。
window.addEventListener('load',function(){
/*
collect all the elements you want the attributes
for into the variable "elementsToTrack"
*/
var elementsToTrack = $('body span, body div');
//variable to store all attributes for each element
var attributes = [];
//gather all attributes of selected elements
for(var i = 0; i != elementsToTrack.length; i++){
var currentAttr = elementsToTrack[i].attributes;
attributes.push(currentAttr);
}
//print out all the attrbute names and values
var result = document.getElementById('result');
for(var i = 0; i != attributes.length; i++){
result.innerHTML += attributes[i][0].name + ', ' + attributes[i][0].value + ' | ' + attributes[i][1].name + ', ' + attributes[i][1].value +'<br>';
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span name="test" message="test2"></span>
<span name="test" message="test2"></span>
<span name="test" message="test2"></span>
<span name="test" message="test2"></span>
<span name="test" message="test2"></span>
<span name="test" message="test2"></span>
<span name="test" message="test2"></span>
<div name="test" message="test2"></div>
<div name="test" message="test2"></div>
<div name="test" message="test2"></div>
<div name="test" message="test2"></div>
<div id="result"></div>
这里的每个答案都缺少使用getAttributeNames元素方法的最简单解决方案!
它以常规数组的形式检索元素的所有当前属性的名称,然后可以将其简化为键/值的漂亮对象。
const getAllAttributes = el => el
.getAttributeNames()
.reduce((obj, name) => ({
...obj,
[name]: el.getAttribute(name)
}), {})
console.log(getAllAttributes(document.querySelector('div')))
<div title="hello" className="foo" data-foo="bar"></div>
假设您有一个如下所示的HTML元素:
<a class="toc-item"
href="/books/n/ukhta2333/s5/"
id="book-link-29"
>
Chapter 5. Conclusions and recommendations
</a>
获取所有属性的一种方法是将它们转换为数组:
const el = document.getElementById("book-link-29")
const attrArray = Array.from(el.attributes)
// Now you can iterate all the attributes and do whatever you need.
const attributes = attrArray.reduce((attrs, attr) => {
attrs !== '' && (attrs += ' ')
attrs += `${attr.nodeName}="${attr.nodeValue}"`
return attrs
}, '')
console.log(attributes)
下面是您将从示例中获得的字符串,其中包括所有属性:
class="toc-item" href="/books/n/ukhta2333/s5/" id="book-link-29"
试试这个
<div id=foo [href]="url" class (click)="alert('hello')" data-hello=world></div>
然后获取所有属性
const foo = document.getElementById('foo');
// or if you have a jQuery object
// const foo = $('#foo')[0];
function getAttributes(el) {
const attrObj = {};
if(!el.hasAttributes()) return attrObj;
for (const attr of el.attributes)
attrObj[attr.name] = attr.value;
return attrObj
}
// {"id":"foo","[href]":"url","class":"","(click)":"alert('hello')","data-hello":"world"}
console.log(getAttributes(foo));
用于属性数组
// ["id","[href]","class","(click)","data-hello"]
Object.keys(getAttributes(foo))
很简单。您只需要遍历attribute元素并将其nodeValues推入数组中:
let att = document.getElementById('id');
let arr = Array();
for (let i = 0; i < att.attributes.length; i++) {
arr.push(att.attributes[i].nodeValue);
}
如果需要属性名称,可以将“ nodeValue”替换为“ nodeName”。
let att = document.getElementById('id');
let arr = Array();
for (let i = 0; i < att.attributes.length; i++) {
arr.push(att.attributes[i].nodeName);
}
对象转换的属性
*要求:lodash
function getAttributes(element, parseJson=false){
let results = {}
for (let i = 0, n = element.attributes.length; i < n; i++){
let key = element.attributes[i].nodeName.replace('-', '.')
let value = element.attributes[i].nodeValue
if(parseJson){
try{
if(_.isString(value))
value = JSON.parse(value)
} catch(e) {}
}
_.set(results, key, value)
}
return results
}
这会将所有html属性转换为嵌套对象
HTML示例: <div custom-nested-path1="value1" custom-nested-path2="value2"></div>
结果: {custom:{nested:{path1:"value1",path2:"value2"}}}
如果parseJson设置为true,则json值将转换为对象
在javascript中:
var attributes;
var spans = document.getElementsByTagName("span");
for(var s in spans){
if (spans[s].getAttribute('name') === 'test') {
attributes = spans[s].attributes;
break;
}
}
要访问属性名称和值:
attributes[0].nodeName
attributes[0].nodeValue