Хорошая новость:
Это на 100% работает.
Просто добавьте что-нибудь внутри тега скрипта, например alert('voila!');
. Правильный вопрос, который вы, возможно, захотите задать, возможно, «Почему я не увидел его в DOM?» .
Карл Сведберг сделал приятное объяснение комментарию посетителя на сайте jQuery API . Я не хочу повторить все его слова, вы можете прочитать прямо там здесь (мне было трудно ориентироваться в комментариях там) .
Все методы вставки jQuery используют
функция domManip внутренне для
очистить / обработать элементы до и
после того, как они вставлены в DOM.
Одна из вещей, которые domManip
Функция вытащить любой скрипт
элементы, которые собираются вставить и запустить
их через "рутину evalScript"
а не вводить их с остальными
фрагмента DOM. Вставляет
скрипты отдельно, оценивает их,
а затем удаляет их из DOM.
Я считаю, что одна из причин jQuery
делает это, чтобы избежать "Разрешения
Отказано в "ошибках, которые могут возникнуть в
Internet Explorer при вставке
сценарии при определенных обстоятельствах.
Это также избегает неоднократно
вставка / оценка того же скрипта
(что может привести к
проблемы), если он находится в пределах
элемент, который вы вставляете и
затем двигаясь вокруг DOM.
Следующим шагом я подведу итог плохих новостей, используя функцию .append()
для добавления сценария.
И Плохие новости это ..
Вы не можете отладить свой код.
Я не шучу, даже если вы добавите ключевое слово debugger;
между строкой, которую вы хотите установить в качестве точки останова, в итоге вы получите только стек вызовов объекта, не увидев точку останова в исходном коде, (не говоря уже о том, что это ключевое слово работает только в браузере webkit, во всех других основных браузерах это ключевое слово пропускается) .
Если вы полностью понимаете, что делает ваш код, это будет незначительным недостатком. Но если вы этого не сделаете, вы в конечном итоге добавите ключевое слово debugger;
повсюду, чтобы узнать, что не так с вашим (или моим) кодом. В любом случае, есть альтернатива, не забывайте, что javascript может манипулировать HTML DOM.
Обход.
Использование JavaScript (не jQuery) для управления HTML DOM
Если вы не хотите терять возможность отладки, тогда вы можете использовать нативную манипуляцию HTML DOM на JavaScript. Рассмотрим этот пример:
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "path/to/your/javascript.js"; // use this for linked script
script.text = "alert('voila!');" // use this for inline script
document.body.appendChild(script);
Вот оно, как в старые добрые времена, не так ли? И не забывайте очищать вещи, будь то в DOM или в памяти, для всех объектов, на которые ссылаются и которые больше не нужны, чтобы предотвратить утечки памяти. Вы можете рассмотреть этот код, чтобы очистить вещи:
document.body.removechild(document.body.lastChild);
delete UnusedReferencedObjects; // replace UnusedReferencedObject with any object you created in the script you load.
Недостаток этого обходного пути заключается в том, что вы можете случайно добавить дубликат сценария, и это плохо. Отсюда вы можете немного имитировать функцию .append()
, добавив проверку объекта перед добавлением и удалив сценарий из DOM сразу после его добавления. Рассмотрим этот пример:
function AddScript(url, object){
if (object != null){
// add script
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "path/to/your/javascript.js";
document.body.appendChild(script);
// remove from the dom
document.body.removeChild(document.body.lastChild);
return true;
} else {
return false;
};
};
function DeleteObject(UnusedReferencedObjects) {
delete UnusedReferencedObjects;
}
Таким образом, вы можете добавить скрипт с возможностью отладки, в то же время не подвергаясь дублированию скриптов. Это всего лишь прототип, вы можете расширить его так, как хотите. Я использовал этот подход и вполне доволен этим. Конечно же, я никогда не буду использовать jQuery .append()
для добавления скрипта.