2010-07-18 10 views
7

Tengo diseño web, que puede contener varios enlaces. Esos enlaces se crean dinámicamente, utilizando funciones AJAX. Y funciona bien¿Cómo trabajar con campos creados dinámicamente?

Pero no sé cómo puedo trabajar con esos "enlaces creados dinámicamente" (es decir, cómo llamar a alguna función JS o jQuery si hago clic en ellas). Supongo que ese navegador no puede reconocerlos, ya que se crean después de que se carga la página.

¿Hay alguna función que pueda "volver a procesar" mi página y elementos en ella?

Tnx en adv en su ayuda!

+2

Lea en las instalaciones jQuery "en vivo" y "delegar". – Pointy

Respuesta

6

puede utilizar el 2 métodos siguientes jQuery proporciona:

El primero, es el método .live(), y el otro es el método de .delegate().

El uso de la primera es muy simple:

$(document).ready(function() { 
    $("#dynamicElement").live("click", function() { 
     //do something 
    }); 
} 

Como se puede ver, el primer argumento es el evento que desea enlazar, y la segunda es una función que controla el evento. La forma en que esto funciona no es exactamente como una "repetición". La forma común de hacerlo ($("#dynamicElement").click(...) o $("#dynamicElement").bind("click", ...)) funciona asociando el controlador de evento de un evento determinado al elemento DOM cuando el DOM se ha cargado correctamente ($(document).ready(...)). Ahora, obviamente, esto no funcionará con elementos generados dinámicamente, porque no están presentes cuando el DOM carga primero.

La forma .live() funciona es, en lugar de asociar el controlador de ventilación para el propio elemento DOM, se adhiere con el elemento document, aprovechando la propiedad de burbujeo de JS & DOM (Al hacer clic en el elemento generado dinámicamente y no se adjunta controlador de eventos, sigue buscando hasta la parte superior hasta que encuentre uno).

Suena bastante limpio, ¿verdad? Pero hay un pequeño problema técnico con este método, como dije, conecta el manejador de eventos a la parte superior del DOM, por lo que cuando haces clic en el elemento, tu navegador debe atravesar todo el árbol DOM, hasta que encuentre el evento apropiado entrenador de animales. Proceso que es muy ineficiente, por cierto. Y aquí es donde aparece el método .delegate().

Supongamos la siguiente Estructura HTML:

<html> 
<head> 
... 
</head> 
<body> 
    <div id="links-container"> 
     <!-- Here's where the dynamically generated content will be --> 
    </div> 
</body> 
</html> 

Así, con el método .delegate(), en lugar de unirse al controlador de eventos a la parte superior de la DOM, que sólo podría adjuntarlo a un DOM padres Elemento. Un elemento DOM está seguro de que va a estar en alguna parte del contenido generado dinámicamente en el Árbol DOM. Cuanto más cerca de ellos, mejor funcionará. Por lo tanto, esto debería hacer la magia:

$(document).ready(function() { 
    $("#links-container").delegate("#dynamicElement", "click", function() { 
     //do something 
    }); 
} 

Esta fue una especie de respuesta larga, pero me gusta para explicar la teoría detrás de ella jaja.

EDIT: Debe corregir su marcado, no es válido porque: 1) Los anclajes no permiten el uso de un atributo de valor, y 2) No puede tener 2 o más etiquetas con la misma ID. Prueba esto:

<a class="removeLineItem" id="delete-1">Delete</a> 
<a class="removeLineItem" id="delete-2">Delete</a> 
<a class="removeLineItem" id="delete-3">Delete</a> 

Y para determinar cuál de los anclajes se hace clic

$(document).ready(function() { 
    $("#links-container").delegate(".removeLineItem", "click", function() { 
     var anchorClicked = $(this).attr("id"), 
      valueClicked = anchorClicked.split("-")[1];  
    }); 
} 

Con ese código, se han almacenado en la variable anchorClicked el identificador del enlace se hace clic, y en el valueClicked el número asociado al ancla.

+0

bueno, tnx a todos! pero, en mi formulario tengo varios elementos de anclaje. ¿Cómo puede el código reconocer en cuál se hizo clic? – user198003

+0

¿Puedes publicar el marcado del formulario? –

+0
0

¿Cómo se crean dinámicamente estos enlaces? Puede utilizar el selector correcto, dado que están utilizando el mismo nombre de clase o reside en la misma etiqueta, etc.

-1

Si sus enlaces entran por AJAX, puede establecer los atributos onclick en el servidor. Sólo los enlaces de salida en el AJAX como esta:

<a href="#" onclick="callYourFunctionHere();return false;">Holy crap I'm a link</a> 

El return false hace que el enlace no vuelve a cargar la página.

Espero que esto ayude!

+1

Esa no es la manera de hacerlo cuando estás usando jQuery. – Pointy

+1

Oh my gawwwwd, JavaScript en línea ES malo. Muévelo para hacer clic(): http://api.jquery.com/click/ – yclian

3

En su página de código de inicialización, puede configurar los manipuladores de la siguiente manera:

$(function() { 
    $('#myForm input.needsHandler').live('click', function(ev) { 
    // .. handle the click event 
    }); 
}); 

sólo tiene que ser capaz de identificar los elementos de entrada por clase o algo así.

+0

¿No hay amor por el "delegado"? '$ ('# myForm'). delegate (...' – James

+0

Prefiero "delegar" pero no recuerdo exactamente cuál era la sintaxis y era demasiado flojo para mirar :-) – Pointy

0

Noramlly, la respuesta del proceso navegador HTML y añadirlo al árbol DOM, pero los acontecimientos a veces, la corriente se define simplemente no funcionan, simplemente reiniciar el evento cuando u llamar a la petición ajax ..

+0

¿El evento "más antiguo"? – Pointy

+0

lo corrijo :) – shox

0

consideran el formulario HTML

<form> 
    <input type="text" id="id" name="id"/> 
    <input type="button" id="check" name="check value="check"/> 
</form> 

script de jQuery

$('#check).click(function() { 
    if($('#id).val() == '') { 
     alert('load the data!!!!); 
    } 
}); 

aquí en clic en el botón de la escritura de comprobar el valor de la Identificación del cuadro de texto a ser nulo. si es nula devolverá un mensaje de alerta .... i delgada esta es la solución que buscas .....

tienen un buen día ..

0

Todo lo que necesita hacer para trabajar con elementos creados dinámicamente es crear identificadores con los que puedes ubicarlos. Pruebe el siguiente código en la consola de Firebug o las herramientas de desarrollador para Chrome o IE.

$(".everyonelovesstackoverflow").html('<a id="l1" href="http://www.google.com">google</a> <a id="l2" href="http://www.yahoo.com">yahoo</a>'); 
$("#l1").click(function(){alert("google");}); 
$("#l2").click(function(){alert("yahoo");}); 

Ahora debe tener dos enlaces en los que el anuncio normalmente se que se han creado de forma dinámica, y que tenía un manejador onclick añadió para que aparezca una alerta (que no bloquearon el comportamiento por defecto, por lo que le causará a salir de la página.)

jQuery's .live le permitirá agregar controladores automáticamente al elemento creado recientemente.

Cuestiones relacionadas