Làm thế nào để có được con của bộ chọn $ (this)?


2229

Tôi có một bố cục tương tự như thế này:

<div id="..."><img src="..."></div>

và muốn sử dụng bộ chọn jQuery để chọn con imgbên trong divnhấp chuột.

Để có được div, tôi đã có bộ chọn này:

$(this)

Làm thế nào tôi có thể có được đứa trẻ imgbằng cách sử dụng một bộ chọn?

Câu trả lời:


2854

Hàm tạo jQuery chấp nhận một tham số thứ 2 được gọi là tham số contextcó thể được sử dụng để ghi đè ngữ cảnh của vùng chọn.

jQuery("img", this);

Điều này giống như sử dụng .find()như thế này:

jQuery(this).find("img");

Nếu hình ảnh bạn mong muốn chỉ là hậu duệ trực tiếp của phần tử được nhấp, bạn cũng có thể sử dụng .children():

jQuery(this).children("img");

575
với giá trị của nó: jQuery ("img", cái này) được chuyển đổi bên trong thành: jQuery (cái này) .find ("img") Vì vậy, cái thứ hai nhanh hơn một chút. :)
Paul Ailen

24
Cảm ơn @Paul, tôi đã lo lắng rằng việc sử dụng find () là sai , hóa ra đó là cách duy nhất;)
Agos

5
Nếu nút là con trực tiếp, sẽ không nhanh nhất khi chỉ làm $ (this) .children ('img'); ?
adamyonk

11
@adamyonk không nguyên vẹn, ít nhất là không nếu điều này xảy ra: jsperf.com/jquery-children-vs-find/3
Simon Stender Boisen

3
Tôi đang thấy điều ngược lại hoàn toàn với những gì @PaulIrish đã nêu trong ví dụ này - jsperf.com/jquery-selector-comparison-a . Bất cứ ai có thể làm sáng tỏ? Hoặc là tôi đã gặp trường hợp thử nghiệm sai, hoặc jquery đã thay đổi tối ưu hóa này trong 4 năm qua.
Jonathan Vanasco

471

Bạn cũng có thể sử dụng

$(this).find('img');

sẽ trả lại tất cả những imggì là hậu duệ củadiv


Trong trường hợp chung, có vẻ như $(this).children('img')sẽ tốt hơn. ví dụ <div><img src="..." /><div><img src="..." /></div></div>bởi vì có lẽ người dùng muốn tìm các hình ảnh cấp 1.
Butussy Butkus

137

Nếu bạn cần imggiảm thứ nhất xuống một cấp, bạn có thể làm

$(this).children("img:first")

6
Có phải :firstchỉ khớp " xuống chính xác một cấp " hay không khớp với "cấp đầu tiên" img được tìm thấy?
Ian Boyd

3
@IanBoyd, .children()là nơi "xuống chính xác một cấp" xuất phát và :firstlà nơi "đầu tiên" đến từ.
Tyler Crompton

3
@IanBoyd, yếu tố đó sẽ không được tính đến. Nó sẽ chỉ áp dụng nếu bạn sử dụng .find()thay vì.children()
Tyler Crompton

2
nếu bạn đang sử dụng: đầu tiên với một .find () hãy cẩn thận, jQuery dường như tìm thấy tất cả các hậu duệ và sau đó trả về phần tử đầu tiên, đôi khi rất tốn kém
Clarence Liu

1
@BriptButkus Trong câu hỏi, thisđã có một tham chiếu đến việc <div>chứa <img>, tuy nhiên nếu bạn có nhiều cấp độ thẻ để truy cập từ tham chiếu bạn có thì bạn chắc chắn có thể soạn nhiều hơn một children()cuộc gọi
rakslice

76

Nếu thẻ DIV của bạn ngay lập tức được theo sau bởi thẻ IMG, bạn cũng có thể sử dụng:

$(this).next();

16
.next () thực sự rất mong manh, trừ khi bạn luôn có thể đảm bảo phần tử sẽ là phần tử tiếp theo, tốt hơn là sử dụng một phương thức khác. Trong trường hợp này, IMG là một hậu duệ, không phải là anh em ruột của div.
LocalPCGuy

OP rõ ràng đã yêu cầu một đứa trẻ img bên trong div.
Giorgio Tempesta

65

Những đứa trẻ trực tiếp

$('> .child-class', this)

3
Câu trả lời này có khả năng gây hiểu lầm vì không có yếu tố nào với lớp 'trẻ em' nên nó sẽ không hoạt động.
Giorgio Tempesta

