2010-01-06 32 views
8

Tôi có hai div, một div lớn và nhỏ hơn nhau, mỗi div có phương pháp OnClick riêng. Vấn đề tôi có là khi tôi nhấp vào div nhỏ hơn, phương pháp OnClick của div lớn được gọi là quá.Hai differents OnClick trên hai divs, một trên khác

Tôi có thể tránh điều đó ở đâu?

+0

Tôi giả định rằng các phần tử được lồng nhau. – SLaks

+0

Bạn có thể đăng bản demo không? Bạn có thể sử dụng http://jsbin.com. – SLaks

Trả lời

6

Cách tốt nhất để phát hiện yếu tố nào được nhấp là phân tích mục tiêu của sự kiện (sự kiện nhấp). Tôi đã chuẩn bị một ví dụ nhỏ cho trường hợp này. Bạn có thể nhìn thấy nó trong mã dưới đây.

 
function amIclicked(e, element) 
{ 
    e = e || event; 
    var target = e.target || e.srcElement; 
    if(target.id==element.id) 
     return true; 
    else 
     return false; 
} 
function oneClick(event, element) 
{ 
    if(amIclicked(event, element)) 
    { 
     alert('One is clicked'); 
    } 
} 
function twoClick(event, element) 
{ 
    if(amIclicked(event, element)) 
    { 
     alert('Two is clicked'); 
    } 
} 

phương pháp javascript Điều này có thể được gọi trước khi bạn thực hiện kịch bản của bạn

Ví dụ

 
<style> 
#one 
{ 
    width: 200px; 
    height: 300px; 
    background-color: red; 
} 
#two 
{ 
    width: 50px; 
    height: 70px; 
    background-color: yellow; 
    margin-left: 10; 
    margin-top: 20; 
} 

</style> 



<div id="one" onclick="oneClick(event, this);"> 
    one 
    <div id="two" onclick="twoClick(event, this);"> 
     two 
    </div> 
</div> 

Tôi hy vọng điều này sẽ giúp.

+0

Giúp rất nhiều, tôi sẽ cố gắng, cảm ơn! – Santiago

+0

Nó cuối cùng hoạt động trộn câu trả lời: event.cancelBubble = true; nếu event.stopPropagation (event.stopPropagation)(); cửa sổ.sự kiện không hoạt động trên Firefox, không biết tại sao – Santiago

+0

'window.event' là một thuộc tính IE không chuẩn. – SLaks

5

Vấn đề của bạn là sự kiện click sẽ nhân lên cây phần tử. Do đó, mỗi phần tử chứa phần tử được nhấp vào cũng sẽ kích hoạt sự kiện click.

Giải pháp đơn giản nhất là thêm return false trình xử lý của bạn.

Nếu bạn đang sử dụng jQuery, bạn có thể gọi e.stopPropagation(); nếu không, bạn cần phải gọi e.stopPropagation() nếu có, và đặt event.cancelBubble = true.

Để biết thêm thông tin, hãy xem here.

+0

Cảm ơn, đó là những gì tôi nghĩ nhưng nó đơn giản không hoạt động. – Santiago

+0

Cảm ơn bạn vì điều này nó hoạt động, nhưng có một lỗi đánh máy nhỏ. Bạn đã viết 'e.StopPropagation();' nhưng nó phải là 'e.stopPropagation();' –

+1

@SizzlePants: Cảm ơn; đã sửa. – SLaks

0

Nếu bạn quyết định sử dụng thư viện javascript như www.jquery.com, bạn có thể dễ dàng hoàn thành những gì bạn đang cố gắng thực hiện bằng cách sử dụng tùy chọn ngăn chặn tuyên truyền.

+0

Bạn không cần phải sử dụng jQuery hoặc bất cứ điều gì khác, nó dễ dàng thực hiện với javascript đơn giản. –

3

Điều bạn đang giải quyết là sự kiện sôi nổi. Hãy xem bài viết này: http://www.quirksmode.org/js/events_order.html.

Về cơ bản, để ngăn chặn sự kiện từ đi qua các yếu tố phụ huynh, bạn có thể sử dụng một cái gì đó như thế này:

document.getElementById('foo').onClick = function(e) { 

    // Do your stuff 

    // A cross browser compatible way to stop propagation of the event: 
    if (!e) var e = window.event; 
    e.cancelBubble = true; 
    if (e.stopPropagation) e.stopPropagation(); 
} 
+1

Dòng đầu tiên của hàm đó có thể được rút ngắn thành 'e = e || window.event; ' – gnarf

+0

Nó hoạt động trên Chrome nhưng Firefox cho biết" window.event is undefined " – Santiago

2

Bạn đang chạy vào một trường hợp phổ biến tuyên truyền sự kiện. Hãy xem quirksmode.org để biết chi tiết đầy đủ về những gì chính xác đang diễn ra. Về cơ bản, những gì bạn cần làm trong trình xử lý nhấp chuột của div nhỏ hơn là:

if (!e) var e = window.event; 
e.cancelBubble = true; 
if (e.stopPropagation) e.stopPropagation(); 
Các vấn đề liên quan