2011-01-09 34 views
6

Có cách nào để lấy một hàm di chuột để chỉ thực hiện một lần không? Đây là những gì tôi hiện đang cố gắng:jQuery - Sử dụng .one() với di chuột

$('#ask').live('hover', function() { 

    $('#homesearch-after').hide(300); 

    $.doTimeout(300, function() { 
     hideClosedSearchLink(); 
     showHomeSearch(); 
    }); 

}); 

Nhưng điều đó không hiệu quả. Làm thế nào tôi chỉ có thể di chuột này để kích hoạt một lần?

Tôi đã thử thay đổi .live with .one and .bind ... sẽ dẫn đến hư vô.

+2

Không liên quan đến câu hỏi của bạn, nhưng bạn có thể thoát khỏi thời gian chờ bằng cách thêm mã bên trong nó trực tiếp như một gọi lại sau khi 'hide' kết thúc:' $ ('# homesearch-after'). hide (300, function() {/ ** code here ** /}); ' –

Trả lời

10

Bạn đã tự trả lời, sử dụng .one() (không phải .live()).

Nhưng như lasseespeholt vừa nêu trong nhận xét, .hover() là viết tắt để ràng buộc với mouseentermouseleave và không phải là sự kiện.

Hãy thử điều này:

$('#ask').one('mouseenter', function() { 

    $('#homesearch-after').hide(300); 

    $.doTimeout(300, function() { 
     hideClosedSearchLink(); 
     showHomeSearch(); 
    }); 

}); 

Nếu mà vẫn không hoạt động, hãy thử chỉ sử dụng các ol tốt' .hover() và sau đó .unbind() ing nó ngay lập tức sau khi nó kết thúc.

$('#ask').hover(function() { 

    $('#homesearch-after').hide(300); 

    $.doTimeout(300, function() { 
     hideClosedSearchLink(); 
     showHomeSearch(); 
    }); 

    // Again taking into account what lasseespeholt said 
    $(this).unbind('mouseenter mouseleave') 

}); 
+1

Vì một số lý do khi tôi sử dụng mã này, nó Không lam gi cả. =/ – Jared

+0

@Jared: Liệu '# ask' của bạn đang được JS thêm động vào trang của bạn? – BoltClock

+0

Không, nó được hiển thị với HTML tĩnh. – Jared

8

hover không phải là một thực event nhưng một phương pháp tốc ký mà gắn bó với xử lý cho hai sự kiện, mouseentermouseleave, và như vậy không làm việc với .one (như here). Để tái tạo các hành vi của hover bạn phải có hai với phím tắt rằng cả hai sẽ kích hoạt một lần duy nhất, như thế này:

$("#foo").one("mouseenter mouseleave", function(e){ 
    $(this).toggleClass("bar"); 
}); 

Trên đây sẽ là tương tự như sau, với ngoại lệ cho nó kích hoạt một lần duy nhất :

$("#foo").hover(function(){ 
    $(this).toggleClass("bar"); 
}); 

Nếu bạn muốn làm những việc khác nhau trên mouseentermouseleave, bạn cần phải ràng buộc xử lý riêng biệt:

$("#foo").one("mouseenter", function(e){ 
    $(this).addClass("bar").text("Over"); 
}).one("mouseleave", function(e){ 
    $(this).removeClass("bar").text("Out"); 
}); 

W mũ tôi có thể đọc từ mã của bạn là bạn đang chỉ tìm cách để ràng buộc sự kiện mouseenter, như thế này:

$('#ask').one('mouseenter', function() { 
    $('#homesearch-after').hide(300); 
    $.doTimeout(300, function() { 
     hideClosedSearchLink(); 
     showHomeSearch(); 
    }); 
}); 
+1

Cách khác, '.one ('mouseenter mouseleave', function (e) {...)' – BoltClock

+0

@BoltClock, thậm chí còn tốt hơn nếu bạn đang tìm cách làm một 'toggle' các kiểu, như trong ví dụ của tôi. Tôi sẽ thêm nó! – mekwall

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