Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

AndréAraujo

Areá clicável dentro de área clicável

Recommended Posts

Olá, estou precisando inserir um botão delete dentro de cada item de uma lista que já tem uma função 

especifica para selecioná-la, alguém sabe se tem um modo de executar esta ação sem gerar o conflito abaixo?

Segue minha ideia inicial:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Documento sem título</title>
    <link href="https://use.fontawesome.com/releases/v5.0.6/css/all.css" rel="stylesheet">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
</head>
<body>
	<style>
        #list ul{
            margin:0;
            padding:0;
        }
        #list ul li{
            width:300px;
            height:30px;
            background-color:#F60;
            margin-bottom:10px;
            padding:10px;
            list-style:none;
        }
        #list ul li span{
            line-height:30px;
            color:#FFF;
            font-family:Gotham, "Helvetica Neue", Helvetica, Arial, sans-serif;
            font-size:14px;
        }
        #list ul li i{
            line-height:30px;
            color:#FFF;
            font-size:14px;
            float:right;
        }
		#list ul li.active{
			background-color:#F30;
		}
    </style>
	<div id="list">
        <ul>
        	<li><span>Item 1</span><i class="fa fa-times"></i></li>
        	<li><span>Item 2</span><i class="fa fa-times"></i></li>
        	<li><span>Item 3</span><i class="fa fa-times"></i></li>
        	<li><span>Item 4</span><i class="fa fa-times"></i></li>
        </ul>
    </div>
    <script>
    	$(document).on('click', '#list ul li', function(){
			$('#list ul li').removeClass("active");
			$(this).addClass('active').fadeIn(200);
			alert("Você selecionou o " + $(this).text());
		});
		$(document).on('click', 'i.fa-times', function(){
			alert("Você removeu o " + $(this).parent().find('span').text());
			$(this).parent().remove();
		});
    </script>
</body>
</html>

Agradeço a atenção!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem vários meios de se resolver seu problema.

 

A primeira solução seria se aproveitar do fato que alguns eventos como o click se propagam dos elementos pais para os filhos(capturing phase)

<html>
  <body>
    <div id="list">
      <ul>
        <li>
          <i class="fa fa-times">

e novamente dos filhos para os pais(bubbling).

<i class="fa fa-times">
  <li>
    <ul>
      <div id="list">
        <body>
          <html>

normalmente você trabalha com o último tipo de propagação(bubbling), com isso em mente podemos nos aproveitar do fato de que o click ocorrera primeiro no <i class="fa fa-times"> e nele podemos interromper a propagação chamando o método stopPropagation do objeto evento que é passado como argumento.

 

Para isso basta alterar o seguinte bloco de:

