Почему Jquery остается неопределенным?

Я программирую пользовательский скрипт, и у меня есть проблема в Chrome (Firefox с Greasemonkey в порядке): я использую Tampermonkey; вот код:

// Header...

(function addjQuery() {
    var head = document.getElementsByTagName('head')[0] ;
    var jQuery = document.createElement('script');

    jQuery.type = 'text/javascript';
    jQuery.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js';

    head.appendChild(jQuery);
    waitjQuery() ;
 })();

function waitjQuery(){
    typeof jQuery == 'undefined' ? setTimeout(waitjQuery, 50) : main() ;
}

Мой цикл скрипта в функции ожидания и typeof jQuery (или $...) всегда не определены. Я проверил заголовок страницы HTML с помощью консоли, и jQuery правильно загружен...


person user2062125    schedule 11.02.2013    source источник
comment
Это работает здесь... jsfiddle.net/ACWsP Есть ли у вас ошибки в журнале консоли? Вы уверены, что он не зацикливается где-то внутри Main()?   -  person Kaizen Programmer    schedule 11.02.2013
comment
в журнале нет ошибок, и я уверен, что в waitJquery у меня есть цикл оповещения, когда я использую эту функцию...   -  person user2062125    schedule 11.02.2013


Ответы (2)


Расширения Google Chrome изолированы. Поэтому jQuery, добавленный вами в DOM, недоступен для вашего скрипта. Если вы хотите использовать jQuery в своем расширении, вам нужно определить его в файле манифеста. Если вы хотите запустить свой скрипт в домене страницы, вам следует внедрить его после того, как jQuery существует на странице.

Таким образом, вы не хотите проверять, существует ли jQuery, поскольку он никогда не будет, а вместо этого, добавлен ли элемент сценария, содержащий jQuery.

person BeRecursive    schedule 11.02.2013
comment
Ах, хорошо, я вижу свою проблему, у вас есть ссылка на соответствующий пример? иначе спасибо, я должен быть в состоянии справиться... - person user2062125; 11.02.2013
comment
Посмотрите здесь - person BeRecursive; 11.02.2013

Это была просто случайность, что ваш скрипт работал в Greasemonkey, как только вы попытаетесь использовать любой из API Greasemonkey (GM_ функции), он перестанет работать. Это связано с тем, что Greasemonkey теперь по глупости отключает песочницу в условиях выбора, а код сценария смешивает область действия страницы и область действия сценария (опасная практика).

Chrome благоразумно не отключает свою песочницу, поэтому код там не работает. Но, кроме того, для Tampermonkey вы не хотите добавлять jQuery таким образом!
Вы хотите добавлять jQuery, используя @require. Это делает ваш скрипт быстрее, более безопасным и с меньшей вероятностью сломает что-либо на странице или будет сломан.

Хороший кроссбраузерный метод добавления jQuery, использующий @require, когда он доступен, можно найти во второй части этого ответа< /сильный>.

person Brock Adams    schedule 11.02.2013
comment
Я тестирую ваше предложение, и мой пользовательский скрипт вводит все скрипты, это хорошо! но консольный javascript сказал: Uncaught ReferenceError: jQuery не определен Uncaught ReferenceError: $ не определен мой сценарий вызова script.user.js, который использует jquery... - person user2062125; 12.02.2013
comment
да, мой пользовательский скрипт - это проект, он использует более десяти внешних скриптов ... Я хочу сохранить эту декомпозицию на несколько скриптов, и, например, скрипту 5 нужна функция в скрипте 2, как я могу это сделать? (имеет какое-либо слияние) - person user2062125; 12.02.2013
comment
Хм? Боюсь, я не понимаю, что вы говорите. Вероятно, вам следует открыть новый вопрос с точными деталями. - person Brock Adams; 12.02.2013
comment
есть ссылка! для работы моего скрипта подождите jquery, но он использует другой скрипт, который вводится таким же образом, функция, которую я вызываю в моем скрипте, не определена - person user2062125; 12.02.2013
comment
Все еще не ясно. Обратитесь к этому ответу, который я связал, и при необходимости откройте новый вопрос. Не пытайтесь смешивать область сценария и область действия страницы. - person Brock Adams; 12.02.2013