Как обрабатывать дочерний элемент как отдельный от его родителя в html [duplicate]

mysqladmin version ИЛИ mysqladmin -V

262
задан Jonathon Watney 2 September 2009 в 18:52
поделиться

16 ответов

Событие пузырится до самой высокой точки в DOM, в которой было добавлено событие клика. Таким образом, в вашем примере, даже если у вас не было каких-либо других явно изменяемых элементов в div, каждый дочерний элемент div мог бы вывести свой клик по событию до DOM до тех пор, пока обработчик события DIV не поймает его.

Существует два решения, чтобы проверить, кто из них инициировал событие. 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;
});

Вы также можете присоединить обработчик события клика к вашим ссылкам, которые сообщают им о [bg] остановке события [gg] после выполнения их собственного обработчика :

$("#clickable a").click(function(e) {
   // Do something
   e.stopPropagation();
});
353
ответ дан muffinrain 21 August 2018 в 18:33
поделиться
  • 1
    Отличный ответ. Приятно знать, что есть варианты. – Jonathon Watney 2 September 2009 в 18:42
  • 2
    +1! Прикрепление обработчика щелчка с stopPropagation - очень хороший трюк, спасибо! – Thomas 27 March 2012 в 13:45
  • 3
    если бы у вас была куча элементов, которые вы хотели предотвратить распространение, вы могли бы найти их родительский элемент и голову, чтобы он не стал пузыряться там тоже. Поэтому вместо того, чтобы перехватывать все ссылки в div, скажем, например, просто перехватите клик даже на самом div и не дайте ему двигаться дальше, и вы настроены. – sucitivel 9 November 2012 в 17:28
  • 4
    Использование if( e.target !== this) return; в родительском объекте лучше, чем e.stopPropagation() в ребёнке, поскольку вы никогда не знаете, добавляет ли кто-нибудь другой обработчик для детей, или если библиотека должна присоединить обработчик к ребенку (и вы не хотите путаться с ним с кодом библиотеки). Это лучшее разделение проблем. – UTF_or_Death 21 October 2016 в 17:01
  • 5
    Ввод проверки if( e.target !== this) return; в родительском означает, что если кто-либо из других дочерних элементов этого родителя, у которого нет собственных обработчиков onClick, щелкнут, то ничего не произойдет. Поэтому это бесполезно для ситуации, когда у вас есть, например, интерактивный родительский div. e.stopPropagation() работает отлично. – derf26 25 April 2018 в 16:26

Использование return false; или e.stopPropogation(); не позволит выполнить дальнейший код. Он остановит поток в этой точке.

8
ответ дан albertjan 21 August 2018 в 18:33
поделиться
  • 1
    Да, это важно - натолкнулся на это сам. Но ответ выше от Rex полезен - может получить элемент, который был нажат, и в некоторых случаях использовать его в логике, которую вы пытаетесь остановить. .target.nodeName было также полезно, чтобы получить четкое представление о том, что было поражено. – Watercayman 9 May 2016 в 20:33
<a onclick="return false;" href="http://foo.com">I want to ignore my parent's onclick event.</a>
-6
ответ дан andres descalzo 21 August 2018 в 18:33
поделиться

Используйте метод stopPropagation , см. пример:

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

Как сказано в jQuery Docs:

stopPropagation метод предотвращает событие от барботажа дерева DOM, предотвращающее уведомление родительских обработчиков о событии.

Имейте в виду, что это не мешает другим слушателям обрабатывать это событие (например, более одного обработчик клика для кнопки), если это не желаемый эффект, вы должны использовать stopImmediatePropagation.

84
ответ дан Cleiton 21 August 2018 в 18:33
поделиться
  • 1
    +1 Это был идеальный ответ, который я искал. – James 8 July 2010 в 00:39

Написание, если кому-то понадобится (работал для меня):

event.stopImmediatePropagation()

Из этого решения.

4
ответ дан Community 21 August 2018 в 18:33
поделиться

Если вы в любом случае не собираетесь взаимодействовать с внутренним элементом / s, тогда вам может быть полезно решение CSS.

Просто установите внутренний элемент / s в pointer-events: none

в вашем случае:

.clickable > a {
    pointer-events: none;
}

или для цели всех внутренних элементов:

.clickable * {
    pointer-events: none;
}

Этот легкий взлом спас меня много времени при разработке с помощью ReactJS

Поддержка браузера можно найти здесь: http://caniuse.com/#feat=pointer-events

7
ответ дан Human Askari 21 August 2018 в 18:33
поделиться

Если у вас есть несколько элементов в интерактивном div, вы должны сделать это:

$('#clickable *').click(function(e){ e.stopPropagation(); });
7
ответ дан Ivan Ivković 21 August 2018 в 18:33
поделиться

Вам нужно остановить событие от достижения (пузырьки) родителя (div). См. Здесь информацию о пузырьках здесь и jQuery-специфическую информацию API здесь .

1
ответ дан Matt Ball 21 August 2018 в 18:33
поделиться
  • 1
    Круто. Спасибо за информацию о пузырьках событий. – Jonathon Watney 2 September 2009 в 18:40

Все решение сложное и jscript. Вот простейшая версия:

var IsChildWindow=false;

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


function ChildClick()
{
    IsChildWindow=true;
    //Do ur work here    
}
-3
ответ дан Nate 21 August 2018 в 18:33
поделиться
  • 1
    я думаю, что вы допустили ошибку в строке IsChildWindow == false; & quot; - не должно быть & quot; IsChildWindow = false; & quot ;? – Andre Schweighofer 26 January 2012 в 14:31

вы также можете попробовать

$("#clickable").click(function(event) {
   var senderElementName = event.target.tagName.toLowerCase();
   if(senderElementName === 'div')
   {
       // do something here 
   } 
   else
   {
      //do something with <a> tag
   }
});
11
ответ дан Rashad Annara 21 August 2018 в 18:33
поделиться
  • 1
    хороший трюк! это спасло мое время! спасибо – peiman F. 22 July 2016 в 15:01

Здесь мое решение для всех, кто ищет код не-jQuery (чистый javascript)

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

Ваш код не будет выполнен, если нажать на дочерние элементы родителя

34
ответ дан Sabaz 21 August 2018 в 18:33
поделиться

Вот пример использования Angular 2 +

Например, если вы хотите закрыть Modal Component, если пользователь нажимает на него:

// 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();
}
3
ответ дан Steve Brush 21 August 2018 в 18:33
поделиться

добавьте 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;
   });
-3
ответ дан TheVillageIdiot 21 August 2018 в 18:33
поделиться

Чтобы указать некоторый вспомогательный элемент как unclickable, пишите иерархию css, как в примере ниже.

В этом примере я прекращаю распространение любых элементов (*) внутри td внутри tr внутри таблицы с классом " .subtable "

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

});
0
ответ дан user3202819 21 August 2018 в 18:33
поделиться

Если у кого-то возникла эта проблема с использованием React, я решил ее так.

scss:

ArrayList<Integer> inputA = input.subList(0, input.size()/2);
// where 'input' is a prepouplated ArrayList<Integer>
[g2] render компонента (): [/g2] ArrayList [g3] Благодаря добавлению функции onClick для дочерних модальных (content div) событий щелчка мышью предотвращается достижение функции closeLogin родительского элемента. [/g3] [g4] Это помогло мне, и я был возможность создать модальный эффект с 2 простыми делами. [/G4]
0
ответ дан Claudio 1 November 2018 в 11:08
поделиться
[g2] [g0] [f1] [f2] [/g0] [/g2]
0
ответ дан Pramod Kharade 1 November 2018 в 11:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: