2017-01-20 4 views
4

Ich habe einen Container <div>, der divs dynamisch angehängt hat. Die divs sind click Handles durch das body Element, wie folgt: $(body).on("click",".divClass",function); (Ich tat es so, so dass die Bindungen auf die dynamisch hinzugefügten Elemente können alle an einer Stelle im Code erfolgen, und Tonnen von Bindungen zu verhindern). Ich muss ein auf das Container-Div setzen, so dass das Klick-Handle auf seinem Eltern nicht ausgelöst wird. Das Problem ist, wenn ich in die stopPropagation auf dem Container div, stoppt es das Kind div Auslösung (da es tatsächlich der Körper ist, der die Bindung hat, nicht die Kind div)

Hier ist eine Geige, die meine zeigt Problem:

$("#A").click(function() { 
 

 
    console.log('This event should not fire when clicking innermost') 
 

 
}); 
 

 
$("#B").click(function(e) { 
 

 
    e.stopPropagation(); 
 

 
}); 
 

 
$("body").on("click", "#C", function() { 
 

 
    console.log('This event should fire when clicking innermost') 
 

 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="A"> 
 
    outermost&nbsp; 
 
    <div id="B"> 
 
    middle&nbsp; 
 
    <div id="C"> 
 
     innermost 
 
    </div> 
 
    </div> 
 
</div>

+0

[A bizarr ähnliche Frage] (http://stackoverflow.com/questions/41598293/event-propagation-issue/41598470) – lonesomeday

+0

@lonesomeday woah ..... Ich schwöre, Ich habe ihr Schnipsel nicht angeschaut, aber das ist meinem Schnipsel unheimlich ähnlich. Die Bindungen sind jedoch in den Elterndivs in meiner Frage etwas anders. –

+0

Ihr Ereignishandler für #C wird geschehen, nachdem B und A aufgetreten sind. Sie können nichts tun, ohne die Ereignisdelegierung zu verwenden oder die Weitergabe nicht zu stoppen. –

Antwort

2

ich die anderen Kinder wollen als normal propagieren, nur die Kinder in #B sollte nicht ausbreiten.

Wenn Sie dies berücksichtigen, war Ihr ursprünglicher Code nicht zu weit entfernt. Wenn Sie sehen, dass Sie direkt an #B in Ihrem Beispiel gebunden sind, gehe ich davon aus, dass #B statisch ist.

In diesem Fall #B als statische Referenz anstelle von body verwenden.

$("#A").click(function(e) { 
 
    console.log('This event should not fire when clicking innermost') 
 
}); 
 

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

 
$("#B").on("click", "#C", function(e) { 
 
    console.log('This event should fire when clicking innermost') 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="A"> 
 
    outermost&nbsp; 
 
    <div id="B"> 
 
    middle&nbsp; 
 
    <div id="C"> 
 
     innermost 
 
    </div> 
 
    </div> 
 
</div>

+0

Was ist, wenn ein Kind von '# A' anders als' # B' angeklickt wird, falls es ein anderes Kind gibt? –

+0

ja, in meinem Fall hat #A noch andere Kinder, also wird das leider nicht funktionieren. (Ich möchte, dass sich die anderen Kinder normal fortpflanzen, nur die Kinder in #B sollten sich nicht verbreiten) –

+0

@PranavCBalan Der Code in '# A' wird nur ausgeführt, wenn' # A' angeklickt wird und ignoriert alle untergeordneten Elemente. – Nope

2

Ich denke, das ganze Problem viel einfacher wäre, wenn Sie den delegierte Handler #B an erster Stelle gebunden. Dann müssen die Ereignisse nicht auf die body und stopPropagation Blase den gewünschten Effekt haben.

$("#A").click(function() { 
 
    console.log('This event should not fire when clicking innermost') 
 
}); 
 

 
$("#B").on("click", "#C", function(e) { 
 
    e.stopPropagation(); 
 
    console.log('This event should fire when clicking innermost') 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="A"> 
 
    outermost&nbsp; 
 
    <div id="B"> 
 
    middle&nbsp; 
 
    <div id="C"> 
 
     innermost 
 
    </div> 
 
    </div> 
 
</div>

Verwandte Themen