2010-11-15 39 views
5

Làm cách nào để nhắm mục tiêu $ this (từ ngữ cảnh 'mỗi') từ bên trong hàm 'click'. Tôi muốn loại bỏ các phần tử .parents(). Find() khó xử.

$('.layout.responsive').each(function() { 
    $('.area.optional', this).before('<a href="#" class="toggle_responsive" onClick="return false">Show details</p>').hide(); 
    $('.toggle_responsive', this).click(function() { 
     $(this).parents('.layout.responsive').find('.area.optional').toggle(); 
    }); 
}); 

Trả lời

3

Giải pháp là tất nhiên cũng giống như mọi người khác ở đây, nhưng tôi nghĩ rằng sử dụng cú pháp này là rất sạch và sẽ thực hiện tương tự như mã bạn đang sử dụng ngay bây giờ.

$('.layout.responsive').each(function() { 
    var ar = $(this).find('.area.optional').hide(), 
     showDetail = $('<a />', { 
     href: '#', 
     class: 'toggle_responsive', 
     text: 'Show details', 
     click: function(){ 
      ar.toggle(); 
      return false; 
     }}).insertBefore(ar); 
}); 

Thay vì chèn trong một chuỗi HTML, chúng ta có thể sử dụng cú pháp mới được giới thiệu trong jQuery 1,4 để làm điều này nhiều hơn nữa sạch, và không có xử lý sự kiện inline lộn xộn bạn đang sử dụng ngay bây giờ.

+0

đánh giá cao đề xuất. của nó ít có thể đọc được nhưng có lẽ tốt hơn. – henrijs

+0

+1 Tôi sẽ sử dụng cái này. Tốt hơn là tạo một phần tử, mất tham chiếu đến phần tử đó, sau đó phải tìm lại ngay lập tức nó trong DOM để chỉ định lần nhấp. – user113716

4

Bạn chỉ có thể lưu trữ nó trong một biến:

$('.layout.responsive').each(function() { 
    var $elem = $('.area.optional', this).before('<a href="#" class="toggle_responsive">Show details</p>').hide(); 
    $('.toggle_responsive', this).click(function(e) { 
     e.preventDefault(); 
     $elem.toggle(); 
    }); 
}); 

Cũng lưu ý các cuộc gọi e.preventDefault(); mà làm khá nhiều những gì onclick="return false;" bạn đã làm nhưng theo một cách sạch hơn nhiều.

+0

Yuck với $ dollar_named_variables. – Gareth

+1

Có vẻ là loại thực hành phổ biến để sử dụng $ cho các đối tượng jQuery. – ThiefMaster

+0

Ngoài ra, tôi nghĩ rằng OP muốn bên ngoài "này" có sẵn từ bên trong chức năng, không phải trong một cuộc gọi sau đó – Gareth

7

Save nó trong một tên (không đặc biệt) biến:

$('.layout.responsive').each(function() { 
    var area = $('.area.optional', this).before('<a href="#" class="toggle_responsive" onClick="return false">Show details</p>').hide(); 
    $('.toggle_responsive', this).click(function() { 
     $(area).toggle(); 
    }); 
}); 
+1

Vì vậy, 'var area', không phải 'var $ area'? – henrijs

+0

Nó không có sự khác biệt, nhưng các biến javascript thường không bắt đầu bằng '$'. Lưu ý rằng jQuery không sử dụng '$' sigil như một tên hàm, nhưng nó không tiền tố bất kỳ số nhận dạng nào khác với '$' – Gareth

+0

tuyệt vời, hoạt động. cám ơn vì đã chia sẻ. sẽ thích điều này như sau cũng hữu ích, nhưng đối với các mục tiêu khác. – henrijs

Các vấn đề liên quan