2010-02-09 74 views
18

Có cách nào để kích hoạt chương trình sự kiện onmouseover bằng JavaScript đơn giản không? hoặc "trích xuất" phương thức từ sự kiện onmouseover để gọi trực tiếp?Kích hoạt sự kiện onmouseover lập trình trong JavaScript

ví dụ

<div id="bottom-div" onmouseover="myFunction('some param specific to bottom-div');"> 
    <div id="top-div" onmouseover="????????"></div> 
</div> 

top-div là trên dưới div, vì vậy onmouseover sẽ không bị sa thải ở dưới div. i cần một cách gọi myFunction('some param specific to bottom-div'); từ phía trên bên div

+0

Bạn có thể sử dụng liên kết jquery –

+2

Bạn đã thử cái này chưa? Sự kiện onmouseover _should_ kích hoạt sự kiện cha mẹ cũng nhờ sự truyền bá sự kiện. –

+0

ok tôi đã không nghĩ về điều đó, xin lỗi đó là một ví dụ hơi xấu bởi vì trong ứng dụng của tôi họ không thực sự là yếu tố lồng nhau. div trên cùng được định vị hoàn toàn trên một số phần tử khác. – fearofawhackplanet

Trả lời

-3

Bạn sẽ làm điều đó một cái gì đó như thế này:

document.getElementById('top-div').onmouseover(); 

Tuy nhiên, như đã đề cập trong các ý kiến, nó sẽ kiểm tra giá trị trước khi được coi là một vấn đề.

+0

tôi đã không nhận ra nó rất đơn giản! Tôi chắc chắn tôi đã cố gắng để làm tương tự với onclick trước và nó không hoạt động. có lẽ trí nhớ của tôi là xấu. – fearofawhackplanet

+2

Tôi không chắc liệu điều này có hiệu quả hay không, nhưng tôi tin rằng ít nhất nó sẽ không có tiền tố 'on'. –

+13

Không hoạt động 'Uncaught TypeError: e.previousElementSibling.onmouseover không phải là một hàm (…)' – Green

1
​<a href="index.html" onmouseover="javascript:alert(0);" id="help"​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​>help</a>​​​​​​​​​​​​​​​​​​​​​​​​​​​ 

​document.getElementById('help').onmouseover();​​​​​​​ 
2

tôi cần phải làm điều gì đó tương tự, nhưng tôi đang sử dụng jQuery, và tôi thấy đây là một giải pháp tốt hơn: chức năng kích hoạt

Sử dụng jQuery.

$j('#top-div').trigger('mouseenter'); 

Bạn cũng có thể thêm thông số vào nó nếu cần. Xem số jQuery documentation on .trigger.

+1

Tôi thấy nó vui nhộn khi mọi người bỏ phiếu bình chọn và không nói theo cách. Vì vậy, với bất kỳ ai đã bỏ phiếu cho câu trả lời của tôi, hãy giải thích lý do tại sao tôi có thể học được điều gì đó mới mẻ. Tôi không đề nghị câu trả lời của tôi là tốt nhất, nhưng nó làm việc cho tôi. Nếu bạn tìm thấy một vấn đề với nó, xin vui lòng thêm một bình luận để chúng tôi có thể biết tại sao, hoặc tốt hơn, vì vậy tôi có thể cải thiện câu trả lời của tôi. – thephatp

24

Điều này làm việc cho tôi trong IE9 ít nhất. Nên qua trình duyệt tương thích hoặc gần nó ...

function FireEvent(ElementId, EventName) 
{ 
    if(document.getElementById(ElementId) != null)  
    { 
     if(document.getElementById(ElementId).fireEvent) 
     { 
      document.getElementById(ElementId).fireEvent('on' + EventName);  
     } 
     else 
     { 
      var evObj = document.createEvent('Events'); 
      evObj.initEvent(EventName, true, false); 
      document.getElementById(ElementId).dispatchEvent(evObj); 
     } 
    } 
} 

Ví dụ onmouseover, gọi hàm như thế này

FireEvent(ElementId, "mouseover"); 
+4

Đối với giá trị của nó, 'initEvent' không được dùng nữa và không nên dựa vào theo https://developer.mozilla.org/en-US/docs/Web/API/Event/initEvent .. của MDN và ví dụ có thể là trong khối 'else' ở trên là:' var event = new MouseEvent (EventName, {'view': window, 'bubbles': true, 'cancelable': true}); document.getElementById (ElementId) .dispatchEvent (sự kiện); ' – jamez14

6

