Подтвердить что ты не робот

Запрос JSONP в расширении chrome, функция обратного вызова не существует?

Я делаю запрос JSONP в расширении chrome (содержимое script). Все работает очень хорошо, когда я запускаю веб-страницу, загружая файл 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);
    }
})
4b9b3361

Ответ 1

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

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

Единственное обходное решение, которое я знаю, которое работало для меня, - сделать вызов XHR из содержимого script. Начиная с 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