JSONP-запрос в расширении Chrome, функция обратного вызова не существует? - PullRequest
13 голосов
/ 14 декабря 2011

Я делаю запрос JSONP в расширении Chrome (контентный скрипт).Все работает очень хорошо, когда я работаю как веб-страница - загружаю файл HTML в свой браузер - но когда я загружаю его как расширение chrome, функция обратного вызова jsonp, созданная jquery, кажется, не существует, когда сервер дает свой ответ.

Моя консоль говорит:

Uncaught ReferenceError: jQuery17105683612572029233_1323808231542 is not defined

Вот мой запрос ajax:

$.ajax({
    url: 'http://example.com',
    data: 
    {
        imgUrl: this.href,
        returnString:true
    },
    dataType: "jsonp",
    success: function(msg){
        newNode.src = msg.data;
    },
    error: function(msg){
        console.log(msg.data);
    }
})

1 Ответ

24 голосов
/ 11 января 2012

Проблема заключается в том, что ответ JSONP перехватывается фактической страницей за пределами изолированного кода JavaScript, который сценарий содержимого Chrome ограничивает вас тоже.

jQuery17105683612572029233_1323808231542 - это имя функции обратного вызова, которую JQuery JSONP динамически генерирует для конкретного вызова. Эта функция определяется в изолированной области, к которой у скрипта контента есть доступ.

Единственный известный мне обходной путь, который сработал для меня, - это сделать вызов XHR из скрипта контента. Начиная с Chrome 13, вы можете сделать XHR-вызовы междоменными из скриптов контента (довольно круто). В вашем файле манифеста вам нужно добавить внешний URL к разрешениям:

{
    ...
    "permissions": [
        "http://example.com"
    ]
}

Затем вы можете сделать вызов XHR следующим образом:

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://example.com/", true);
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
       //handle the xhr response here
  }
}
xhr.send();

Вам нужно будет сделать некоторые из вещей, которые jQuery делал автоматически для вас, например, кодировать значения объекта данных в URL-адрес XHR (в вашем случае "imrUrl" и "returnString"), а также преобразовывать ответ от xhr.responeText или xhr.reponseXML в объект.

Недостатком этого подхода является то, что если вы делитесь этим кодом между расширением Chrome и чем-то другим (например, букмарклетом), то теперь у вас должна быть другая логика для варианта использования Chrome.

Для получения дополнительной информации см .: Расширение Chrome XHR

...