У меня есть функция javascript, которую я пишу, которая используется для включения внешнего JS-файла, но только один раз. Причина, по которой мне нужна такая функция, заключается в том, что она вызывается, когда какой-то контент загружается через AJAX, и мне нужно запустить код для этого содержимого (нет, просто использование .live
не будет охватывать его).Динамически включая файлы javascript только один раз
Вот моя попытка, укороченная для краткости:
$.include_once = function(filename) {
if ($("script[src='" + filename + "']").length === 0) {
var $node = $("<script></script>")
.attr({
src : filename,
type : "text/javascript"
})
;
$(document.body).append($node);
}
};
Это прекрасно работает: функция вызывается, то он загружает внешний файл, и этот файл уже выполняется при загрузке. Отлично.
Проблема в том, что он всегда будет перезагружать этот внешний файл: запрос, который я использую, чтобы проверить наличие скрипта, не находит ничего!
При отладке этого, я добавил несколько строк:
alert($("script").length); // alerts: 4
$(document.body).append($node);
alert($("script").length); // alerts: 4
прогностических в динамическом источнике (вкладка HTML в Firebug), я не могу найти тег сценария на всех.
Я знаю, что я мог бы поддерживать массив файлов, которые я ранее включил, но я надеялся пойти с таким методом, который (если он сработал) кажется немного более надежным, поскольку не все файлы JS включены таким образом.
Может ли кто-нибудь объяснить поведение, наблюдаемое в этом втором фрагменте?
Отличный отклик. Я полагал, что jQuery был слишком умным для себя или чего-то другого. – nickf
@nickf: Я чувствую себя так, как большинство из встроенных jQuery (будучи слишком умным, что есть). Там, наверное, есть много необходимых зол. –