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?

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" }

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="").


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

2

dengan LoDash Anda bisa melakukan ini:

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

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>


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


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 ();

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.