2013-11-07 5 views
0

Я знаю, что тема «включая файл javascript в другой файл javascript» обсуждалась много. Но мой сценарий несколько отличается, поэтому я не смог найти ответ, соответствующий моей проблеме.jQuery: getScript для включения Javascript в Javascript

Давайте предположим, что есть три файла: test.html, starter.js и object.js

test.html просто включает starter.js с помощью JQuery:

<html> 
    <head> 
    <script src="js/starter.js"></script> 
    </head> 
    <body> 
    <script src="jquery/jquery-1.9.1.js"></script> 
    <script> 
    $(document).ready(function() { 
     $.getScript("js/starter.js", loadobject()); 
     alert("a"); 
    }); 
    </script> 
    </body> 
</html> 

starter.js содержит функцию с $.getScript включить object.js и выглядит следующим образом:

function loadobject() { 
    alert("b"); 
    $.getScript("object.js", function(){ 
    Object.init(); 
    alert("c"); 
    }); 
} 

Наконец object.js содержит объект, как следующее:

var Object = { 
init: function() { 
      // . . . 
}, 
searchString: function (data) { 
      // . . . 
    } 
}; 
Object.init(); 

Насколько я вижу, когда вызывается test.html в браузере, он должен включать starter.js, как только документ будет готов. Кроме того, starter.js должен загружать object.js при вызове. Но это кажется неудачным, поскольку строка alert("object loaded"); никогда не выполняется. Я также много проб и ошибок, например, заменил строку в starter.js $.getScript("object.js", function(){ на $.getScript("object.js", init(){, но мне не удалось найти решение - хотя это может быть просто. :(

Как я могу это исправить и включить файл JS, содержащий объект правильно? Кроме того, как может новый Object быть инициализирован и доступ в starter.js?

Я думаю, что я испортил с function() , но на самом деле я понятия не имею, о том, что и оценить любой намек.

Спасибо!

+0

ли это преднамеренным, что вы в том числе ' стартер.js' дважды? Один раз через тег HTML 'script', один раз через' getScript() '. Какова ваша цель сделать все это? Я не вижу смысла. – kapa

+0

Если я не использую тег 'script', функция' getScript() 'генерирует ошибку, говорящую, что переменная' loadobject' не определена. С тегом 'script' эта ошибка не возникает. – coroner

+0

В этом случае вам не нужен 'getScript()'. Просто выполните 'loadobject()' вместо '$ .getScript (" js/starter.js ", loadobject());'. В это время стартер уже загружен. – kapa

ответ

1

код работает, если вы пишете его следующим образом,

HTML

нет необходимости загружать starter.js, поскольку вы достигаете что к функция getScript

<!DOCTYPE html> 
<html> 
    <head> 
     <!--<script src="closure-library/closure/goog/base.js"></script>--> 
     <!--<script src="js/starter.js"></script>--> 
    </head> 
    <body> 
     <script type='text/javascript' src='http://code.jquery.com/jquery-1.9.1.js'></script> 
     <script> 
      $(document).ready(function() { 
       $.getScript("js/starter.js", function(){ 
        alert('starter loaded'); 
        loadobject(); 
       }); 
       alert("a"); 
      }); 
     </script> 
    </body> 
</html> 

object.js

var theObject = { 
    init: function() { 
alert('init'); 
    }, 
    searchString: function(data) { 

    } 
}; 

starter.js

Укажите абсолютный путь и в функции обратного вызова у вас есть доступ к объекту, как вы предполагалось. Переименованный объект в объект, поскольку вызывающая функция объекта Object вызывает ошибку jquery.

function loadobject() { 
    alert("b"); 
    $.getScript("/test/js/object.js", function(){ 
    theObject.init(); 
    alert("c"); 
    }); 
} 

Результат, который вы получаете последовательные сигналы, показывающие «а»> «стартер загружен»> «б»> «INIT»> «с»

+0

Спасибо за ваш детальный ответ! Я изменил все, как вы посоветовали. К сожалению, в предупреждениях отображается только «a»> «стартер с загрузкой»> «b». Вот и все. Поэтому я думал, что путь к object.js может быть неправильным, но я пробовал абсолютный путь '/ var/www/js/object.js', а также путь веб-сервера' http: // serverip/js/object.js' и 'httP: // localhost/js/object.js' - это всегда одно и то же. Нет «init» и «c». По крайней мере, Dragonfly не показывает никаких ошибок; -D – coroner

+0

@coroner, код отправлен был протестирован в chrome (30.0.x), ff (24) и opera (12.00) – melc

+0

Allright! Это работает. Большое спасибо! :) По какой-то причине это не сработало правильно на моем localhost. При копировании на реальный веб-сервер все в порядке. Благодарим за помощь и тестирование! – coroner

0

передать ссылку на функцию и не возвращается значение функции. вы вызываете функцию там loadobject() и передавая возвращаемое ей значение,

$.getScript("js/starter.js", loadobject); 

или

$.getScript("js/starter.js", function(){ 
    loadobject() 
}); 
+1

На самом деле он сам не передал функцию, но вызвал ее и попытался передать возвращаемое значение. – kapa

+0

Извините, но я не понимаю. Когда я оставляю скобки после 'loadobject' в' getScript' в test.html, функция 'loadobject()' starter.js не вызывается. Я добавил функцию 'alert'-popup к функции' loadobject() 'перед функцией' getScript', чтобы проверить это. После того, как объект object.js, похоже, не загружен, поэтому функция 'init' объекта не выполняется. – coroner

+0

Я отредактировал код выше, чтобы вы могли видеть дополнительные предупреждения. При использовании 'loadobject()' в 'getScript' отображаются предупреждения« b »и« a ». Выходя из этих скобок, появляется только предупреждение «a». Предупреждение «c» никогда не видно, хотя в Dragonfly нет ошибок скрипта. – coroner

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