Tengo una función javascript que estoy escribiendo que se usa para incluir un archivo JS externo, pero solo una vez. La razón por la que necesito una función así es porque se llama cuando se carga contenido a través de AJAX y necesito ejecutar código específico de la página para ese contenido (no, solo usar .live
no lo cubrirá).Dinámicamente incluyendo archivos javascript una sola vez
Aquí está mi intento, acortado por razones de brevedad:
$.include_once = function(filename) {
if ($("script[src='" + filename + "']").length === 0) {
var $node = $("<script></script>")
.attr({
src : filename,
type : "text/javascript"
})
;
$(document.body).append($node);
}
};
Esto funciona bien: la función se llama, se carga el archivo externo, y ese archivo se ejecuta cuando se carga. Perfecto.
El problema es que siempre volverá a cargar ese archivo externo: la consulta que estoy usando para verificar la presencia del script ¡no encuentra nada!
Al depurar esto, añade algunas líneas:
alert($("script").length); // alerts: 4
$(document.body).append($node);
alert($("script").length); // alerts: 4
mirando en la fuente dinámica (en la ficha HTML de Firebug), no puedo encontrar la etiqueta de script en absoluto.
Sé que podría mantener una serie de archivos que he incluido anteriormente, pero esperaba ir con un método como este, que (si funciona), parece un poco más robusto, ya que no todos los archivos JS se están incluyendo de esta manera.
¿Alguien puede explicar el comportamiento visto en este segundo fragmento?
Excelente respuesta. Pensé que jQuery estaba siendo demasiado listo para sí mismo o algo así. – nickf
@nickf: Me siento así por la mayoría de las entrañas de jQuery (siendo demasiado inteligente); supongo que hay muchos males necesarios. –