41

Bạn có thể tìm thấy tất cả phần tử img của div cha như bên dưới

$(this).find('img') or $(this).children('img')

Nếu bạn muốn phần tử img cụ thể, bạn có thể viết như thế này

$(this).children('img:nth(n)')  
// where n is the child place in parent list start from 0 onwards

Div của bạn chỉ chứa một phần tử img. Vì vậy, cho điều này dưới đây là đúng

 $(this).find("img").attr("alt")
                  OR
  $(this).children("img").attr("alt")

Nhưng nếu div của bạn chứa nhiều phần tử img như bên dưới

<div class="mydiv">
    <img src="test.png" alt="3">
    <img src="test.png" alt="4">
</div>

sau đó bạn không thể sử dụng mã trên để tìm giá trị alt của phần tử img thứ hai. Vì vậy, bạn có thể thử điều này:

 $(this).find("img:last-child").attr("alt")
                   OR
 $(this).children("img:last-child").attr("alt")

Ví dụ này cho thấy một ý tưởng chung rằng làm thế nào bạn có thể tìm thấy đối tượng thực tế trong đối tượng cha. Bạn có thể sử dụng các lớp để phân biệt đối tượng con của bạn. Điều đó thật dễ dàng và thú vị. I E

<div class="mydiv">
    <img class='first' src="test.png" alt="3">
    <img class='second' src="test.png" alt="4">
</div>

Bạn có thể làm điều này như dưới đây:

 $(this).find(".first").attr("alt")

và cụ thể hơn như:

 $(this).find("img.first").attr("alt")

Bạn có thể sử dụng find hoặc trẻ em như mã trên. Để biết thêm, hãy truy cập Trẻ em http://api.jquery.com/children/ và Tìm http://api.jquery.com/find/ . Xem ví dụ http://jsfiddle.net/lalitjs/Nx8a6/


35

Các cách để chỉ một đứa trẻ trong jQuery. Tôi đã tóm tắt nó trong jQuery sau:

$(this).find("img"); // any img tag child or grandchild etc...   
$(this).children("img"); //any img tag child that is direct descendant 
$(this).find("img:first") //any img tag first child or first grandchild etc...
$(this).children("img:first") //the first img tag  child that is direct descendant 
$(this).children("img:nth-child(1)") //the img is first direct descendant child
$(this).next(); //the img is first direct descendant child

Tôi sẽ sử dụng đứa con thứ n ()
A McGuinness

31

Nếu không biết ID của DIV, tôi nghĩ bạn có thể chọn IMG như thế này:

$("#"+$(this).attr("id")+" img:first")

54
điều này có thể thực sự hoạt động nhưng đó là câu trả lời của Rube Goldberg :)
Scott Evernden

8
và nếu bạn định sử dụng mã đó, ít nhất hãy làm: $ ("#" + this.id + "img: first")
LocalPCGuy

10
@LocalPCGuy Ý bạn là: "và nếu bạn định sử dụng mã đó hãy gọi trợ giúp "
gdoron đang hỗ trợ Monica

Tại sao bạn sẽ làm điều này nếu 'cái này' đã chọn div thực tế? Ngoài ra, nếu div không có id, mã này sẽ không hoạt động.
Giorgio Tempesta

31

Hãy thử mã này:

$(this).children()[0]

13
nó sẽ hoạt động mặc dù nó trả về một phần tử dom không phải là một đối tượng jq
redsapes

2
Tôi không biết liệu đó có phải là cách tiếp cận tốt nhất cho tình huống hiện tại hay không, nhưng nếu bạn muốn đi theo con đường này mà vẫn kết thúc với một đối tượng jQuery, chỉ cần bọc nó theo cách đó : $($(this).children()[0]).
patridge

19
hoặc thậm chí dễ dàng hơn$(this:first-child)
rémy

4
thay vì $($(this).children()[x])sử dụng $(this).eq(x)hoặc nếu bạn muốn cái đầu tiên, chỉ cần $(this).first().
Cristi Mihai

16
@ rémy: Đó không phải là cú pháp hợp lệ. (Mất tất cả 2 năm để bất kỳ ai chú ý ...)
BoltClock

23

Bạn có thể sử dụng một trong các phương pháp sau:

1 tìm ():

$(this).find('img');

2 trẻ em():

$(this).children('img');

21

jQuery eachlà một tùy chọn:

<div id="test">
    <img src="testing.png"/>
    <img src="testing1.png"/>
</div>

