Я пытаюсь написать оболочку jquery, которая позволит новым пользовательским скриптам работать вместе со старыми, как в chrome, так и в firefox, и запускать jquery. Мои прежние пользовательские скрипты использовали метод Джоан Пьедры (http://joanpiedra.com/jquery/greasemonkey/), но это не работает в Chrome, потому что Chrome не поддерживает unsafewindow.
Итак, я нашел метод Эрика Волда для запуска jQuery в Chrome (http://erikvold.com/blog/index.cfm/2010/6/14/using-jquery-with-a-user-script),, однако он не работает вообще в Firefox вместе с существующими пользовательскими скриптами.
Я решил попытаться адаптировать сценарий Эрика, чтобы сначала искать jquery, а затем вставлять тег сценария, только если jquery не определен. Если jquery существует, он не вставляет тег сценария jquery, а просто запускает обратный вызов jquery (в режиме без конфликтов, потому что я ожидаю, что он будет работать и на странице с scriptaculous.)
Моя проблема (первая из многих, я уверен, учитывая количество требований, которые у меня есть) связана с оператором if / else в addJQuery: в части else оператора (где объект jquery не должен быть 'undefined) ') объект jquery все еще фактически не определен, поэтому я получаю сообщение об ошибке, что $ не определено при выполнении обратного вызова.
Оригинальный код Эрика прикрепил прослушиватель событий к загрузке скрипта jquery, но я не знаю, как это сделать в случае, если jquery уже существует, но не обязательно загружен (я пытался прикрепить прослушиватели событий к окну, документ, document.head и document.body и ничего не работает.)
Я также пытался использовать window.setTimeout, но не смог повторить его более одного раза с одинаковыми результатами ($ не определено).
Я также упомяну, что в случае, когда я знаю, что jQuery не существует, сценарий успешно добавляет тег сценария, и я прикрепил прослушиватель событий к сценарию, и я все еще получаю ошибку что $ не определено.
Так что я сейчас в полном недоумении. Я не могу обнаружить jQuery, даже когда мне кажется, что я не могу запустить код, и даже когда кажется, что он есть, он все равно ломается.
function addJQuery(callback) {
if(typeof jQuery == 'undefined'){
var libsrc = "http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js";
var dochead = head = document.getElementsByTagName('head')[0];
var jqscript = document.createElement("script");
jqscript.setAttribute("type","text/javascript");
jqscript.setAttribute("src", libsrc);
// append script tag as first element in the head
dochead.insertBefore(jqscript, head.childNodes[0]);
jqscript.addEventListener('load', function(){
var runscript = document.createElement("script");
// force no conflict mode allowing $
runscript.textContent = "jQuery.noConflict(); (function($) { $(function() {" + callback.toString() + "}); })(jQuery);";
document.getElementsByTagName('head')[0].appendChild(runscript);
callback();
}, false);
}
else{
// jquery is still undefined?!?!?!?!
var runscript = document.createElement("script");
runscript.setAttribute("type", "text/javascript");
// force no conflict mode allowing $
runscript.textContent = "jQuery.noConflict(); (function($) { $(function() {" + callback.toString() + "}); })(jQuery);";
document.getElementsByTagName('head')[0].appendChild(runscript);
callback();
}
}
function main() {
alert($); // check if the dollar (jquery) function works
alert($().jquery); // check jQuery version
}
// load jQuery and execute the main function
addJQuery(main);