$(document).on('click', 'i.fa-times', function(){

para:

$(document).on('click', 'i.fa-times', function(evt /* Argumento que recebe os dados do evento */){
  //https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation
  evt.stopPropagation();//Impede que o evento se propague para o elemento e pai

Você pode ver e testar esse método em https://jsfiddle.net/w9kk74qe/4/.

 

A segunda solução seria no evento de seleção testar se o alvo do clique foi o <i class="fa fa-times"> e  não seguir adiante.

 

Para isso você deve alterar o seguinte bloco de:

$(document).on('click', '#list ul li', function(){

para:

$(document).on('click', '#list ul li', function(evt /* Argumento que recebe os dados do evento */){
  //http://api.jquery.com/is/
  if($(evt.target).is('i.fa-times')) //Caso o alvo do clique seja o elemento com a função de remover
  	return; //Retorna imediatamente

Você pode testar esse método em https://jsfiddle.net/w9kk74qe/15/.

 

Uma terceira solução seria alterar o evento de seleção para capturar somente os cliques realizados no span visto que o <i class="fa fa-times">  não está dentro dele, porem uma consequência disso seria a de que a pessoa teria que clicar no texto e não mais em qualquer área do li.

 

Para isso você deveria alterar o seguinte bloco de:

$(document).on('click', '#list ul li', function(){
  $('#list ul li').removeClass("active");
  $(this).addClass('active').fadeIn(200);

Para:

$(document).on('click', '#list ul li span' /* alterado o elemento de captura */, function(){
  $('#list ul li').removeClass("active");
  //http://api.jquery.com/parent/
  $(this).parent().addClass('active').fadeIn(200); //Devida a alteração do elemento é necessário setar a classe no pai

Você pode testar esse método em https://jsfiddle.net/w9kk74qe/18/.

 

Outros métodos envolvem você reestruturar sua marcação e por consequência os estilos por este motivo não vou falar sobre eles.

 

Para mais informações sobre a propagação dos eventos você pode consultar os seguintes links:

https://javascript.info/bubbling-and-capturing

https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá HwapX, muito obrigado por sua ajuda, acabei optando pela

primeira solução pois se encaixou perfeitamente o código e exigiu

menos alterações, eu já tinha uma estrutura grande voltada para

esse código e tive um pouco de medo de ter que refaze-lá.

Mais uma vez muito obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Pessoal, pergunta bem simples. Abaixo tenho o seguinte código:
       
      <script>
      function alerta()
      {
        if (window.confirm("Você realmente quer sair?")) {
          window.open("sair.html");
      }
      }
      </script>
       
      Funciona perfeitamente, só que está abrindo em outra janela e quero que abra na mesma janela.
       
      Alguém pode me ajudar?
    • Por Giovanird
      Olá a todos!
      Tenho uma pagina que possui uma DIV onde coloquei uma pagina PHP.
      Uso a função setInterval para atualizar a pagina inclusa dentro da DIV.
      O problema é que ao acessar o site , a DIV só me mostra a pagina inclusa somente quando completo o primeiro minuto.
      Preciso que a pagina inclusa já inicie carregada
       
      Meu código JavaScript e a DIV com a pagina PHP
       
      <script> function atualiza(){ var url = 'direita.php'; $.get(url, function(dataReturn) { $('#direita').html(dataReturn); }); } setInterval("atualiza()",60000); </script> <div> <span id="direita"></span> </div>  
    • Por Thiago Duarte
      Oi, gostaria de arrastar imagem e ao soltar formar bloco html, meu bloco de html ficaria com nome, content-1.html, content-2.html, etc
       
      Alguem pode me ajudar?
    • Por juliosonic
      Boa noite..
      Estou desenvolvendo um site de https://www.maithunatantra.com.br/ e estou com um duvida sobre o menu de navegação da versão mobile.
      O menu que tem o dropdown "Terapeutas" e "Terapias" quando clico em cima ele expande como deve ser, mas quando clico denovo para recolher os submenus
      nao acontece nada.. segue o trecho do codigo do menu..
      <div class="collapse navbar-collapse" id="navbarsExample09">             <ul class="navbar-nav ml-auto">               <li class="nav-item  active"><a class="nav-link" href="index.html">Home</a></li>               <li class="nav-item  active"><a class="nav-link" href="about-us.html">Quem Somos</a></li>               <li class="nav-item dropdown1">                     <a class="nav-link dropdown-toggle" data-toggle="dropdown1" href="#">Terapeutas</a>                     <ul class="dropdown-menu">                         <li><a class="dropdown-item" href="terapeuta-julio-cezar.html">Julio Cezar</a></li>                         <li><a class="dropdown-item" href="terapeuta-pamela-priscila.html">Pamela Priscila</a></li>                     </ul>                                    </li>               <li class="nav-item dropdown">                     <a class="nav-link dropdown-toggle" data-toggle="dropdown1" href="#">Terapias</a>                     <ul class="dropdown-menu" aria-labelledby="dropdown01">                         <li><a class="dropdown-item" href="o-que-e-reiki.html">O que é Reiki</a></li>                         <li><a class="dropdown-item" href="beneficios-reiki.html">Benefícios do Reiki</a></li>                         <li><a class="dropdown-item" href="principios-reiki.html">Princípios do Reiki</a></li>                         <li><a class="dropdown-item" href="animais-reiki.html">Reiki em Animais</a></li>                         <li><a class="dropdown-item" href="animais-reiki.html">Estudos Sobre Reiki</a></li>                         <li><a class="dropdown-item" href="terapia-massagem-tantrica.html">Terapia Tântrica</a></li>                     </ul>               </li>               <li class="nav-item  active"><a class="nav-link" href="blog.html">Blog</a></li>                <li class="nav-item"><a class="nav-link" href="contato.html">Contato</a></li>             </ul>         </div>  
      Massagem Tantrica em Curitiba
      Tantra Curitiba
      Massagem Tântrica
      Tantra
      Julio Darshan

      Obrigado
      Att
      Julio Cezar
       
       
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.