$('#test img').each(function(){
    console.log($(this).attr('src'));
});

15

Bạn có thể sử dụng Child Selecor để tham chiếu các phần tử con có sẵn trong phần cha mẹ.

$(' > img', this).attr("src");

Và dưới đây là nếu bạn không có tài liệu tham khảo $(this)và bạn muốn tham khảo imgcó sẵn trong một divchức năng khác.

 $('#divid > img').attr("src");


8

Đây là một mã chức năng, bạn có thể chạy nó (đó là một minh chứng đơn giản).

Khi bạn nhấp vào DIV, bạn nhận được hình ảnh từ một số phương pháp khác nhau, trong tình huống này "đây" là DIV.

$(document).ready(function() {
  // When you click the DIV, you take it with "this"
  $('#my_div').click(function() {
    console.info('Initializing the tests..');
    console.log('Method #1: '+$(this).children('img'));
    console.log('Method #2: '+$(this).find('img'));
    // Here, i'm selecting the first ocorrence of <IMG>
    console.log('Method #3: '+$(this).find('img:eq(0)'));
  });
});
.the_div{
  background-color: yellow;
  width: 100%;
  height: 200px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="my_div" class="the_div">
  <img src="...">
</div>

Hy vọng nó giúp!


5

Bạn có thể có 0 đến nhiều <img>thẻ bên trong của bạn <div>.

Để tìm một phần tử, sử dụng một .find() .

Để giữ mã của bạn an toàn, hãy sử dụng a .each().

Sử dụng .find().each()cùng nhau ngăn ngừa lỗi tham chiếu null trong trường hợp 0 <img>phần tử đồng thời cho phép xử lý nhiều <img>phần tử.

// Set the click handler on your div
$("body").off("click", "#mydiv").on("click", "#mydiv", function() {

  // Find the image using.find() and .each()
  $(this).find("img").each(function() {
  
        var img = this;  // "this" is, now, scoped to the image element
        
        // Do something with the image
        $(this).animate({
          width: ($(this).width() > 100 ? 100 : $(this).width() + 100) + "px"
        }, 500);
        
  });
  
});
#mydiv {
  text-align: center;
  vertical-align: middle;
  background-color: #000000;
  cursor: pointer;
  padding: 50px;
  
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<div id="mydiv">
  <img src="" width="100" height="100"/>
</div>


Tại sao bạn lại làm như vậy? $("body").off("click", "#mydiv").on("click", "#mydiv", function() {
Chris22

Tôi không biết @Alex đang sử dụng đoạn trích của mình như thế nào hoặc ở đâu. Vì vậy, tôi đã làm cho nó an toàn và chung chung nhất có thể. Gắn một sự kiện vào cơ thể sẽ làm cho nó để sự kiện sẽ kích hoạt ngay cả khi div không ở trong thời điểm sự kiện được tạo. Xóa sự kiện trước khi tạo một sự kiện mới sẽ ngăn trình xử lý chạy nhiều lần khi một sự kiện được kích hoạt. Không cần thiết phải làm theo cách của tôi. Chỉ cần gắn sự kiện vào div cũng sẽ hoạt động.
Jason Williams

Cảm ơn. Tôi đã thấy điều này trước đây trong một kịch bản và trong khi nó hoạt động cho những gì lập trình viên dự định, khi tôi cố gắng sử dụng nó cho một cửa sổ phương thức, sự kiện vẫn tạo ra một số phương thức chỉ với một cú nhấp chuột. Tôi đoán rằng tôi đã sử dụng sai, nhưng tôi sử dụngevent.stopImmediatePropagation() phần tử này để ngăn điều đó xảy ra.
Chris22

4

$(document).ready(function() {
  // When you click the DIV, you take it with "this"
  $('#my_div').click(function() {
    console.info('Initializing the tests..');
    console.log('Method #1: '+$(this).children('img'));
    console.log('Method #2: '+$(this).find('img'));
    // Here, i'm selecting the first ocorrence of <IMG>
    console.log('Method #3: '+$(this).find('img:eq(0)'));
  });
});
.the_div{
  background-color: yellow;
  width: 100%;
  height: 200px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="my_div" class="the_div">
  <img src="...">
</div>


0

Bạn đã có thể sử dụng

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
 $(this).find('img');
</script>

Điều này khác với câu trả lời của philnash 11 năm trước như thế nào?
David

0

Nếu img của bạn chính xác là phần tử đầu tiên bên trong div thì hãy thử

$(this.firstChild);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.