Завантажте jQuery за допомогою Javascript і використовуйте jQuery


83

Я додаю бібліотеку jQuery до dom, використовуючи:

 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, а також використовую його, коли він перебуває у домі?


2
Чи є причина, по якій ви хочете зробити це проти більш оптимізованого способу?
— Код Маверік

Деякі відповіді на це питання може допомогти вам - stackoverflow.com/questions/7474354 / ...
— mrtsherman

@Scott Так. У мене є програма, в якій під час встановлення він завантажує як jquery, так і сценарій. Мені потрібно завантажити jquery всередині сценарію, щоб jquery не порушував теми користувачів. Мені потрібно умовно завантажити javascript на певну веб-сторінку в межах їх теми. Будь ласка, просто довіряйте мені в цьому.
— ThomasReggi,

Чому jQuery порушує теми користувачів? Якщо завантаження jQuery (що не впливає на css) може порушити теми, ви робите щось дуже неправильно.
— Андерс Торнблад,

Хороший момент, але що, якщо вони використовують стару версію jQuery або іншу бібліотеку?
— ThomasReggi,

Відповіді:


138

Тут є робочий 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 Loader, наприклад:


Це рішення працює, за винятком WordPress. Будь-яким чином це можна змінити для завантаження jQuery в інший об'єкт?
— Kraang Prime

@SanuelJackson У Wordpress вам слід використовувати 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
— Андерс Торнблад

Так, я говорив, що наведений вище код не працює на Wordpress, оскільки він також асинхронно завантажує jQuery. Навіть якщо цей скрипт завантажується в самому низу сторінки (безпосередньо перед закриттям html), jQuery не повністю `` ініціалізований '', і, отже, він не бачить завантаженого jQuery, а продовжує завантажувати та виконувати зворотний виклик. Після завантаження він перешкоджає завантаженню асинхронних речей, які залежать від того, що jQuery завантажується іншим способом (наприклад, $, jQuery тощо) або залежить від іншої версії jQuery.
— Kraang Prime

Це чудово в інших випадках, які я намагався. Просто писав про єдину кричущу проблему з цим. Якщо це якось можна було налаштувати, але я не думаю, що це можливо, оскільки це залежить від виявлення jQuery, який, звичайно, не завантажується, і, отже, може діяти лише з логікою - якщо немає jquery ... тоді ..
— Kraang Prime

1
Вам не потрібно робити опитування, ви можете використовувати тільки один рядок, щоб чекати , поки Jquery навантаження з допомогою події .onload як stackoverflow.com/a/42013269/3577695
— aljgom

7

Існує інший спосіб динамічного завантаження jQuery ( джерело ). Ви також можете використовувати

document.write('<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"><\/script>');

Це вважається поганою практикою для використання document.write, але для завершення добре про це згадати.

Див. Чому документ.write вважається "поганою практикою"? з причин. Про те , що document.writeдійсно блокує сторінки від завантаження інших assests, тому немає необхідності створювати функцію зворотного виклику.


1
Я прочитав документ, на який ви зв’язали, і для мого випадку використання завантаження застарілої бібліотеки jQuery для IE8 використання документа document.write здається нормальним. Поки що у мене це добре працює.
— Алан,

Це найпростіший і найпростіший спосіб зробити це. Чи не було б проблеми з цим на початку досить великого сценарію, який є окремим файлом JS? Це занадто добре, щоб здаватись.
— Агустін Ладо

6

Веб-сайт 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>

Я можу завантажити лише один javascript. Це означало б, що мені доведеться динамічно завантажувати google jsapi, а потім за допомогою цього завантаження jquery? Здається, зайвим для мого випадку використання.
— ThomasReggi,

1
Це те, що робить навантажувач jQuery. Ви посилаєтесь на завантажувач, і він завантажує jQuery в документ для вас.
— Код Маверік

3

Вам потрібно запустити свій код ПІСЛЯ завершення завантаження 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 на сторінці, спробуйте це


0

Причиною цієї помилки є те, що JavaScript не чекає завантаження сценарію, тому під час запуску

jQuery(document).ready(function(){...

немає гарантії, що сценарій готовий (і ніколи не буде).

Це не найелегантніше рішення, але воно дієве. По суті, ви можете перевіряти кожні 1 секунди, якщо об’єкт 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);

0

Використовуючи 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>

0

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>

Складна частина - це запустити скрипт після завантаження сценарію ... І чому б сценарій ніколи не був визначений! ??
— Андерс Торнблад,

0

За допомогою консолі 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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.