Почему jQuery не загружается в Facebook?
Ситуация. Я пишу расширение chrome, которое работает на любой странице.
Проблема Вопрос: я не могу загрузить jQuery в Facebook, и я хотел бы понять, что происходит.
Гипотезы: у Facebook есть ультрасовершенствованные технологии, которые каким-то образом обнаруживают оба:
- Когда jQuery загружается через расширение chrome в
якобы отдельный контекст исполнения JSVM, megamind Facebook
как-то знает об этом якобы отдельном исполнении JSVM
контекст и блокирует его.
-
, что jQuery загружается через script.src и блокирует его
(когда я использовал CDN Google, который обслуживает HTTPS вместо
jQuery, который не работает с методом 2, но недостаточно для
ответ).
DATA
Как узнать, что jQuery не загружается?
I ⌘ ⌥ j, чтобы открыть консоль в Chrome. Когда я это сделаю:
> jQuery
>> ReferenceError : jQuery is not defined.
> $('body')
>> Error : Tried to get element "body" but it is not present on the page.
Как я могу загрузить jQuery в facebook?
Метод 1 (требуется, но не работает):
Через следующий код в файле manifest.json:
"content_scripts" : [
{
"matches" : ["<all_urls>"],
"js" : [
"javascript/jq/jquery-1.9.1.min.js",
"javascript/jq/non-standard.js"
],
"all_frames": true // (or false, same failure)
}
]
Метод 2 (работает, но недостаточно):
С помощью метода, описанного в этом SO-ответе (загрузить jQuery в консоль), изменен, чтобы разрешить правильный протокол:
var jq = document.createElement('script');
jq.src = "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js";
document.getElementsByTagName('head')[0].appendChild(jq);
jQuery.noConflict();
Резюме
Гипотеза 1 кажется очень маловероятной, потому что чрезмерное использование отдельных контекстов исполнения веб-браузера будет серьезной уязвимостью в безопасности (перерыв этой песочницы) и вряд ли будет санкционирован. Поэтому я, вероятно, параноик и игнорирую очевидное, которое, как мы надеемся, один из вас увидит.
Приложение (другой соответствующий код)
Все нестандартные .js:
$.fn.in_groups_of = function( countPerGroup ) {
var groups = [], offset = 0, $group;
while ( ($group = this.slice( offset, (countPerGroup + offset) )).length ) {
groups.push( $group );
offset += countPerGroup;
}
return groups;
};
Больше manifest.json:
"manifest_version" : 2,
"permissions" : [
"http://*/",
"https://*/",
"tabs",
"storage",
"unlimitedStorage"
],
Ответы
Ответ 1
Консоль Chrome не имеет доступа к контенту содержимого script.
Неправильно, это так. Вам нужно посмотреть правильное место:
![Animation of how-to get access to the execution environment of the Chromne extension]()
Предыдущий скринкаст показывает, что вкладка Консоль инструментов разработчика Chrome содержит два раскрывающихся списка внизу, которые можно использовать для изменения среды выполнения консоли разработчика.
Левую сторону можно использовать для изменения контекста кадра (верхний кадр, поэтому iframe,...), а правую сторону можно использовать для изменения контекста script (страница, контент script,...).
Ответ 2
Ответ
Кажется, мой "экспериментальный метод" был испорчен. Недопустимо предположение о всеведении в консоли Chrome. Консоль Chrome не имеет доступа к контексту выполнения контента script. Поэтому, хотя консоль сообщала, что у jQuery не было доступа к этой странице, она фактически выполнялась из контекста контекста содержимого script.
Это было подтверждено добавлением содержимого script, test.js, в manifest.json:
"content_scripts" : [
{
"matches" : ["<all_urls>"],
"js" : [
"javascript/jq/jquery-1.9.1.min.js",
"javascript/jq/non-standard.js",
"javascript/test.js" // <-- add
],
Содержимое test.js:
var jtest = $('body');
alert(jtest);
alert(jtest.text());
Теперь, независимо от того, на какую страницу я перехожу, появятся два окна предупреждений.
Это работает!
Ответ 3
Теперь вы можете знать все это, но я думаю, что кто-то все еще находит это полезным.
В расширении Chrome
У вас есть несколько "миров скриптов":
- Оригинальные скрипты страниц: скрипты на самой странице.
- Скрипты содержимого: вы пишете те script, и они запускаются на странице
- Скрипты всплывающих окон: они запускаются во всплывающем окне, если у вас есть всплывающая страница.
- Фоновые сценарии: выполните на глобальной фоновой странице.
Google отлично справляется с документацией, поэтому множество документов обо всех этих сценариях https://developer.chrome.com/extensions.
Но в вашем случае обратите внимание на то, что: скрипты страниц и контент script живут в разных мирах, они совместно используют DOM и некоторые собственные объекты Chrome, но не обмениваются переменными (или объектами), которые они создают.
В этом случае, если у вас есть jQuery в ваших сценариях контента, у вас будет $и jQuery, готовые к использованию в ваших сценариях контента. Вы можете использовать его для запроса DOM (хотя некоторые события jQuery могут работать не так, как ожидалось).
Но на странице у вас не будет $и jQuery (у вас может быть $, но это не jQuery ^^).
Ваш метод 2 выше, он фактически вводит jQuery на страницу, что jQuery станет страницей script. И вы не можете использовать $или jQuery в своих сценариях контента.
Если вы используете оба метода одновременно, вы можете иметь jQuery 1 в сценариях вашей страницы и jQuery 2 в своем контенте script, и они представляют собой два разных экземпляра jQuery. Это может вызвать путаницу, но я делаю это все время.