2013-05-30 2 views
24

Я пытаюсь загрузить JS-скрипты динамически, но использование jQuery не является вариантом.jQuery.getScript альтернатива в родном JavaScript

Я проверил источник jQuery, чтобы увидеть, как был реализован getScript, чтобы я мог использовать этот подход для загрузки скриптов с использованием встроенного JS. Однако getScript вызывает только jQuery.get()

, и я не смог найти, где реализован метод get.

Так что мой вопрос,

Что надежный способ реализовать свой собственный метод getScript, используя родной JavaScript?

Спасибо!

+1

возможно дубликат запроса [Javascript AJAX без framework] (http://stackoverflow.com/questions/5907781/javascript-ajax-request-without-framework) – undefined

+0

Это самое близкое, что я могу найти для обмана: [Какое событие JavaScript срабатывает при завершении загрузки асинхронных ресурсов?] (Http://stackoverflow.com/questions/7592364/) – Mathletics

ответ

23

Вы можете получить сценарии, как это:

(function(document, tag) { 
    var scriptTag = document.createElement(tag), // create a script tag 
     firstScriptTag = document.getElementsByTagName(tag)[0]; // find the first script tag in the document 
    scriptTag.src = 'your-script.js'; // set the source of the script to your script 
    firstScriptTag.parentNode.insertBefore(scriptTag, firstScriptTag); // append the script to the DOM 
}(document, 'script')); 
+0

@Baszz huh? Он создает элемент сценария, устанавливает источник, а затем добавляет его в DOM с помощью 'insertBefore()'. Где вы видите '$ .get'? – Mathletics

+0

@Baszz, о чем вы говорите ??? –

+0

Вы, ребята, правы ... подумал, что это было о том, как был реализован getScript(). –

8

использование этого

var js_script = document.createElement('script'); 
js_script.type = "text/javascript"; 
js_script.src = "http://www.example.com/script.js"; 
js_script.async = true; 
document.getElementsByTagName('head')[0].appendChild(js_script); 
+2

Я не голосовал, но я бы рискнул предположить, что объявление переменной без 'var', без необходимости устанавливая тип 'и добавление к' head' раздражало кого-то достаточно, чтобы потерять часть репутации. – Mathletics

51

Вот альтернатива JQuery getScript с функцией обратного вызова:

function getScript(source, callback) { 
    var script = document.createElement('script'); 
    var prior = document.getElementsByTagName('script')[0]; 
    script.async = 1; 

    script.onload = script.onreadystatechange = function(_, isAbort) { 
     if(isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) { 
      script.onload = script.onreadystatechange = null; 
      script = undefined; 

      if(!isAbort) { if(callback) callback(); } 
     } 
    }; 

    script.src = source; 
    prior.parentNode.insertBefore(script, prior); 
} 
+5

Насколько выбранный ответ чист и прост, это тот, который я буду использовать по простой причине включения этой функции обратного вызова. – Varyl

+0

Любой способ узнать, не удалось ли загрузить эту нагрузку? –

+0

@RubenMartinezJr. установить тайм-аут на пару секунд после вызова и очистить его от обратного вызова успеха; если он срабатывает, вы, вероятно, можете предположить, что он потерпел неудачу (если ваш источник не очень медленный). – Mahn

Смежные вопросы