回答:
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);
シンプル:
var element = $("span[name='test']");
$(element[0].attributes).each(function() {
console.log(this.nodeName+':'+this.nodeValue);});
Attr.nodeValue
value
Google Chromeによると、は非推奨です。したがって、これは可能性がありますthis.name + ':' + this.value
。Attrインターフェース
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
セッターで使用しているようですが、ゲッターでも使用すると便利です。
.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プラグインのいくつかの試みに気づきましたが、それらは私にとって「十分」に十分に見えなかったので、私は自分で作成しました。これまでの唯一の後退は、直接呼び出すことなく動的に追加された属性にアクセスできないことelm.attr('dynamicAttr')
です。ただし、これはjQuery要素オブジェクトのすべての自然属性を返します。
プラグインは単純なjQueryスタイルの呼び出しを使用します。
$(elm).getAttrs();
// OR
$.getAttrs(elm);
特定の属性を1つだけ取得するための2番目の文字列パラメーターを追加することもできます。jQueryは既にを提供しているため、これは1つの要素の選択には実際には必要ありませんが$(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.attributes
対応するHTML要素の割り当てられた属性を含むNamedNodeMapオブジェクトを返します。[].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>
多くの要素の属性を取得して整理するには、ループするすべての要素の配列を作成し、ループする各要素のすべての属性のサブ配列を作成することをお勧めします。
これは、収集された要素をループして2つの属性を出力するスクリプトの例です。このスクリプトでは、常に2つの属性が存在することを前提としていますが、これをさらにマッピングすることで簡単に修正できます。
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>
すべての属性を取得する1つの方法は、それらを配列に変換することです。
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))
とても簡単です。属性要素をループして、そのnodeValuesを配列にプッシュするだけです。
let att = document.getElementById('id');
let arr = Array();
for (let i = 0; i < att.attributes.length; i++) {
arr.push(att.attributes[i].nodeValue);
}
属性の名前が必要な場合は、「nodeName」を「nodeValue」に置き換えることができます。
let att = document.getElementById('id');
let arr = Array();
for (let i = 0; i < att.attributes.length; i++) {
arr.push(att.attributes[i].nodeName);
}
属性からオブジェクトへの変換
*必須:ロダッシュ
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