2012-08-08 10 views
7

Estoy usando este código para mostrar una alerta en un cierto elemento:jQuery alert onclick en el hijo del elemento?

$("#resultsBox").click(function (event) { 
    console.log('a'); 
    }); 

Quiero mostrar una alerta sólo cuando se hace clic en los elementos 'li' dentro '' #resultsBox.

Estoy tratando de hacerlo de esta manera:

$("#resultsBox li").click(function (event) { 
    console.log('a'); 
    }); 

Esto se estructura #resultsBox del elemento:

<div id="resultsBox"> 
    <ul> 
    <li></li> 
    <li></li> 
    </ul> 
</div> 

¿Cómo puede hacerse esto?

+3

¿Qué pasa con eso? No funciona? Debería ... – elclanrs

+0

Y? ¿Cuál es el problema? Se ve bien. – Strelok

+0

Eso debería funcionar. ¿Quizás estás agregando los elementos 'li' dinámicamente? ¿O quizás el HTML no es válido y de alguna manera está estropeando el selector? – jeff

Respuesta

15

Al enlazar un controlador de eventos con .click() se aplica a todos los elementos que coincidan con su selector de en ese momento, no a los elementos añadidos posteriormente de forma dinámica.

Dado el div se llama "resultsBox", parece razonable suponer que en realidad se está agregando cosas a ella de forma dinámica para mostrar los resultados de alguna otra operación, en cuyo caso es necesario utilizar un controlador de eventos delegada:

$("#resultsBox").on("click", "li", function (event) { 
    console.log('a'); 
}); 

Esta sintaxis del .on() method vincula un controlador a "#resultsBox", pero cuando se produce el clic jQuery comprueba si estaba en un elemento secundario que coincide con el selector "li" en el segundo parámetro; si es así llama a su función, de lo contrario no.

+0

¿Es esto válido? ¿Estás seleccionando 'li' y pasando' li' en el segundo arg? – Jashwant

+0

Has editado tu pregunta, mi comentario no es válido ahora;) – Jashwant

+0

Lo siento @Jashwant, tienes razón, pero noté ese error y lo eliminé. – nnnnnn

0

actualización después de edición de preguntas:

<div id="resultsBox"> 
    <ul id="myList"> 
    <li></li> 
    <li></li> 
    </ul> 
</div> 


$("#myList > li").click(function (event) { 

     console.log('a'); 

     }); 

Demo

+1

Esto no funcionará. 'li' no es descendiente directo de' # resultsBox' – Jashwant

+0

De acuerdo, pero esta pregunta se agregó antes de que se editara la pregunta y se dijo que 'haga clic en elementos 'li' dentro de '# resultsBox'' –

+0

También puede editar su respuesta :) – Jashwant

1

Algo como esto debería funcionar

$("#resultsBox").find("li").click(function(){ 
    alert("You clicked on li " + $(this).text()); 
}); 

Esto debería funcionar ahora: http://jsbin.com/ocejar/2/edit

Pero de todos modos, también el ejemplo anterior usando $("#resultsBox li") debería funcionar bien. Ver . Sin embargo, usando $("#resultsBox").find("li") debe ser little faster en términos de rendimiento.

+0

Lo probé y no capturó el clic. Actualicé la pregunta con el contenido de los elementos, tal vez esa es la razón por la que no funciona. – lisovaccaro

+0

@ Liso22 Actualicé mi respuesta en consecuencia – Juri

+0

El selector en la pregunta era '$ (" # resultsBox li ") ...' que ya buscará los elementos li que son descendientes (no necesariamente hijos directos) de #resultsBox. No hay '>' en el código de la pregunta. – nnnnnn

0
$("#resultsBox").find('li').click(function (event) { 
    alert($(this).text()); 
    }); 
1

Su código como lo tienes debería estar trabajando: http://jsfiddle.net/GxCCb/

Es importante señalar que los elementos que están tratando de conectar el controlador de eventos que debe existir cuando se evalúa el código. Si se agrega en un momento posterior, debe usar on() (v1.7 +) o delegate() (< 1.7), que se utiliza para la delegación de eventos y permite hacer referencia a los elementos si se agregan más tarde ...

Usando

en():

$("#resultsBox").on('click', 'li', function (event) { 
    alert(this.innerHTML); 
    }); 

demostración: http://jsfiddle.net/7Lz2Y/

Usando delegado():

$("#resultsBox").delegate('li', 'click', function (event) { 
    alert(this.innerHTML); 
    }); 

Demostración: http://jsfiddle.net/XwYs5/

Sin embargo, hay un montón de otros métodos para unir el controlador de eventos para elementos que existen antes:

$("#resultsBox").find('li').click(function (event) { 
    alert(this.innerHTML); 
    }); 

Demostración: http://jsfiddle.net/74Q7p/

$("#resultsBox ul > li").click(function (event) { 
    alert(this.innerHTML); 
    }); 

Demostración: http://jsfiddle.net/a28U5/

+0

Tiene razón acerca de los elementos que deben existir cuando se ejecuta ese código, pero los dos métodos alternativos que muestra ambos tienen el mismo problema. – nnnnnn

+0

@nnnnnn - Buen punto, he agregado un ejemplo usando 'on()' y 'delegate()' y actualicé mi respuesta para aclararme. – RobB

0

This s debería funcionar.

$("#resultsBox ul li").click(function (event) { 
    console.log('a'); 
}); 
0
$("#resultsBox").click(function (event) { 
    if(event.target.tagName.toLowerCase() == "li"){ 
     console.log('a'); 
    } 
}); 

Esto funcionará para los elementos li dinámicamente agregados.

+0

¿Es un navegador cruzado? – Jashwant

+0

Sí lo es, al vincular eventos con javascript, event.target no se identifica en Internet Explorer. Busca event.srcElement. Eso se ha manejado en jQuery perfectamente. – Ankur

Cuestiones relacionadas