Mà không đi sâu vào chi tiết quá nhiều, tôi đã có một img với hiệu ứng Rollover, tức là mouseout/overs đặt giá trị img src thành ẩn (hoặc điều này có thể thực hiện trong một ngữ cảnh khác với các biến gloabl). Tôi đã sử dụng một số javascript để hoán đổi cả giá trị hình ảnh quá/xuất của tôi và tôi gọi là FireEvent (ElementId, "mouseover"); để kích hoạt thay đổi. Javascript của tôi đã được ẩn/hiển thị các yếu tố trên trang. Điều này khiến cho con trỏ đôi khi vượt quá img mà tôi đã sử dụng để kích hoạt sự kiện - giống như cái mà tôi đã hoán đổi và đôi khi con trỏ không vượt quá img sau khi nhấp chuột.

Di chuyển chuột không kích hoạt trừ khi bạn thoát ra và nhập lại thành phần, vì vậy sau khi sự kiện của tôi được kích hoạt, việc di chuột qua lại cần phải "kích hoạt lại" để chiếm vị trí con trỏ mới. Đây là giải pháp của tôi. Sau khi tôi ẩn/hiển thị các phần tử trang khác nhau, và để làm img src hoán đổi của tôi như mô tả, tôi gọi hàm RefreshMouseEvents (ElementId) thay vì FireEvent (ElementId, "di chuột qua").

Tính năng này hoạt động trong IE9 (không chắc chắn về các trình duyệt khác).

function RefreshMouseEvents(ElementId) 
{ 
    FireEvent(ElementId, 'mouseover'); 
    setTimeout("TriggerMouseEvent('" + ElementId + "')" , 1); 
} 

function TriggerMouseEvent(ElementId) 
{ 
    if(IsMouseOver(ElementId, event.clientX, event.clientY)) 
     FireEvent(ElementId, 'mouseover'); 
    else  
     FireEvent(ElementId, 'mouseout'); 
} 

function IsMouseOver(ElementId, MouseXPos, MouseYPos) 
{ 
    if(document.getElementById(ElementId) != null)  
    { 
     var Element = document.getElementById(ElementId); 
     var Left = Element.getBoundingClientRect().left, 
      Top = Element.getBoundingClientRect().top, 
      Right = Element.getBoundingClientRect().right, 
      Bottom = Element.getBoundingClientRect().bottom;  
     return ((MouseXPos >= Left) && (MouseXPos <= Right) && (MouseYPos >= Top) && (MouseYPos <= Bottom))  
    } 
    else 
     return false; 
} 

function FireEvent(ElementId, EventName) 
{ 
    if(document.getElementById(ElementId) != null)  
    { 
     if(document.getElementById(ElementId).fireEvent) 
     { 
      document.getElementById(ElementId).fireEvent('on' + EventName);  
     } 
     else 
     { 
      var evObj = document.createEvent('Events'); 
      evObj.initEvent(EventName, true, false); 
      document.getElementById(ElementId).dispatchEvent(evObj); 
     } 
    } 
} 
+0

Không sử dụng setTimeout làm eval! Thay vào đó, sử dụng 'Function.prototype.bind'. –

5

Tôi đã phải sửa lại bộ chức năng RefreshMouseEvents của mình sau khi thử nghiệm thêm. Đây là phiên bản dường như hoàn thiện (chỉ một lần nữa IE9 được thử nghiệm):

function RefreshMouseEvents(ElementId) 
{ 
    FireEvent(ElementId, 'mouseover'); 
    setTimeout("TriggerMouseEvent('" + ElementId + "', '" + event.clientX + "', '" + event.clientY + "')", 1); 
} 

function TriggerMouseEvent(ElementId, MouseXPos, MouseYPos) 
{ 
    if(IsMouseOver(ElementId, (1*MouseXPos), (1*MouseYPos))) 
     FireEvent(ElementId, 'mouseover'); 
    else  
     FireEvent(ElementId, 'mouseout'); 
} 

function IsMouseOver(ElementId, MouseXPos, MouseYPos) 
{ 
    if(document.getElementById(ElementId) != null)  
    { 
     var Element = document.getElementById(ElementId); 
     var Left = Element.getBoundingClientRect().left, 
      Top = Element.getBoundingClientRect().top, 
      Right = Element.getBoundingClientRect().right, 
      Bottom = Element.getBoundingClientRect().bottom;  
     return ((MouseXPos >= Left) && (MouseXPos <= Right) && (MouseYPos >= Top) && (MouseYPos <= Bottom))  
    } 
    else 
     return false; 
} 

function FireEvent(ElementId, EventName) 
{ 
    if(document.getElementById(ElementId) != null)  
    { 
     if(document.getElementById(ElementId).fireEvent) 
     { 
      document.getElementById(ElementId).fireEvent('on' + EventName);  
     } 
     else 
     { 
      var evObj = document.createEvent('Events'); 
      evObj.initEvent(EventName, true, false); 
      document.getElementById(ElementId).dispatchEvent(evObj); 
     } 
    } 
} 
Các vấn đề liên quan