Я добавляю библиотеку jQuery в дом, используя:
var script = document.createElement('script');
script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js';
script.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(script);
Однако когда я бегу:
jQuery(document).ready(function(){...
Консоль сообщает об ошибке:
Uncaught ReferenceError: jQuery is not defined
Как мне динамически загружать jQuery, а также использовать его, когда он находится в dom?
javascript
jquery
ThomasReggi
источник
источник
Ответы:
Здесь есть рабочий JSFiddle с небольшим примером, который демонстрирует именно то, что вы ищете (если я не неправильно понял ваш запрос) : http://jsfiddle.net/9N7Z2/188/
Есть несколько проблем с этим методом динамической загрузки javascript. Когда дело доходит до самых базовых фреймворков, таких как jQuery, вы, вероятно, действительно хотите загружать их статически, потому что в противном случае вам пришлось бы написать целую структуру загрузки JavaScript ...
Вы можете использовать некоторые из существующих загрузчиков JavaScript или написать свой собственный, наблюдая за
window.jQuery
определением.// Immediately-invoked function expression (function() { // Load the script var script = document.createElement("SCRIPT"); script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'; script.type = 'text/javascript'; script.onload = function() { var $ = window.jQuery; // Use $ here... }; document.getElementsByTagName("head")[0].appendChild(script); })();
Просто помните, что если вам нужно поддерживать действительно старые браузеры, такие как IE8,
load
обработчики событий не выполняются. В этом случае вам нужно будет опросить о существованииwindow.jQuery
повторного использованияwindow.setTimeout
. Здесь есть рабочий JSFiddle с этим методом: http://jsfiddle.net/9N7Z2/3/Есть много людей, которые уже сделали то, что вам нужно. Ознакомьтесь с некоторыми из существующих фреймворков загрузчика JavaScript, например:
https://developers.google.com/loader/(больше не документировано)http://yepnopejs.com/(устарело)источник
wp_enqueue_script()
функцию для правильного включения jQuery. Документация: codex.wordpress.org/Function_Reference/wp_enqueue_script Дополнительная информация здесь: digwp.com/2009/06/including-jquery-in-wordpress-the-right-way или здесь: digwp.com/2011/09/using- вместо jquery-in-wordpressЕсть другой способ динамической загрузки jQuery ( исходный код ). Вы также можете использовать
document.write('<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"><\/script>');
Это считается плохой практикой
document.write
, но для полноты картины полезно упомянуть об этом.См. Почему document.write считается «плохой практикой»? по причинам. Про то , что
document.write
действительно блокирует страницы от загрузки других assests, поэтому нет необходимости создавать функцию обратного вызова.источник
Сайт Encosia рекомендует:
<script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript"> // You may specify partial version numbers, such as "1" or "1.3", // with the same result. Doing so will automatically load the // latest version matching that partial revision pattern // (e.g. 1.3 would load 1.3.2 today and 1 would load 1.7.2). google.load("jquery", "1.7.2"); google.setOnLoadCallback(function() { // Place init code here instead of $(document).ready() }); </script>
Но даже он признает, что когда речь заходит об оптимальной производительности, это не сравнится со следующим:
<script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js" type="text/javascript"></script> <script type="text/javascript"> window.jQuery || document.write('<script src="js/libs/jquery-1.7.2.min.js">\x3C/script>')</script> <script type="text/javascript" src="scripts.js"></scripts> </body> </html>
источник
Вам нужно запустить свой код ПОСЛЕ завершения загрузки jQuery
var script = document.createElement('script'); document.head.appendChild(script); script.type = 'text/javascript'; script.src = "//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"; script.onload = function(){ // your jQuery code here }
или если вы используете его в асинхронной функции, вы можете использовать
await
в приведенном выше кодеvar script = document.createElement('script'); document.head.appendChild(script); script.type = 'text/javascript'; script.src = "//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"; await script.onload // your jQuery code here
Если вы хотите сначала проверить, существует ли уже jQuery на странице, попробуйте это
источник
Причина, по которой вы получаете эту ошибку, заключается в том, что JavaScript не ждет загрузки скрипта, поэтому при запуске
jQuery(document).ready(function(){...
нет гарантии, что сценарий готов (и никогда не будет).
Это не самое элегантное решение, но оно работает. По сути, вы можете каждую секунду проверять, есть ли объект jQuery и запускать функцию, когда она загружена с вашим кодом. Я бы добавил тайм-аут (скажем, clearTimeout после того, как он был запущен 20 раз), чтобы остановить выполнение проверки на неопределенный срок.
var jQueryIsReady = function(){ //Your JQuery code here } var checkJquery = function(){ if(typeof jQuery === "undefined"){ return false; }else{ clearTimeout(interval); jQueryIsReady(); } } var interval = setInterval(checkJquery,1000);
источник
Используя require.js, вы можете сделать то же самое более безопасным способом. Вы можете просто определить свою зависимость от jquery, а затем выполнить нужный код, используя зависимость, когда она загружена, не загрязняя пространство имен:
Я обычно рекомендую эту библиотеку для управления всеми зависимостями от Javascript. Это просто и позволяет эффективно оптимизировать загрузку ресурсов. Однако есть некоторые меры предосторожности, которые вам могут потребоваться при использовании его с JQuery. Мой любимый способ борьбы с ними объясняется в этом репозитории на github и отражается в следующем примере кода:
<title>jQuery+RequireJS Sample Page</title> <script src="scripts/require.js"></script> <script> require({ baseUrl: 'scripts', paths: { jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min' }, priority: ['jquery'] }, ['main']); </script>
источник
HTML:
<html> <head> </head> <body> <div id='status'>jQuery is not loaded yet.</div> <input type='button' value='Click here to load it.' onclick='load()' /> </body> </html>
Сценарий:
<script> load = function() { load.getScript("jquery-1.7.2.js"); load.tryReady(0); // We will write this function later. It's responsible for waiting until jQuery loads before using it. } // dynamically load any javascript file. load.getScript = function(filename) { var script = document.createElement('script') script.setAttribute("type","text/javascript") script.setAttribute("src", filename) if (typeof script!="undefined") document.getElementsByTagName("head")[0].appendChild(script) } </script>
источник
Из консоли DevTools вы можете запустить:
document.getElementsByTagName("head")[0].innerHTML += '<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"><\/script>';
Проверьте доступную версию jQuery на https://code.jquery.com/jquery/ .
Чтобы проверить, загружен ли он, см. Проверка загрузки jquery с помощью Javascript .
источник