2014-10-23 2 views
1

Я пытаюсь загрузить некоторые данные из 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); 
     }); 
    });  
} 

Любые идеи, работа обходные?

Спасибо!

ответ

2

Вы правы в том, что в одном окне есть два пространства имён. Введенные сценарии не могут получить доступ к глобальным значениям веб-страницы и наоборот. Когда вы запускаете JSONP в инъецированном скрипте, скрипт вставленного тега <script> запускается в пространстве имен веб-страницы.

Я знаю два способа обойти это ограничение в расширении Safari.

Возможно, лучший способ - использовать глобальную страницу вашего внутреннего абонента для связи с внешним API через стандартные методы XHR или jQuery Ajax (которые поддерживаются в сценариях глобальной страницы) и использовать messages для передачи извлеченных данных в инъецируемый скрипт.

Другой путь, чтобы идти вперед и использовать JSONP из нагнетаемого сценария, но есть функция обратного вызова JSONP добавить неправдоподобные данные в DOM страницы, которая является доступными нагнетаемым сценарием. Например, вы можете поместить данные в скрытый элемент <pre>, а затем использовать свойство элемента innerHTML для его получения. Конечно, этот метод делает контент видимым для собственных скриптов страницы, поэтому будьте осторожны.

+0

Забыл добавить, что, в отличие от Chrome, расширения Safari не могут использовать междоменный XHR в инъецированном скрипте - поэтому необходимо запустить его в глобальном скрипте. – canisbos

+0

В итоге я отправил сообщения в глобальный скрипт, который выполняет XHR, и отвечает через другое сообщение на инъецированное. Примечание. Safari.application.activeBrowserWindow.activeTab.page.dispatchMessage() представляется правильным способом отправки сообщений. Документация кажется устаревшей. Супер полезно. Благодаря! – 4m1r

Смежные вопросы