#javascript #html #jquery
Вопрос:
Я хочу динамически импортировать jQuery в файл JS. Вот мой код:
(function() {
var head = document.querySelector("head")[0];
if (head.classList.contains("En-Script") == true) {
head.classList.add("En-Script");
var script = document.createElement("SCRIPT");
let EnScript = document.querySelector(".En-Script");
script.type = "text/javascript";
script.src = "./jquery-3.6.0.min.js";
EnScript.appendChild("script");
} else {
console.log("class_list_added_for_further_process");
}
$(document).ready(function() {
console.log("jquery added successfully")
});
})();
Комментарии:
1. Используйте только теги, связанные с вашим вопросом, и прочитайте их описание.
css
не имеет отношения к вашему вопросу иscript
говоритDON'T USE THIS TAG! Every SO question is about scripts one way or another
. И особенно, как новичку, вам следует использовать форматирование кода.2. Какие проблемы у вас с вашим кодом? Вы получаете какие-либо сообщения об ошибках в консоли разработчика вашего браузера.
3. Какова цель этого условия
if (head.classList.contains("En-Script") == true) {
, почему у вас это есть в вашем коде?4. На самом деле существует проблема под названием «неожиданный токен», я попытался добавить условие для добавления класса, а затем, добавив класс, я могу добавить в него тег дочернего сценария
5. Отредактированный вопрос мне очень помогает, спасибо 🙏
Ответ №1:
Есть несколько ошибок, вы проверяли, есть ли у head класс "En-Script"
, а затем добавили класс в head, поэтому я изменил проверку, чтобы это имело смысл. Затем вы выбирали головку, с помощью querySelector
которой возвращается только 1 значение и с помощью [0]
которой будет работать, если вы используете querySelectorAll
вместо этого.
Затем вы должны добавить функцию jquery $(document)
после загрузки скрипта, поэтому я добавил a script.onload
для достижения этой цели.
Кроме того, когда вы добавляете ребенка, вы должны отправлять созданный вами объект, а не строку, поэтому вместо этого EnScript.appendChild("script");
Я использовал head.appendChild(script);
(function() {
var head = document.querySelector("head");
if (!head.classList.contains("En-Script")) {
head.classList.add("En-Script");
var script = document.createElement('script');
script.type = "text/javascript";
script.src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js";
script.onload = function() {
$(document).ready(function() {
console.log("jquery added successfully")
});
};
head.appendChild(script);
} else {
console.log("class_list_added_for_further_process");
}
})();
Ответ №2:
В вашем коде есть различные проблемы.
querySelector
возвращает один элемент, а не массив, поэтомуdocument.querySelector("head")[0]
не имеет смысла.- С
if (head.classList.contains("En-Script") == true) {
вами проверьте , есть лиhead
у вас классEn-Script
, что не имеет смысла в сочетании сhead.classList.add("En-Script")
- Также добавление класса в заголовок, чтобы проверить, загружен ли сценарий, вероятно, не лучший подход, если вы хотите добавить класс или атрибут данных в
script
добавляемый элемент. - Если у вас уже есть
head
, почему вы используетеlet EnScript = document.querySelector(".En-Script");
, чтобы запросить его снова? EnScript.appendChild("script");
пытается добавить тестовую строку с содержимымscript
EnScript
, а не с элементом, который вы создали и сохранили вscript
переменной.$(document).ready(function() {
не будет ждать, пока скрипт загрузится.- Вызов
.ready(
при динамической загрузке jQuery также не имеет особого смысла, поскольку DOM уже прочитан.
Вот как может выглядеть загрузка сценария:
(function() {
var head = document.querySelector("head");
var script = document.createElement("script");
script.type = "text/javascript";
script.onload = function() {
// called when the script is loaded and ready to use
console.log("jquery added successfully")
}
script.src = "https://code.jquery.com/jquery-3.6.0.slim.min.js";
head.appendChild(script);
})();
Комментарии:
1. Да, у вас есть точная проблема , я думаю, что мне нужно посмотреть некоторые учебные пособия по этому вопросу, а также прочитать несколько книг перед практическими занятиями, спасибо, сэр
2. Да, решение сработало, спасибо