В моем расширении Chrome я вставляю сценарий содержания во все IFRAMEs
внутри страницы. Вот часть файла manifest.json
:Есть ли способ однозначно идентифицировать iframe, выполняемый скриптом контента для моего расширения Chrome?
"content_scripts": [
{
"run_at": "document_end",
"all_frames" : true,
"match_about_blank": true,
"matches": ["http://*/*", "https://*/*"],
"js": ["content.js"]
}
],
Так один веб-страницы, имеющей несколько IFRAMEs
будет в конечном итоге работает, что много копий моего впрыскивается content.js
.
Логика внутри content.js
собирает данные от каждого IFRAME
он вводится в или из основной/главной страницы, и посылает его обратно в фоне сценария (с использованием chrome.runtime.sendMessage
.) The фоновый скрипт в свою очередь, должен хранить данные в глобальной переменной, которые позже используются в самом расширении.
Проблема, с которой я сталкиваюсь, заключается в том, что приложение должно различать «данные», полученные от нескольких IFRAMEs
, так как мой метод сбора данных может вызываться повторно при взаимодействии пользователя со страницей, и поэтому я не могу просто «сбрасывать» «данные, полученные в фоновом сценарии в массив. Вместо этого мне нужно использовать хранилище данных типа dictionary
.
я могу сказать, если данные поступают из IFRAME
или с главной страницы, выполнив следующие действия:
//From the `content.js`
var isIframe = window != window.top;
и мое мышление было то, что если я собираю страницы URL, каждый IFRAME
то я должен быть в состоянии использовать его в качестве уникального ключа для хранения данных в соответствии с моей глобальной переменной типа словарь:
//Again from content.js
var strUniqueIFrameURL = document.URL;
Ну, что не будет работать, потому что два или более IFRAMEs
могут иметь одни и те же URL.
Таким образом, мой первоначальный вопрос - как рассказать IFRAMEs
на странице отдельно? Есть ли какой-то уникальный идентификатор или что-то подобное, которое Chrome назначает им?
Чтобы переформулировать ваш вопрос. Скажем, есть страница с 3 '
@Xan: Да, вы правы. За исключением того, что 'iframes' могут быть как одинаковыми, так и перекрестными. (Я не являюсь автором страниц, на которые вложен мой сценарий контента, поэтому я принимаю оба сценария.) – c00000fd
Без проблем с перекрестным происхождением легко решается с помощью 'window.frameElement' и' window.parent.document. querySelectorAll ("IFrame") '. Но вы не можете получить доступ к тем, у кого есть фреймы cross-origin. – Xan