434

現在、jQuery を使用して div をクリック可能にしています。この div にはアンカーもあります。私が直面している問題は、アンカーをクリックすると、両方のクリック イベントが発生することです (div とアンカーの場合)。アンカーがクリックされたときに div の onclick イベントが発生しないようにするにはどうすればよいですか?

壊れたコードは次のとおりです。

JavaScript

var url = $("#clickable a").attr("href");

$("#clickable").click(function() {
    window.location = url;
    return true;
})

HTML

<div id="clickable">
    <!-- Other content. -->
    <a href="http://foo.com">I don't want #clickable to handle this click event.</a>
</div>
4

25 に答える 25

549

イベントは、クリック イベントが関連付けられている DOM の最高点にバブルします。したがって、あなたの例では、div に他の明示的にクリック可能な要素がなくても、div のすべての子要素は、DIV のクリック イベント ハンドラーがそれをキャッチするまで、クリック イベントを DOM にバブルします。

これには 2 つの解決策があります。それは、誰が実際にイベントを開始したかを確認することです。jQuery は、イベントとともに eventargs オブジェクトを渡します。

$("#clickable").click(function(e) {
    var senderElement = e.target;
    // Check if sender is the <div> element e.g.
    // if($(e.target).is("div")) {
    window.location = url;
    return true;
});

クリック イベント ハンドラーをリンクにアタッチして、独自のハンドラーの実行後にイベント バブリングを停止するように指示することもできます。

$("#clickable a").click(function(e) {
   // Do something
   e.stopPropagation();
});
于 2009-09-02T17:26:13.400 に答える
120

stopPropagationメソッドを使用します。例を参照してください。

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

jQuery Docsで述べたように:

stopPropagationメソッドは、イベントが DOM ツリーをバブリングするのを防ぎ、親ハンドラーにイベントが通知されるのを防ぎます。

他のリスナーがこのイベントを処理するのを妨げないことに注意してください (例: ボタンの複数のクリック ハンドラー)。それが目的の効果でない場合は、stopImmediatePropagation代わりに使用する必要があります。

于 2009-09-02T17:24:37.413 に答える
65

ここでは、jQuery 以外のコード (純粋な JavaScript) を探しているすべての人のための私のソリューションを示します。

document.getElementById("clickable").addEventListener("click", function( e ){
    e = window.event || e; 
    if(this === e.target) {
        // put your code here
    }
});

親の子をクリックした場合、コードは実行されません

于 2015-04-07T18:53:19.843 に答える
10

誰かが必要な場合に書く(私のために働いた):

event.stopImmediatePropagation()

このソリューションから。

于 2016-07-26T10:42:23.873 に答える
8

クリック可能な div に複数の要素がある場合は、次のようにする必要があります。

$('#clickable *').click(function(e){ e.stopPropagation(); });
于 2012-08-11T10:15:32.213 に答える
8

return false;orを使用e.stopPropogation();すると、それ以上コードを実行できなくなります。この時点で流れが止まります。

于 2015-04-15T15:27:09.250 に答える
3

Angular 2+ を使用した例を次に示します。

たとえば、ユーザーがモーダル コンポーネントの外側をクリックした場合にモーダル コンポーネントを閉じるには、次のようにします。

// Close the modal if the document is clicked.

@HostListener('document:click', ['$event'])
public onDocumentClick(event: MouseEvent): void {
  this.closeModal();
}

// Don't close the modal if the modal itself is clicked.

@HostListener('click', ['$event'])
public onClick(event: MouseEvent): void {
  event.stopPropagation();
}
于 2017-08-25T18:16:49.840 に答える
3

var inner = document.querySelector("#inner");
var outer = document.querySelector("#outer");
inner.addEventListener('click',innerFunction);
outer.addEventListener('click',outerFunction);

function innerFunction(event){
  event.stopPropagation();
  console.log("Inner Functiuon");
}

function outerFunction(event){
  console.log("Outer Functiuon");
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Pramod Kharade-Event with Outer and Inner Progration</title>
</head>
<body>
<div id="outer" style="width:100px;height:100px;background-color:green;">
  <div id="inner" style="width:35px;height:35px;background-color:yellow;"></div>
</div>
</body>
</html>

于 2018-10-11T04:29:02.043 に答える
1

イベントが親 (div) に到達 (バブリング) しないようにする必要があります。バブリングに関する部分はこちら、jQuery 固有の API 情報はこちらを参照してください。

于 2009-09-02T17:27:27.157 に答える
0

一部のサブ要素をクリックできないように指定するには、次の例のように css 階層を記述します。

この例では、クラス「.subtable」を持つテーブル内の tr 内の td 内の要素 (*) への伝播を停止します

$(document).ready(function()
{    
   $(".subtable tr td *").click(function (event)
   {
       event.stopPropagation();
   });

});
于 2014-01-16T14:18:09.953 に答える
-3

すべてのソリューションは複雑で、jscript です。最も単純なバージョンは次のとおりです。

var IsChildWindow=false;

function ParentClick()
{
    if(IsChildWindow==true)
    {
        IsChildWindow==false;
        return;
    }
    //do ur work here   
}


function ChildClick()
{
    IsChildWindow=true;
    //Do ur work here    
}
于 2011-02-23T06:44:54.647 に答える
-3

次のように追加aします。

<a href="http://foo.com" onclick="return false;">....</a>

または次return false;のようなクリックハンドラから#clickable

  $("#clickable").click(function() {
        var url = $("#clickable a").attr("href");
        window.location = url;
        return false;
   });
于 2009-09-02T17:27:20.620 に答える
-5
<a onclick="return false;" href="http://foo.com">I want to ignore my parent's onclick event.</a>
于 2009-09-02T17:25:13.807 に答える