Использование jQuery.getJSON в расширении Chrome - PullRequest
6 голосов
/ 12 апреля 2010

Мне нужно сделать междоменный запрос в расширении Chrome. Я знаю, что могу сделать это через передачу сообщений , но я бы предпочел придерживаться только идиом jQuery (поэтому мой javascript также может работать как <script src="">).

делаю нормально:

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", function(data) {
  console.log(data);
});

но в консоли ошибок я вижу:

Uncaught ReferenceError: jsonp1271044791817 is not defined

Не правильно ли jQuery вставляет функцию обратного вызова в документ? Что я могу сделать, чтобы сделать эту работу?

(Если я вставлю код в консоль Chrome, он будет работать нормально, но если я добавлю его как расширение page.js в тот момент, когда возникнет проблема.)

Ответы [ 5 ]

8 голосов
/ 13 апреля 2010

Увы, ничего из этого не сработало, поэтому я закончил тем, что установил связь через background.html.

background.html

<script src="http://code.jquery.com/jquery-1.4.2.js"></script>
<script>
function onRequest(request, sender, callback) {
  if (request.action == 'getJSON') {
    $.getJSON(request.url, callback);
  }
}

chrome.extension.onRequest.addListener(onRequest);
</script>

javascripts / page.js

chrome_getJSON = function(url, callback) {
  console.log("sending RPC");
  chrome.extension.sendRequest({action:'getJSON',url:url}, callback);
}

$(function(){
  // use chrome_getJSON instead of $.getJSON
});
3 голосов
/ 12 апреля 2010

Если вы укажете «api.flickr.com» в файле manifest.json , вам не нужно будет использовать обратный вызов JSONP, стиль внедрения сценария для междоменного запроса.

Например:

"permissions": ["http://api.flickr.com"],

Это должно прекрасно работать в вашем коде. Я бы удалил параметр строки запроса "& jsoncallback", так как не требуется никакой работы JSONP.

Причина, по которой ваш текущий код не работает, заключается в том, что ваш код внедряется в страницы DOM, у скриптов контента есть доступ к DOM, но нет доступа к контексту javascript, поэтому нет метода для вызова по обратному вызову.

2 голосов
/ 06 декабря 2011

У меня сложилось впечатление, что это не удается, потому что функция обратного вызова jQuery создается в «изолированном мире» расширения Chrome и недоступна при ответе:

http://code.google.com/chrome/extensions/content_scripts.html#execution-environment

Я использую Prototype и jQuery по разным причинам, но мое быстрое исправление должно быть легко проанализировано:

// Add the callback function to the page
s = new Element('script').update("function boom(e){console.log(e);}");
$$('body')[0].insert(s);

// Tell jQuery which method to call in the response
function shrink_link(oldLink, callback){
    jQuery.ajax({
        type: "POST",
        url: "http://api.awe.sm/url.json",
        data: {
            v: 3,
            url: oldLink,
            key: "5c8b1a212434c2153c2f2c2f2c765a36140add243bf6eae876345f8fd11045d9",
            tool: "mKU7uN",
            channel: "twitter"
        },
        dataType: "jsonp",
        jsonpCallback: callback
    });
}

// And make it so.
shrink_link('http://www.google.com', "boom");

В качестве альтернативы вы можете попробовать использовать расширение XHR:

http://code.google.com/chrome/extensions/xhr.html

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // JSON.parse does not evaluate the attacker's scripts.
    var resp = JSON.parse(xhr.responseText);
  }
}
xhr.send();
0 голосов
/ 01 сентября 2010

Как многие из вас знают, Google Chrome на данный момент не поддерживает ни одну из удобных функций GM_.

Таким образом, невозможно выполнять межсайтовые AJAX-запросы из-за различных ограничений песочницы (даже при использовании таких замечательных инструментов, как сценарий кросс-доменного запроса Джеймса Падолси )

Мне нужен был способ, чтобы пользователи знали, когда мой скрипт Greasemonkey был обновлен в Chrome (поскольку Chrome тоже этого не делает ...). Я нашел решение, которое описано здесь (и используется в моем скрипте Lighthouse ++ ), и его стоит прочитать тем, кто хочет проверить версию своих скриптов:

http://blog.bandit.co.nz/post/1048347342/version-check-chrome-greasemonkey-script

0 голосов
/ 12 апреля 2010

Синтаксис немного выключен. Нет необходимости в callback( бите. Это работает без нареканий. Протестировано в консоли JavaScript Chrome на этой странице StackOverflow (включая jQuery):

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", function(data) {
  console.log(data);
});
...