Dapatkan semua atribut elemen menggunakan jQuery

127

Saya mencoba untuk menelusuri suatu elemen dan mendapatkan semua atribut dari elemen tersebut untuk menampilkannya, misalnya tag mungkin memiliki 3 atau lebih atribut, tidak diketahui oleh saya dan saya perlu mendapatkan nama dan nilai atribut ini. Saya sedang memikirkan sesuatu seperti:

$(this).attr().each(function(index, element) {
    var name = $(this).name;
    var value = $(this).value;
    //Do something with name and value...
});

Adakah yang bisa memberi tahu saya apakah ini mungkin, dan jika demikian, apa sintaks yang benar?

Styphon
sumber

Jawaban:

246

The attributesproperti mengandung mereka semua:

$(this).each(function() {
  $.each(this.attributes, function() {
    // this.attributes is not a plain object, but an array
    // of attribute nodes, which contain both the name and value
    if(this.specified) {
      console.log(this.name, this.value);
    }
  });
});

Apa yang juga bisa Anda lakukan adalah memperluas .attrsehingga Anda bisa menyebutnya ingin .attr()mendapatkan objek sederhana dari semua atribut:

(function(old) {
  $.fn.attr = function() {
    if(arguments.length === 0) {
      if(this.length === 0) {
        return null;
      }

      var obj = {};
      $.each(this[0].attributes, function() {
        if(this.specified) {
          obj[this.name] = this.value;
        }
      });
      return obj;
    }

    return old.apply(this, arguments);
  };
})($.fn.attr);

Pemakaian:

var $div = $("<div data-a='1' id='b'>");
$div.attr();  // { "data-a": "1", "id": "b" }
pimvdb
sumber
1
Anda mungkin ingin memperbaikinya ketika tidak ada elemen yang cocok misalnya$().attr()
Alexander
11
The attributeskoleksi berisi semua atribut mungkin dalam IE yang lebih tua, bukan hanya mereka yang telah ditentukan dalam HTML. Anda dapat mengatasi ini dengan memfilter daftar atribut menggunakan masing-masing specifiedproperti atribut .
Tim Down
7
Ini adalah fungsionalitas yang sangat bagus dan diharapkan untuk .attr()metode jQuery . Aneh, jQuery tidak memasukkannya.
ivkremer
hanya sedikit penasaran untuk mengetahui mengapa kami mengaksesnya sebagai sebuah array this[0].attributes?
Vishal
attributesbukan Array ... di Chrome setidaknya itu adalah NamedNodeMap, yang merupakan Object.
Samuel Edwin Ward
26

Berikut ini adalah ikhtisar dari banyak cara yang dapat dilakukan, untuk referensi saya sendiri dan juga milik Anda :) Fungsi mengembalikan hash nama atribut dan nilainya.

Vanilla JS :

function getAttributes ( node ) {
    var i,
        attributeNodes = node.attributes,
        length = attributeNodes.length,
        attrs = {};

    for ( i = 0; i < length; i++ ) attrs[attributeNodes[i].name] = attributeNodes[i].value;
    return attrs;
}

Vanilla JS dengan Array.reduce

Berfungsi untuk browser yang mendukung ES 5.1 (2011). Membutuhkan IE9 +, tidak berfungsi di IE8.

function getAttributes ( node ) {
    var attributeNodeArray = Array.prototype.slice.call( node.attributes );

    return attributeNodeArray.reduce( function ( attrs, attribute ) {
        attrs[attribute.name] = attribute.value;
        return attrs;
    }, {} );
}

jQuery

Fungsi ini mengharapkan objek jQuery, bukan elemen DOM.

function getAttributes ( $node ) {
    var attrs = {};
    $.each( $node[0].attributes, function ( index, attribute ) {
        attrs[attribute.name] = attribute.value;
    } );

    return attrs;
}

Menggarisbawahi

Juga berfungsi untuk lodash.

function getAttributes ( node ) {
    return _.reduce( node.attributes, function ( attrs, attribute ) {
        attrs[attribute.name] = attribute.value;
        return attrs;
    }, {} );
}

Lodash

Bahkan lebih ringkas daripada versi Underscore, tetapi hanya berfungsi untuk lodash, bukan untuk Underscore. Membutuhkan IE9 +, bermasalah di IE8. Kudos to @AlJey untuk yang itu .

function getAttributes ( node ) {
    return _.transform( node.attributes, function ( attrs, attribute ) {
        attrs[attribute.name] = attribute.value;
    }, {} );
}

Halaman uji

Di JS Bin, ada halaman pengujian langsung yang mencakup semua fungsi ini. Tes ini mencakup atribut boolean ( hidden) dan atribut yang disebutkan ( contenteditable="").

hashchange
sumber
3

Skrip debugging (solusi jquery berdasarkan jawaban di atas oleh hashchange)

function getAttributes ( $node ) {
      $.each( $node[0].attributes, function ( index, attribute ) {
      console.log(attribute.name+':'+attribute.value);
   } );
}

getAttributes($(this));  // find out what attributes are available
zzapper
sumber
2

dengan LoDash Anda bisa melakukan ini:

_.transform(this.attributes, function (result, item) {
  item.specified && (result[item.name] = item.value);
}, {});
Eugene Kuzmenko
sumber
0

Menggunakan fungsi javascript lebih mudah untuk mendapatkan semua atribut elemen di NamedArrayFormat.

$("#myTestDiv").click(function(){
  var attrs = document.getElementById("myTestDiv").attributes;
  $.each(attrs,function(i,elem){
    $("#attrs").html(    $("#attrs").html()+"<br><b>"+elem.name+"</b>:<i>"+elem.value+"</i>");
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<div id="myTestDiv" ekind="div" etype="text" name="stack">
click This
</div>
<div id="attrs">Attributes are <div>

Wisnu Prasanth G
sumber
0

Solusi sederhana oleh Underscore.js

Misalnya: Dapatkan semua tautan teks yang kelasnya dimiliki orang tua someClass

_.pluck($('.someClass').find('a'), 'text');

Biola yang bekerja

pymen
sumber
0

Saran saya:

$.fn.attrs = function (fnc) {
    var obj = {};
    $.each(this[0].attributes, function() {
        if(this.name == 'value') return; // Avoid someone (optional)
        if(this.specified) obj[this.name] = this.value;
    });
    return obj;
}

var a = $ (el) .attrs ();

William
sumber