2012-03-29 54 views
8

Tôi có một div như thế này:JQuery: Lấy id yếu tố phụ huynh của một yếu tố nhấp

<div id="popupDiv1" class="popupDivClass"> 
    <a id="popupDivClose" class="popupCloseClass">x</a> 
</div> 

Khi tôi bấm vào 'x' (Tôi muốn chạy một hàm jquery gọi disablePopup(id); nơi id là id của popupDiv coresponding (tôi có nhiều popupDiv mỗi nút X riêng của nó.

để làm như vậy tôi thực hiện những điều sau

$(".popupCloseClass").click(function (event) { 
    var buttonID = $(event.target).attr("id"); 
    var id = $(buttonID).closest("div").attr("id"); 
disablePopup(id); 
}); 

về cơ bản tôi nhận được id của popupCloseCl ass nhấp sau đó tôi nhận được id của nó là cha mẹ (popupDiv tương ứng) thông qua phương pháp gần nhất. sau đó tôi gọi disablePopup.

Nhưng điều này không hoạt động.

Tôi thậm chí đã thử sử dụng phương thức var buttonID = $(buttonID).parent().attr("id"); nhưng cũng không hoạt động.

Tôi cũng đã cố gắng var id = this.id;

Any help is appreciated rất

Cảm ơn

+0

'buttonID' sẽ chứa chuỗi ' "popupDivClose"'. Nếu bạn chuyển nó cho jQuery, nó sẽ tìm kiếm tất cả các phần tử có ** tag name ** 'popupDivClose'. Bộ chọn ID bắt đầu bằng '#'. Nhưng vì 'event.target' (hoặc thậm chí' this') đã trỏ đến phần tử bạn muốn, chỉ cần sử dụng '$ (event.target) .closest (...) ...' hoặc '$ (this) .closest (...) ... '. Tôi khuyên bạn nên đọc thêm một số hướng dẫn jQuery ... –

Trả lời

13

thay vì sử dụng closest bạn có thể sử dụng parent như thế này ...

var id = $(this).parent().attr("id"); 

Chú ý bạn có thể sử dụng từ khóa this để tham khảo các yếu tố đó khởi sự kiện này. Khi bạn có nó, bạn đang sử dụng giá trị buttonID làm bộ chọn phần tử có giá trị "popupDivClose" và không thêm # khi bắt đầu nó sẽ không tìm kiếm ID, mà là phần tử thẻ có tên "popupDivClose".

Nếu bạn muốn tiếp tục sử dụng buttonID bạn có thể đã sử dụng dòng mã này để làm cho nó làm việc ...

var id = $("#" + buttonID).parent().attr("id"); 

Tuy nhiên, tôi có vẻ rất muốn viết toàn bộ sự kiện như vậy ...

$(".popupCloseClass").click(function (event) { 
    event.preventDefault(); 

    var id = $(this).parent().attr("id"); 

    disablePopup(id); 
}); 

thông báo việc sử dụng event.preventDefault(); điều này sẽ đảm bảo trình duyệt sẽ không xử lý hành động tự nhiên cho liên kết (tức làTrang điều hướng) - Mặc dù vậy, trong Chrome ít nhất, bạn cần phải xác định một giá trị href cho điều hướng nào

Here is a working example

+0

Cảm ơn rất nhiều vì những giải thích rõ ràng – Youssef

0

Bạn nên làm

$(".popupCloseClass").click(function (event) { 
    var id = $(this).closest("div").attr("id"); 
}); 

(bạn cũng có thể sử dụng $(this).parent().attr("id");) nhưng sử dụng gần nhất là an toàn hơn trong trường hợp bạn thay đổi cấu trúc html của mình

+0

Lưu ý rằng 'parent()' sẽ chỉ trả về cha mẹ ngay lập tức và do đó tham số selector là vô nghĩa. tuy nhiên bạn có thể sử dụng 'cha mẹ (selector)' sẽ chọn một bộ chọn và trả về tất cả các bậc cha mẹ (tất cả các con đường lên cây) phù hợp với bộ chọn – musefan

+0

@musefan có nó vô nghĩa, theo kinh nghiệm của tôi thì tốt hơn nên sử dụng gần nhất() vì bạn thường kết thúc sửa đổi html của bạn và phá vỡ các mã sử dụng phụ huynh() –

+0

Một điểm tốt để thực hiện, chắc chắn một cái gì đó để xem xét. Tuy nhiên, tôi chưa phá vỡ mã của tôi theo cách này ... sau đó một lần nữa, tôi không sử dụng loại chức năng này quá thường xuyên anyway – musefan

0

này hoạt động tốt:

$('a.popupCloseClass').click(function() { 
    var id = $(this).parent().attr('id'); 
});​ 

JSFiddle Demo

Bạn chỉ nên sử dụng this thay vì cách bạn nhận được ID và sau đó cố gắng sử dụng nó làm công cụ chọn (bạn đã bỏ lỡ # bef quặng ID):

0

này phải làm việc:

$(".popupCloseClass").click(function (event) 
{ 
    var buttonID = $(this).parent().attr('id'); 
    disablePopup(buttonID); 
}); 
Các vấn đề liên quan