2011-12-21 25 views
11

Tôi có một chức năng thu nhập hoãn lại liên kết với một sự kiện mouseenter:jQuery: Làm thế nào để kiểm tra xem chuột xuất hiện nhiều yếu tố

$(window).load(function(e) { 
    var $container = $('.container'); 
    $container.mouseenter(function(e) { 
    //do something 
    }); 
    ... 
}); 

Vấn đề là chuột có thể đã được trên phần tử khi sự kiện cháy tải, do đó trước khi sự kiện mouseenter bị ràng buộc.
tôi có thể làm được việc này bằng cách đặt một số mã ở phần cuối của bộ xử lý tải trang để làm một kiểm tra một lần nếu chuột nằm trong phần tử và kích hoạt các sự kiện mouseenter bằng tay:

// check if the mouse is inside $container 
if(mouse is inside $container) 
    $container.mouseenter(); 

Làm thế nào tôi có thể kiểm tra xem con chuột có vượt quá phần tử trong sự kiện tải không?

Tôi đã thử $container.is(':hover') nhưng không hoạt động.

+0

bạn đã thử sự kiện mouseenter và mouseleave chưa? –

+2

'$ container.is (': hover')' - theo cách nào không hiệu quả? Mối quan tâm của tôi là nó không đặc biệt tương thích chéo (nó sẽ không hoạt động trong IE7, ví dụ, bởi vì nó dựa vào hành vi qSA), nhưng nó dường như làm những gì bạn đang tìm kiếm cho tôi ... – lonesomeday

+0

@lonesomeday: xem http://jsfiddle.net/UVJgF/1/ và đặt chuột lên hộp đen và nhấn ctr + enter. nó không cháy trên FF8 – spb

Trả lời

0

Mouseover sự kiện thực hiện chính xác những gì bạn muốn.

Nếu .conteiner không tồn tại trong thời gian bạn đính kèm sự kiện di chuột (được thêm động trong tương lai), bạn phải sử dụng phương pháp .live để đính kèm sự kiện.

$(".conteiner").live("mouseover", function() { 
    alert("hovered!"); 
}) 

Nó cũng sẽ hoạt động khi chuột đã ở vị trí mà phần tử mới xuất hiện.Example here!

Đối với jQuery 1.7+ bạn nên sử dụng phương pháp .on thay vì phương thức .live không được dùng nữa. Example here!

+0

Tôi hy vọng có một cách để kiểm tra mà không cần sử dụng các sự kiện. – spb

+3

Nếu chuột đã qua một phần tử khi trang tải, sự kiện 'mouseover' sẽ không kích hoạt. Đó là toàn bộ vấn đề. –

+0

Bạn có chắc chắn sự kiện 'mouseover' sẽ không kích hoạt? –

-1
$('.container').mouseover(function(e) { 
    //do something 
}); 
+0

Tôi cần đợi trang tải trước tiên và vào thời điểm đó, chuột có thể đã vượt qua phần tử. – spb

1

Cách tốt nhất để làm điều này là để có được trái, phải, trên và dưới bù đắp của nguyên tố này và xem liệu vị trí chuột nằm bất cứ nơi nào giữa những giá trị đó.

Example.

Đặt chuột lên div lần đầu tiên tải. Sau đó làm mới trang (nhấn F5 để bạn không phải di chuyển chuột). Khi trang tải hoàn toàn vào lần tiếp theo, trang sẽ cảnh báo bằng "Di chuột!" ngay cả khi bạn chưa di chuyển chuột.

Hoặc cách dễ dàng hơn nữa. Chỉ cần kiểm tra e.target.id của sự kiện MouseMove (mà dường như bắn một lần tải trang, ngay cả khi không di chuyển chuột) chống lại id của nguyên tố này, như vậy:

$(document).mousemove(function(e){ 
    if(e.target.id === 'hoverTest'){ 
     alert("Hovered!"); 
    } 
}); 

Example (làm các bước tương tự như trên).

+0

Điều này dường như không sửa lỗi trên FF8. Để rõ ràng - nếu tôi đặt con chuột lên khối và lấy cửa sổ bật lên di chuột đầu tiên và nhấn enter, sau đó nhấn F5 (hoặc Ctrl-F5) để làm mới, tôi sẽ không nhận được cửa sổ bật lên khác mặc dù con chuột ở trên hộp cho đến khi tôi di chuyển chuột một chút. –

+0

Hoạt động tốt cho tôi trên Chrome - trông giống như một mớ hỗn độn khác trên trình duyệt. Cái nào tạo ra lỗi đó cho bạn? – Purag

+0

FireFox 8.0 Trên Chrome 16.0.912.59 trên máy tính xách tay Cr-48, nó vẫn bật cảnh báo ngay cả khi chuột không di chuyển, vì vậy rất khó để kiểm tra, nhưng tôi nhấp không bật lại và di chuyển qua hộp và sau đó nhấn F5 và nó không bật lên cho đến khi tôi bắt đầu di chuyển chuột, và sau đó nó tiếp tục xuất hiện. –

1

tôi không kiểm tra nó được nêu ra nhưng nghĩ rằng bạn muốn như thế này ...

function checkMouseCollision(obj) { 
    var offset = obj.offset(); 
    objX= offset.left; 
    objY=offset.top; 
    objW=obj.width(); 
    objH=obj.height(); 

    var mouseX = 0; 
    var mouseY = 0; 
    $().mousemove(function(e) { 
    mouseX = e.pageX; 
    mouseY = e.pageY; 
    }); 

    if((mouseX>objX&&mouseX<objX+objW)&&(mouseY>objY&&mouseY<objY+objH)){ 
     alert("hovered")  
    }; 
}; 
checkCollision($(".box")) 
+0

Điều này có thể hoạt động nhưng mousemove sẽ được gọi rất nhiều. Tôi rất thích cách thực hiện kiểm tra một lần nếu có thể :) – spb

+0

@spb bạn đã xem xét sử dụng .one() thay vì .on() cho các sự kiện của bạn? –

1

Với jQuery 1.7+ bạn sẽ muốn sử dụng .on(): http://api.jquery.com/on/

$(document).ready(function(){ 
    $('body').on("mouseover", "your_element_selector_here", function() { 
     // do stuff here 
    }); 
}); 

.live là không được chấp nhận. Bạn cũng có thể đặt bất kỳ sự kiện nào khác vào .on, tùy thuộc vào những gì bạn cần. : hover không hoạt động vì nó chỉ hoạt động với các phần tử cụ thể và dựa trên css.

Sử dụng điều này cùng với phương pháp phát hiện bù đắp trước khi trang tải xong sẽ đưa bạn đến nơi bạn muốn.

+0

thú vị. .mouseenter hoặc .mouseover không được chấp nhận nữa? những thứ đó có vẻ ít tiết hơn .on – spb

+0

Không, nhưng bạn nên sử dụng .on(). Giống như cũ không được chấp nhận .live, ràng buộc sẽ tồn tại ngay cả khi phần tử bị ràng buộc (your_element_here) được vẽ lại thông qua việc vẽ lại ajax. đây là bắt mặc dù, đó là yếu tố cha mẹ (một trong những bạn gọi là 'trên' trên) không phải được vẽ lại thông qua quá trình của cuộc sống của trang. Vì nó là cái gì .on() được gán cho nó phải luôn luôn tồn tại. – Stone

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