Я пытаюсь загрузить некоторые данные из Reddit через расширение Safari. Я использую шаблон JSONP для создания функции обратного вызова и прикрепления нового скрипта к скрипту. Тем не менее, похоже, что есть два пространства имен окон, а функция, которую я динамически создаю, недоступна для контекста динамически добавленного скрипта.Создание обратного вызова JSONP из расширения Safari
Эта ссылка, кажется, подробно описывает проблему для chrome, которая, как я предполагаю, похожа на мою в Safari.
JSONP request in chrome extension, callback function doesn't exist?
Вот код (работает за пределами расширения):
function jsonp(url, callback) {
var callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random());
window[callbackName] = function(data) {
delete window[callbackName];
callback(data);
};
console.log('about to create script');
var script = document.createElement('script');
script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'jsonp=' + callbackName;
document.body.appendChild(script);
console.log('script should be appended');
}
function getImages(){
jsonp('http://www.reddit.com/r/cats/.json', function(data) {
data.data.children.forEach(function(el){
console.log(el.data.url);
});
});
}
Любые идеи, работа обходные?
Спасибо!
Забыл добавить, что, в отличие от Chrome, расширения Safari не могут использовать междоменный XHR в инъецированном скрипте - поэтому необходимо запустить его в глобальном скрипте. – canisbos
В итоге я отправил сообщения в глобальный скрипт, который выполняет XHR, и отвечает через другое сообщение на инъецированное. Примечание. Safari.application.activeBrowserWindow.activeTab.page.dispatchMessage() представляется правильным способом отправки сообщений. Документация кажется устаревшей. Супер полезно. Благодаря! – 4m1r