Редактировать: Обновлены сведения, чтобы добавить различия в поведении Firefox / Chrome
Я пытаюсь создать букмарклет, который будет загружать как jQuery, так и jQueryUI.В загрузке jQuery используется javascript, но я решил, что с момента загрузки jQuery, я бы использовал его для загрузки пользовательского интерфейса. Больше, чем заставить его работать, я действительно хочу понять, почему это не работает. Я все еще нахожусь в области видимости / замыканий / и т.д.Но я просто не понимаю, почему в Firefox $ не работает, а "JQuery" работает!$ Отлично работает в Chrome, но у меня возникает другая проблема.
Примечания:
1) В FireBug / FireFox я получаю голову '$ (")") не определено '
2) В Chrome" $ "работает нормально, но вызов jQueryUI завершается неудачно с Object [object Object] не имеет метода' dialog '
3) обратный вызов гарантирует, что jQuery будет загружен, когда я попытаюсь его использовать.В Firefox, если я заменю «$» на «jQuery» (например, jQuery («head)), тогда код работает!.
4) на этой странице нет других библиотек, уже использующих $
5) Еще больше расстраивает, в Firefox, если я просто сдамся и использую "jQuery" вместо "$", а затем установлю обратный вызов из $ ("# jquilib"). Load () для вызоваВ-третьих, функции jQueryUI, такие как .tabs () и .dialog (), недоступны, даже если сам обратный вызов был вызван доступностью jQueryUI!
6) В Chrome проблема jQueryUI исчезает, еслиЯ использую setTimeout () до 100 мс. Если я опускаюсь до 1 мс или чего-то еще, чем проблема сохраняется.
Я использую функцию getScript из этого поста: http://www.learningjquery.com/2009/04/better-stronger-safer-jquerify-bookmarklet.
Ниже приведен мой код:
function getScript(url,success){
var script=document.createElement('script');
script.src=url;
var head=document.getElementsByTagName('head')[0],
done=false;
// Attach handlers for all browsers
script.onload=script.onreadystatechange = function(){
if ( !done && (!this.readyState
|| this.readyState == 'loaded'
|| this.readyState == 'complete') ) {
done=true;
success();
script.onload = script.onreadystatechange = null;
head.removeChild(script);
}
};
head.appendChild(script);
}
function initializejQueryUI(){
if (typeof jQuery.ui == 'undefined'){
// jQueryUI library & jQueryUI cupertino theme
$('head').append("<link href='https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/cupertino/jquery-ui.css' type='text/css' rel='stylesheet'>");
$('head').append("<script id='jquilib' type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js'></script>");
}
$("#jquilib").load($("<div>jQuery & UI Loaded!</div>").dialog());
}
getScript('https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js', initializejQueryUI); // call initializejQueryUI as callback when jQuery loads