2011-01-21 35 views
7

Xin chào các bạn, Tôi đang cố gắng tạo danh sách phát phương tiện có thể nâng cao tín dụng, phát video và thay đổi tiêu đề khi di chuột qua, kết thúc video và nhấp/lần nhấp tiếp theo . Vì vậy, tôi cần phải viết một số chức năng mà sau đó có thể được gọi với nhau. Vì vậy, như thế này:

function showBox() 
    { 
     $(this).parents('.container').find('.box').show(); 
    }; 

    function hideBox() 
    { 
     $(this).parents('.container').find('.box').hide(); 
    }; 

    $('a').hover(
     function() 
     { 
      showBox(); 
     }, 
     function() 
     { 
      hideBox(); 
     } 
    ); 

Vấn đề là $ (này) không mang các chức năng từ .hover. Làm thế nào để tôi làm điều này?

Cảm ơn sự giúp đỡ!

Trả lời

3

Các this sẽ thực hiện thông qua nếu bạn chỉ cần làm:

$('a').hover(showBox,hideBox); 

EDIT: Để giải quyết những câu hỏi trong các bình luận, điều này sẽ làm việc cho bất kỳ chức năng bạn gán như một sự kiện xử lý. Không quan trọng nếu nó là một chức năng vô danh hoặc một chức năng được đặt tên.

này:

$('a').click(function() { 
    alert(this.tagName); 
}); 

... cũng giống như:

function alertMe() { 
    alert(this.tagName); 
} 

$('a').click(alertMe); 

...hay này:

function alertMe() { 
    alert(this.tagName); 
} 

$('a').bind('click', alertMe); 
+0

Thật sao? Đó sẽ là cách tốt nhất tôi nghĩ. Điều đó có hoạt động cho các sự kiện .click và .bind không? –

+0

@Drew: Tuyệt đối. : o) Nó chỉ đơn giản gán trực tiếp các hàm của bạn như các trình xử lý và bất cứ khi nào một trình xử lý được gọi, giá trị của 'this' trong trình xử lý sẽ là phần tử nhận được sự kiện. – user113716

+0

Vậy thì đây là cách tốt nhất để làm những gì tôi đang cố gắng làm! Có bất kỳ nhược điểm nào đối với điều này không? Làm thế nào mà tất cả những người khác không đề xuất điều này? Nó có vẻ dễ dàng như vậy! –

7

Mỗi câu trả lời của @ patrickdw, jQuery đặt phạm vi gọi lại cho sự kiện thành phần DOM khi sự kiện được kích hoạt. Ví dụ, xem tham số eventObject trong tài liệu cho trình xử lý click().

Câu trả lời gốc của tôi (dưới đây) hữu ích khi bạn muốn tạo trình cắm thêm jQuery để bạn có thể gọi các phương thức tùy chỉnh của riêng mình trên các đối tượng jQuery và đặt đối tượng jQuery là this trong khi thực thi. Tuy nhiên, đó là không phải là câu trả lời đúng và đơn giản cho câu hỏi ban đầu.

// Within a plug-in, `this` is already a jQuery object, not DOM reference 
$.fn.showBox = function(){ this.parents('.container').find('.box').show(); }; 
$.fn.hideBox = function(){ this.parents('.container').find('.box').hide(); }; 
$('a').hover(
    function(){ $(this).showBox() }, 
    function(){ $(this).hideBox() } 
); 

Sửa: Hoặc, nếu (như đề xuất) mà bạn muốn thêm chỉ có một tên cho phương pháp namespace ~ toàn cầu jQuery:

$.fn.myBox = function(cmd){ 
    this.closest('.container').find('.box')[cmd](); 
}; 

$('a').hover(
    function(){ $(this).myBox('show') }, 
    function(){ $(this).myBox('hide') } 
); 

Hoặc tổng quát hơn:

$.fn.myBox = function(cmd){ 
    switch(cmd){ 
    case 'foo': 
     ... 
    break; 
    case 'bar': 
     ... 
    break; 
    } 
    return this; 
}; 

Để biết thêm thông tin, hãy xem jQuery Plugin Authoring Guide.

+0

+1 - Đây là một cách tiếp cận tuyệt vời khác không yêu cầu đóng. Câu trả lời tốt. –

+1

Cách tốt đẹp, jQuery để làm điều đó. Mặc dù cho bản ghi, hướng dẫn cho các plugin thường yêu cầu một sự xâm nhập không gian tên duy nhất. Vì vậy, '.theBox ('mở')/.theBox ('close')' sẽ được nhiều hơn để regs. – Orbling

+1

Điểm tuyệt vời, @Orbling. Tôi nghĩ rằng hướng dẫn là hoàn toàn hợp lý khi đóng gói mã của riêng mình cho một plugin, nhưng có lẽ vi phạm cho một lần trong một kịch bản độc lập. Tôi đã cập nhật câu trả lời của mình để hiển thị một cách để thực hiện việc này. – Phrogz

2

Bạn cần phải sửa đổi mã của bạn để một cái gì đó như thế này:

function showBox(elem) 
{ 
    elem.parents('.container').find('.box').show(); 
}; 

function hideBox(elem) 
{ 
    elem.parents('.container').find('.box').hide(); 
}; 

$('a').hover(
    function() 
    { 
     var $this = $(this); 

     showBox($this); 
    }, 
    function() 
    { 
     var $this = $(this); 

     hideBox($this); 
    } 
); 
+0

Điều này sẽ không hoạt động. 'hover (hoverOverFn, hoverOffFn)' - có thể di chuyển ràng buộc bên ngoài, nhưng tôi không thực sự rõ ràng câu hỏi đang hỏi :-) –

+0

@pst - bắt nó khi tôi đọc lại nó, cập nhật để thiết lập đúng biến . –

+0

@gddc Bây giờ không cần phải cache nó, làm thế nào về 'showBox ($ (this)); ' – Phrogz

1

Thêm tham số để showBoxhideBox để họ có thể chấp nhận nguyên tố này, và sau đó gọi showBox($(this))hideBox($(this)).

2
$('a').hover(function() { 
    $(this).closest('.container').find('.box').show(); 
}, function() { 
    $(this).closest('.container').find('.box').hide(); 
}); 
+0

+1 cho' gần nhất() ' – Phrogz

3

Trong javascript, bạn có thể sử dụng call() hoặc apply() để thực hiện một chức năng và chỉ định rõ ràng this cho nó:

$('a').hover(
    function() 
    { 
     showBox.call(this); 
    }, 
    function() 
    { 
     hideBox.call(this); 
    } 
); 

Tham số đầu tiên trao cho call() quy định cụ thể đối tượng đó this sẽ tham khảo trong hàm. Bất kỳ tham số nào khác được sử dụng làm tham số trong lời gọi hàm.

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