รับแอตทริบิวต์ทั้งหมดขององค์ประกอบโดยใช้ jQuery


127

ฉันกำลังพยายามผ่านองค์ประกอบและรับแอตทริบิวต์ทั้งหมดขององค์ประกอบนั้นเพื่อส่งออกเช่นแท็กอาจมี 3 แอตทริบิวต์หรือมากกว่านั้นซึ่งฉันไม่รู้จักและฉันต้องการชื่อและค่าของแอตทริบิวต์เหล่านี้ ฉันกำลังคิดอะไรบางอย่างตามแนวของ:

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

ใครช่วยบอกฉันได้ไหมว่ามันเป็นไปได้หรือไม่และถ้าเป็นเช่นนั้นไวยากรณ์ที่ถูกต้องจะเป็นอย่างไร

คำตอบ:


246

attributesคุณสมบัติมีพวกเขาทั้งหมด:

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

สิ่งที่คุณสามารถทำได้คือการขยาย.attrเพื่อให้คุณสามารถเรียกมันว่าต้องการ.attr()รับวัตถุธรรมดาของคุณสมบัติทั้งหมด:

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

การใช้งาน:

var $div = $("<div data-a='1' id='b'>");
$div.attr();  // { "data-a": "1", "id": "b" }

1
คุณอาจต้องการแก้ไขเมื่อไม่มีองค์ประกอบที่ตรงกันเช่น$().attr()
Alexander

11
attributesคอลเลกชันที่มีคุณลักษณะที่เป็นไปได้ทั้งหมดใน IE เก่าไม่เพียง แต่ผู้ที่ได้รับการระบุไว้ใน HTML คุณสามารถหลีกเลี่ยงสิ่งนี้ได้โดยการกรองรายการแอตทริบิวต์โดยใช้specifiedคุณสมบัติแอตทริบิวต์แต่ละรายการ
Tim Down

7
นี่เป็นฟังก์ชันที่ดีมากและเป็นที่คาดหวังสำหรับ.attr()เมธอดjQuery jQuery แปลก ๆ ไม่รวมอยู่ด้วย
ivkremer

อยากรู้นิดหน่อยว่าทำไมเราถึงเข้าถึงมันเป็นอาร์เรย์ใน this[0].attributes?
Vishal

attributesไม่ใช่ Array แม้ว่า ... ใน Chrome อย่างน้อยก็เป็น a NamedNodeMapซึ่งเป็น Object
Samuel Edwin Ward

26

นี่คือภาพรวมของหลาย ๆ วิธีที่สามารถทำได้สำหรับการอ้างอิงของฉันเองและของคุณ :) ฟังก์ชันจะส่งคืนแฮชของชื่อแอตทริบิวต์และค่าของมัน

วานิลลา 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 พร้อม Array.reduce

ใช้ได้กับเบราว์เซอร์ที่รองรับ ES 5.1 (2011) ต้องใช้ IE9 + ไม่ทำงานใน 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

ฟังก์ชันนี้ต้องการวัตถุ jQuery ไม่ใช่องค์ประกอบ DOM

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

    return attrs;
}

ขีด

ยังใช้ได้กับ lodash

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

lodash

มีความกระชับมากกว่าเวอร์ชัน Underscore แต่ใช้ได้กับ lodash เท่านั้นไม่ใช่สำหรับขีดล่าง ต้องใช้ IE9 + เป็นบั๊กกี้ใน IE8 ขอชื่นชม @AlJey สำหรับสิ่งนั้น

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

หน้าทดสอบ

ที่ JS Bin มีหน้าทดสอบสดที่ครอบคลุมฟังก์ชันเหล่านี้ทั้งหมด การทดสอบประกอบด้วยแอตทริบิวต์บูลีน ( hidden) และแอตทริบิวต์ที่แจกแจง ( contenteditable="")


3

สคริปต์การดีบัก (โซลูชัน jquery ตามคำตอบด้านบนโดย 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


0

การใช้ฟังก์ชั่น javascript จะง่ายกว่าในการรับแอตทริบิวต์ทั้งหมดขององค์ประกอบใน 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

วิธีง่ายๆโดย Underscore.js

ตัวอย่างเช่นรับข้อความลิงก์ทั้งหมดที่พ่อแม่มีชั้นเรียน someClass

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

ทำงานซอ


0

คำแนะนำของฉัน:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.