Есть ли какой-либо способ включить файл Javascript в другой JS-файл?

#javascript #jquery

#javascript #jquery

Вопрос:

Я попробовал 3 предложения, найденных в других вопросах на сайте, но, похоже, ни одно из них не работает для меня, и я не уверен, почему.

 // #1
var imported = document.createElement('script');
imported.src = '/path/to/imported/script';
document.getElementsByTagName('head')[0].appendChild(imported);


// #2
// jQuery
$.getScript('/path/to/imported/script.js', function()
{
    // script is now loaded and executed.
    // put your dependent JS here.
});


// #3
document.write( '<script language="javascript" src="myotherscript.js" />' );
  

Файл, который я пытаюсь включить, по сути, представляет собой массивный файл с переменными, объявленными следующим образом:

 var agent = [
"csv",
"drawfile",
"excel",
"flash",
"hangul",
"html",
"image",
"msword",
"ooxml",
"pdf",
"ppt",
"txt",
"wmf"];
  

Есть идеи о том, что может быть причиной проблемы?

Обновить

Просто уточняю, что JS-файл, который я пытаюсь включить, генерируется динамически из базы данных, поэтому избегайте регулярных выражений, чтобы постоянно добавлять и удалять один и тот же фрагмент кода. Он хранится в файле serparate.

Переменные concerend используются для заполнения динамического выпадающего списка значениями, поэтому под «не работает» я подразумеваю отсутствие значений в выпадающих списках : (

Комментарии:

1. Прочитайте статью Википедии о JSONP — en.wikipedia.org/wiki/JSONP . Техника «внедрения элемента скрипта», используемая в JSONP, должна соответствовать вашим потребностям. Но если скрипт, который вы включаете, не генерируется динамически, тогда нет необходимости включать его динамически. Почему бы вам просто не использовать статический <script> тег, как любой другой модуль скрипта?

2. что вы имеете в виду, говоря «не работает»?

3. Я сделал это с помощью jQuery один раз с помощью ajax-запроса и просто используя тег .html () для его записи, хотя я не загружал js-файл таким образом, я использовал <script> js / jQuery code здесь </script>.

4. Ваша проблема может быть в области видимости, я не уверен, как jQuery выполняет скрипты, загруженные с помощью getScript, но, вероятно, результаты не находятся в глобальной области видимости, поскольку вы используете var . Реальный вопрос в том, если ваш файл — это просто набор данных, почему бы вам просто не использовать JSON для его хранения, а затем проанализировать json в вашем основном коде? Нет необходимости динамически загружать и запускать javascript для инициализации некоторых переменных.

5. Для справки, <script ... /> не будет работать в браузерах, которые не поддерживают XHTML (например, IE), и если вы используете документ, отличный от XHTML, он все равно не будет работать. (HTML, даже HTML5, рассматривает его как открывающий тег без закрывающего тега.)

Ответ №1:

Я бы использовал плагин require, пока я думаю, что jquery будет иметь это в следующем выпуске ядра 1.6

Ответ №2:

Если единственная цель — включить другой файл javascript для объявления группы переменных и их значений в глобальную область видимости, почему бы просто не <script type="text/javascript" src="myotherscript.js"></script> в заголовке вашего html-документа перед включением другого источника скрипта?

Редактировать:

Проблема в том, что вы не можете определить глобальные переменные внутри метода. У вас есть правдоподобный вариант инкапсуляции всего вашего файла сценария (или, по крайней мере, затронутых частей) в ajax-функцию jQuery, которая первым делом оценивает ваш включенный файл. Это оставило бы включенные переменные в правильной области видимости. Вот что я имею в виду…

 $.ajax({
   url: 'path/to/included/file',
   success: function(msg) {
      eval(msg); // This is where your included variables are in regard to scope

      // This is where you would paste all of your dependent functions and whatnot

      }
    });

// Outside of the ajax method, you won't be able to use your included properties
  

Комментарии:

1. Потому что это добавляет требование, чтобы кто-то не забыл загрузить этот другой файл. В идеальном мире вам нужно было бы загрузить только то, что вы на самом деле используете, и позволить ему загружать все, что требуется.

2. Однако лично я бы не стал оставлять это на усмотрение моего скрипта браузера. Мне кажется, что это было бы больше похоже на функциональность на стороне сервера (определение того, какие файлы где принадлежат).

3. Это можно было бы сделать на стороне сервера, если у вас есть фреймворк, который управляет скриптами за вас. Однако не все это делают.

Ответ №3:

 var getScript = function(jsPath) {
    $.ajax({
        dataType:'script',
        async:false,
        cache:true,
        url:jsPath
    });
};
  

Ответ №4:

http://requirejs.org / является наиболее популярным для решения проблем такого рода

Ответ №5:

Спасибо всем за вашу помощь, но я думаю, что причиной ошибок были некоторые символы, которые требовали экранирования внутри переменных.

Мартин