2010-10-05 116 views
26
點擊時忽略單擊事件

所以,我有以下情形:如何對兒童

<div id="block"> 
Sample text. 
<a href="#">Anchor link</a> 
</div> 

<script type="text/javascript"> 
    $("#block").click(function() { alert('test'); }); 
</script> 

當我點擊的div內的任何地方,我發現了「測試」的警報。但是,我想要防止發生這種情況,當我點擊「錨鏈接」。我怎樣才能實現呢?

謝謝

回答

27

您可以停止從鏈接冒泡了一個額外的處理器,這樣的點擊次數:

$("#block a").click(function(e) { e.stopPropagation(); }); 

在我們的意見在討論替代:

$("#block").delegate('a', 'click', function(e){ e.stopImmediatePropagation(); }) 
      .click(function() { alert('test'); });​ 

這將防止任何兒童冒泡鏈接(當然,不是真的,但是從執行的處理程序),但不是對每個元素創建一個處理程序,這是通過.stopImmediatePropagation()完成。

+4

感覺有點「矯枉過正」的點擊處理程序添加到每個環節只是爲了防止事件傳播(當然這取決於鏈接的數量)。但這是防止任何特定元素事件傳播的好方法。 – 2010-10-05 13:46:04

+0

@Felix - 如果有很多環節我會採取不同的方法完全與一組.delegate的'()'處理:)(你可以用上面* *前的其他點擊處理程序的委託版本,以及) 。 – 2010-10-05 13:48:03

+0

我剛剛嘗試過'delegate()',它對我不起作用:http://jsfiddle.net/cxcfA/。我假設因爲這個事件已經冒出來了。或者你的意思是別的嗎? – 2010-10-05 13:57:51

14

這就是你需要的:http://api.jquery.com/event.target/

只是相比較,以檢查是否元素被你想要的元素或它的一個子觸發。

+1

在我看來,最好的解決辦法... – Arxeiss 2013-06-27 13:55:08

3
$("#block").click(function(event) { 
    if($(event.target).attr('id') == $(this).attr('id')) 
    { 
     alert('test'); 
    } 
}); 
+0

工作過。謝謝! – hiroki 2017-02-06 17:32:27

0

這裏是一個演示(jsfiddle)用表格和兩個字段:

<div id="container"> 
    <form> 
     <div class="field"> 
      <input id="demo" type="text" name="demo" /> 
     </div> 
     <div class="field"> 
      <input id="demo2" type="text" name="demo2" /> 
     </div> 
    </form> 
</div> 

的代碼看起來是這樣的:

$(document).ready(function() { 
    $('#container').click(function(evt) { 
     if(this == evt.target) { 
      console.log('clicked container',evt.target); 
      $('#demo').focus(); 
     } else { 
      console.log('clicked child -> ignoring'); 
     } 
    }); 

    $('.field').click(function(evt) { 
     if(this == evt.target) { 
      console.log('clicked field div',evt.target); 
      $(this).find('input').focus(); 
     } else { 
      console.log('clicked child -> ignoring'); 
     } 
    }); 
}); 

您可以單擊包含表單的容器將焦點設置在第一個輸入字段或輸入字段後面以將焦點置於其中。

如果你點擊進入該領域,然後點擊將被忽略。

上面的代碼工作,因爲jQuery的調用事件處理程序之前分配DOM節點this,所以你可以很容易地檢查通過檢查

this == evt.target 

CSS當前事件是否由DOM節點發布:

#container { 
    width: 600px; 
    height: 600px; 
    background: blue; 
} 

.field { 
    background: green; 
}