ฉันจะรับ ID ขององค์ประกอบโดยใช้ jQuery ได้อย่างไร


1390
<div id="test"></div>
<script>
  $(document).ready(function() {
    alert($('#test').id);
  });  
</script>

เหตุใดงานด้านบนจึงไม่ทำงานและฉันควรทำอย่างไร


5
รับ ID ขององค์ประกอบที่ถูกเลือกผ่าน ID หรือไม่ oO
Martin Schneider

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

คำตอบ:


2303

วิธี jQuery:

$('#test').attr('id')

ในตัวอย่างของคุณ:

$(document).ready(function() {
  console.log($('#test').attr('id'));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="test"></div>

หรือผ่าน DOM:

$('#test').get(0).id;

หรือแม้กระทั่ง :

$('#test')[0].id;

และเหตุผลที่อยู่เบื้องหลังการใช้งาน$('#test').get(0)ใน JQuery หรือแม้แต่$('#test')[0]เป็น$('#test')ตัวเลือก JQuery และส่งกลับอาร์เรย์ () ของผลลัพธ์ที่ไม่ได้เป็นองค์ประกอบเดียวโดยการใช้งานเริ่มต้น

ทางเลือกสำหรับ DOM selector ใน jquery คือ

$('#test').prop('id')

ซึ่งแตกต่างจาก.attr()และ$('#test').prop('foo')คว้าระบุ DOM fooคุณสมบัติในขณะที่$('#test').attr('foo')การคว้า HTML ระบุfooแอตทริบิวต์และคุณสามารถหารายละเอียดเพิ่มเติมเกี่ยวกับความแตกต่างที่นี่


234
มัน amazes ฉันทุกครั้งที่ jQuery $('#test').id()ไม่มีทางลัดสำหรับการเช่นนี้
ความกลัว

5
มันจะไม่ค่อยมีประโยชน์เพราะรหัสมักจะถูกเขียนโค้ดลงใน HTML และ JS เมื่อคุณเขียน JS คุณรู้ ID ขององค์ประกอบแล้วดังนั้นคุณจึงเขียน ID นั้นเพื่อดึงองค์ประกอบ คุณไม่ค่อยได้รับ ID ขององค์ประกอบโดยทางโปรแกรม
daniel1426

10
ทำนั่น 16,4969 ครั้ง และตอนนี้ฉันอยู่ที่นี่ ฉันมีรหัสที่เริ่มต้นแบบฟอร์ม บางรูปแบบมีข้อกำหนดพิเศษ ฉันสามารถมองหาองค์ประกอบของรูปแบบที่เฉพาะเจาะจงในการตัดสินใจว่าจะทำอย่างไร แต่ฉันคิดว่าการระบุรูปแบบ - ดังนั้น id ของรูปแบบ - เป็นวิธีที่มีเหตุผลและแน่ใจที่สุด
Slashback

50
ทำไมฉันต้องได้รับรหัสขององค์ประกอบ? เพราะฉันมีตัวจัดการเหตุการณ์แนบกับคลาสขององค์ประกอบและฉันจำเป็นต้องรู้ว่าองค์ประกอบใดที่ทำให้เกิดเหตุการณ์ ฉันหวังว่าฉันทำสิ่งนี้ถูกต้อง
Buttle Butkus

4
Opps .. ทำให้นั่น 1,122,603 ​​ครั้ง .. : P
BvuRVKyUVlViVIc7

85

$('selector').attr('id')จะส่งคืนรหัสขององค์ประกอบที่ตรงกันแรก การอ้างอิง

หากชุดที่จับคู่ของคุณมีมากกว่าหนึ่งองค์ประกอบคุณสามารถใช้ตัว.each วนซ้ำทั่วไปเพื่อส่งกลับอาร์เรย์ที่มีรหัสแต่ละตัว:

var retval = []
$('selector').each(function(){
  retval.push($(this).attr('id'))
})
return retval

หรือถ้าคุณยินดีที่จะได้รับทรุดโทรมเล็ก ๆ น้อย ๆ ที่คุณสามารถหลีกเลี่ยงเสื้อคลุมและใช้ทางลัด.map

return $('.selector').map(function(index,dom){return dom.id})

9
BTW ฉันคิดว่าretval.push($(this).attr('id'))สามารถเขียนได้retval.push(this.id)
Darren Cook

หากคุณต้องการแอตทริบิวต์ของข้อมูล HMTL5 - ** ให้ใช้ดังนี้: return $('.selector').map(function(i, dom){ return $(dom).attr('data-id'); })
เพิกถอน

คุณสมบัติ. selector เลิกใช้แล้วใน jQuery 1.7 และได้รับการดูแลตามขอบเขตที่จำเป็นสำหรับการสนับสนุน. live () ในปลั๊กอิน jQuery Migrate คุณสมบัติไม่เคยเป็นตัวบ่งชี้ที่เชื่อถือได้ของตัวเลือกที่สามารถใช้เพื่อรับชุดองค์ประกอบที่มีอยู่ในชุด jQuery ซึ่งเป็นคุณสมบัติเนื่องจากวิธีการสำรวจเส้นทางต่อมาอาจเปลี่ยนชุด
วัน Andrew

40

idElementเป็นทรัพย์สินของแบบ HTML อย่างไรก็ตามเมื่อคุณเขียน$("#something")มันจะส่งคืนวัตถุ jQuery ที่ล้อมรอบองค์ประกอบ DOM ที่ตรงกัน หากต้องการรับองค์ประกอบ DOM ที่ตรงกันก่อนให้โทรget(0)

$("#test").get(0)

ในองค์ประกอบพื้นฐานนี้คุณสามารถเรียก id หรือคุณสมบัติหรือฟังก์ชัน DOM อื่น ๆ

$("#test").get(0).id

นั่นเป็นสาเหตุที่idรหัสของคุณไม่ทำงาน

หรือใช้attrวิธีการของ jQuery เป็นคำตอบอื่น ๆ ที่แนะนำให้รับidคุณลักษณะขององค์ประกอบที่ตรงกันแรก

$("#test").attr("id")

25

คำตอบข้างต้นนั้นยอดเยี่ยม แต่เมื่อ jQuery วิวัฒนาการขึ้นมา .. ดังนั้นคุณสามารถทำได้:

var myId = $("#test").prop("id");

4
@cjbarth attr()ถูกเพิ่มใน 1.0 และprop()ถูกเพิ่มใน 1.6 ดังนั้นฉันสมมติว่าความคิดเห็นของคุณprop()เป็นวิธีใหม่
Erik Philips

3
@ErikPhilips ฉันเชื่อว่าไม่ใช่วิธีเก่าและใหม่ขึ้นอยู่กับว่าคุณสนใจผลลัพธ์ต้นฉบับเมื่อโหลดหน้าเว็บ ( attr) หรือแก้ไขโดยสคริปต์ ( prop) ถ้าคุณไม่ได้จริงการปรับเปลี่ยนidแอตทริบิวต์ขององค์ประกอบใด ๆ โดยใช้สคริปต์ฝั่งไคลเอ็นต์แล้วpropและattrเหมือนกัน
AntonChanning

23
$.fn.extend({
    id : function() {
        return this.attr('id');
    }
});

alert( $('#element').id() );

แน่นอนว่าต้องใช้รหัสตรวจสอบบางอย่าง แต่ติดตั้งง่าย!


9

.idไม่ใช่ฟังก์ชัน jquery ที่ถูกต้อง คุณจำเป็นต้องใช้.attr()ฟังก์ชั่นเพื่อเข้าถึงคุณลักษณะที่องค์ประกอบมีอยู่ คุณสามารถใช้.attr()ทั้งเปลี่ยนค่าแอตทริบิวต์โดยการระบุสองพารามิเตอร์หรือรับค่าโดยการระบุหนึ่ง

http://api.jquery.com/attr/


7

หากคุณต้องการได้รับ ID ขององค์ประกอบสมมติว่าโดยตัวเลือกคลาสเมื่อเหตุการณ์ (ในกรณีคลิกเหตุการณ์) ถูกไล่ออกในองค์ประกอบเฉพาะนั้นแล้วต่อไปนี้จะทำงาน:

 $('.your-selector').click(function(){
       var id = $(this).attr('id');
 });


5

ดูเหมือนว่ายังไม่มีวิธีแก้ปัญหาและต้องการเสนอวิธีแก้ไขปัญหาของฉันเองซึ่งเป็นการขยายตัวต้นแบบ JQuery ฉันวางสิ่งนี้ลงในไฟล์ Helper ที่โหลดหลังจากไลบรารี JQuery ดังนั้นการตรวจสอบwindow.jQuery

if (window.jQuery) {
    $.prototype.id = function () {
        if (this.length > 1) {
            var val = [];
            this.each(function (idx, el) {
                val.push($(el).id());
            });
            return val;
        } else {
            return this.attr('id');
        }
    }
}

อาจไม่สมบูรณ์ แต่เป็นการเริ่มต้นที่จะรวมเข้ากับห้องสมุด JQuery

ส่งคืนค่าสตริงเดี่ยวหรือ Array ของค่าสตริง อาร์เรย์ของค่าสตริงใช้สำหรับเหตุการณ์ที่มีการใช้ตัวเลือกหลายองค์ประกอบ


4

$('#test')ส่งคืนวัตถุ jQuery ดังนั้นคุณไม่สามารถใช้เพียงobject.idเพื่อให้ได้มันId

คุณจำเป็นต้องใช้$('#test').attr('id')ซึ่งจะคืนค่าIDองค์ประกอบที่คุณต้องการ

สิ่งนี้สามารถทำได้ดังนี้

$('#test').get(0).id ซึ่งเท่ากับ document.getElementById('test').id


1
.. และ$('#test')[0].idเป็นเช่นเดียวกันกับ.get(0)
Gabriele Petrioli

3

อาจมีประโยชน์สำหรับผู้อื่นที่พบหัวข้อนี้ รหัสด้านล่างจะใช้งานได้ถ้าคุณใช้ jQuery แล้ว ฟังก์ชันจะส่งคืนตัวระบุเสมอ หากองค์ประกอบไม่มีตัวระบุฟังก์ชันจะสร้างตัวระบุและผนวกสิ่งนี้เข้ากับองค์ประกอบ

var generatedIdCounter = 0;

$.fn.id = function() {
    var identifier = this.attr('id');

    if(!identifier) {
        generatedIdCounter++;
        identifier = 'isGenerated_' + generatedIdCounter;

        this.attr('id', identifier);
    }

    return identifier;
}

วิธีใช้:

$('.classname').id();

$('#elementId').id();


2

นี่เป็นคำถามเก่าแต่ในปี 2015อาจใช้งานได้จริง:

$('#test').id;

และคุณยังสามารถทำการมอบหมาย:

$('#test').id = "abc";

ตราบใดที่คุณกำหนดปลั๊กอิน JQuery ต่อไปนี้:

Object.defineProperty($.fn, 'id', {
    get: function () { return this.attr("id"); },
    set: function (newValue) { this.attr("id", newValue); }
});

น่าสนใจถ้าelementเป็นองค์ประกอบ DOM แล้ว:

element.id === $(element).id; // Is true!


0

นี่อาจเป็นองค์ประกอบรหัสคลาสหรือโดยอัตโนมัติโดยใช้คู่

------------------------
$(this).attr('id');
=========================
------------------------
$("a.remove[data-id='2']").attr('id');
=========================
------------------------
$("#abc1'").attr('id');
=========================

-1

สำคัญ: หากคุณกำลังสร้างวัตถุใหม่ด้วย jQuery และเชื่อมเหตุการณ์คุณต้องใช้propและไม่ใช่attrเช่นนี้:

$("<div/>",{ id: "yourId", class: "yourClass", html: "<span></span>" }).on("click", function(e) { alert($(this).prop("id")); }).appendTo("#something");


-1

ในที่สุดนี้จะแก้ปัญหาของคุณ:

สมมติว่าคุณมีปุ่มหลายปุ่มบนหน้าหนึ่งและคุณต้องการเปลี่ยนปุ่มใดปุ่มหนึ่งด้วย jQuery Ajax (หรือไม่ใช่ ajax) ขึ้นอยู่กับ ID ของพวกเขา

ให้บอกด้วยว่าคุณมีปุ่มประเภทต่าง ๆ มากมาย (สำหรับแบบฟอร์มการอนุมัติและเพื่อวัตถุประสงค์แบบเดียวกัน) และคุณต้องการให้ jQuery ปฏิบัติต่อปุ่ม "ชอบ" เท่านั้น

นี่คือรหัสที่ใช้งานได้: jQuery จะจัดการเฉพาะปุ่มที่อยู่ในคลาส. cls-hlpb โดยจะใช้รหัสของปุ่มที่คลิกและจะเปลี่ยนตามข้อมูลที่มาจาก ajax

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js">    </script>
<script>
$(document).ready(function(){
$(".clshlpbtn").on('click',function(e){
var id = $(e.target).attr('id');
 alert("The id of the button that was clicked: "+id);
$.post("demo_test_post.asp",
    {
      name: "Donald Duck",
      city: "Duckburg"
    },
    function(data,status){

    //parsing the data should come here:
    //var obj = jQuery.parseJSON(data);
    //$("#"+id).val(obj.name);
    //etc.

    if (id=="btnhlp-1")
       $("#"+id).attr("style","color:red");
    $("#"+id).val(data);
    });
});




});
</script>
</head>
<body>

<input type="button" class="clshlpbtn" id="btnhlp-1" value="first btn">    </input>
<br />
<input type="button" class="clshlpbtn" id="btnhlp-2" value="second btn">    </input>
<br />
<input type="button" class="clshlpbtn" id="btnhlp-9" value="ninth btn">    </input>

</body>
</html>

รหัสถูกนำมาจาก w3schools และเปลี่ยน


-1
<html>
<head>
  <link rel="stylesheet"href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    </head>
<?php
    // include Database connection file 
    include("db_connection.php");

    // Design initial table header 
    $data = '<table class="table table-bordered table-striped">
                        <tr>
                            <th>No.</th>
                            <th>First Name</th>
                            <th>Last Name</th>
                            <th>Email Address</th>
                            <th>Update</th>
                            <th>Delete</th>
                        </tr>';
    $query = "SELECT * FROM users";
    if (!$result = mysqli_query($con, $query)) {
        exit(mysqli_error($con));
    }
    // if query results contains rows then featch those rows 
    if(mysqli_num_rows($result) > 0)
    {
        $number = 1;
        while($row = mysqli_fetch_assoc($result))
        {
            $data .= '<tr>
                <td>'.$number.'</td>
                <td>'.$row['first_name'].'</td>
                <td>'.$row['last_name'].'</td>
                <td>'.$row['email'].'</td>
                    <td><button onclick="DeleteUser('.$row['id'].')" class="btn btn-danger">Delete</button>
                </td>
            </tr>';
            $number++;
        }
    }

    else
    {
        // records now found 
        $data .= '<tr><td colspan="6">Records not found!</td></tr>';
    }

    $data .= '</table>';
    echo $data;
?>

<script type="text/javascript">

    function DeleteUser(id) {
    var conf = confirm("Are you sure, do you really want to delete User?");
    if (conf == true) {
        $.ajax({
                    url:'deleteUser.php',
                    method:'POST',
                    data:{
                        id:id
                    },
            success:function(data){
                      alert('delete successfully');
                   }




}
});

deleteUser.php

<?php
// check request
if(isset($_POST['id']) && isset($_POST['id']) != "")
{
    // include Database connection file
    include("db_connection.php");

    // get user id
    $user_id = $_POST['id'];

    // delete User
    $query = "DELETE FROM users WHERE id = '$user_id'";
    if (!$result = mysqli_query($con, $query)) {
        exit(mysqli_error($con));
    }
}
?>

-1

มันไม่ตอบ OP แต่อาจน่าสนใจสำหรับคนอื่น ๆ : คุณสามารถเข้าถึง.idฟิลด์ในกรณีนี้:

$('#drop-insert').map((i, o) => o.id)

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