Я написал плагин, который зависит от внешних библиотек, которые я хочу включить условно, то есть пользователь может выбрать, чтобы они не включались автоматически, если на веб-сайте пользователя уже есть эти библиотеки. Вот некоторый псевдокод для иллюстрации проблемы
<script type="text/javascript" src="path/to/plugin.js"></script>
<script type="text/javascript">
PLUGIN.init({
"param1": "foo",
"parma2": 33,
"include": {"jquery": 0, "googlemaps": 0}
});
</script>
В моем плагине скрипт
var PLUGIN = {
"init": function(obj) {
if (obj.include.googlemaps !== 0) {
document.write('<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true&v=3.6">\x3C/script>');
}
if (obj.include.jquery !== 0) {
document.write('<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js">\x3C/script>');
}
.. do more things ..
}
Проблема в том, что когда я готов "делать больше", библиотеки, похоже, еще не загружены. Я получаю сообщение об ошибке, что jquery не найден, или карты Google не найдены. Я могу решить эту проблему, изменив мой код на
document.write('<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true&v=3.6">\x3C/script>');
document.write('<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js">\x3C/script>');
var PLUGIN = {
"init": function(obj) {
.. do more things ..
}
но теперь пользователь не может контролировать загрузку библиотек или не загружать их. Предложения? Обходные?
Обновление: Спасибо за предложения, вы все, но пока радости нет. Вот что я делаю и что происходит. Поскольку я потенциально загружаю 0 или более сценариев (пользователь может по своему усмотрению решить, какие сценарии не нужно загружать), я сделал свой код следующим образом:
"importLib": function(libPath, callback) {
var newLib = document.createElement("script");
if (callback !== null) {
newLib.onload = callback;
}
newLib.src = libPath;
document.head.appendChild(newLib);
},
"init": function(obj) {
var scripts = [];
if (obj.include.googlemaps !== 0) {
scripts.push("http://maps.google.com/maps/api/js?sensor=true&v=3.6");
}
if (obj.include.jquery !== 0) {
scripts.push("http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js");
}
if (obj.include.anotherlib !== 0) {
scripts.push("http://path/to/another/lib.js");
}
var len_scripts = scripts.length,
callback = null;
if (len_scripts > 0) {
for (var i = 0; i < len_scripts; i++) {
// add callback only on the last lib to be loaded
if (i == len_scripts - 1) {
callback = function() { startApp(obj) };
}
importLib(scripts[i], callback);
}
}
// Start the app rightaway if no scripts need to be loaded
else {
startApp(obj);
}
},
"startApp": function(obj) {
}
В результате Firefox выдает ошибку attempt to run compile-and-go script on a cleared scope
, и Safari не получает эту ошибку, но ничего не загружает. Как ни странно, консоль ошибок Safari не показывает никаких ошибок вообще. Похоже, ошибка Firefox вызвана строкой document.head.appendChild(newLib);
, которая, если я прокомментирую, ошибка исчезнет, но, конечно, веб-страница не загружается правильно.