Выполнение Ajax-запроса из PageMod ContentScriptFile - PullRequest
4 голосов
/ 24 января 2012

Я строю это в бета-сборщике, и я действительно растерялся относительно того, как заставить ajax-вызов происходить внутри моего contentScriptFile. Я хочу получить ajax-запрос для динамического извлечения пакета данных в скрипт, чтобы я мог изменять содержимое страницы. Я искал и искал и, видимо, неправильные термины Помощь приветствуется! Спасибо

main.js

Код:

exports.main = function() {};
var data = require("self").data;
var pageMod = require("page-mod");
pageMod.PageMod({
    include: "http://www.mozilla.org/*",
    contentScriptWhen: 'ready',
    contentScriptFile: [
        data.url('jquery.1.7.1.js'),
        data.url('common.js'),
        data.url("mozilla.top.js")
    ]
})

mozilla.top.js

Код:

var qs = parseQS();
var foo= qs['string'];
var Request = require('request').Request;

Request({
  url: "http://www.myremotepage.org?q="+foo,
  onComplete: function (response) {
    alert(response);
  }
}).get();
alert('test');

старый код, чтобы пролить свет на конечную цель - http-запрос ничего не возвращает, даже если он работает в браузере. Предполагается, что это проблема с разрешениями сторонних инструментов ajax, и началось выше с использованием инструмента запроса дополнения.

Код:

/*
$.ajax({
    url: 'http://www.myremotepage.org?q='+foo,
    data: {q:strSearchQuery},
    dataType: 'json',
    success: function(data) {
        var div = $("<div style='background-color: #ececec;'><h2 style='text-align: right; font-size: 11px; color: #666;'>Test</h2><ul id='ptcid'></ul></div>");
        alert(data.length);
        for(var i = 0; i < data.length; ++i)
        {
            alert('test');
            div.find('ul').append('<li></li>');
            div.find('ul li:last').append('<h3>' + data[i].header+ '</h3>');
            div.find('ul li:last').append('<div>'+data[i].body+'</div>');
            div.find('ul li:last').append('<div>' + data[i].footer + '</div>');
        }
        div.insertBefore('#header');
    }
});
*/

1 Ответ

2 голосов
/ 25 января 2012

Одной из ваших непосредственных проблем является то, что mozilla.top.js добавляется в качестве скрипта содержимого и пытается использовать модуль запроса. Вы не можете использовать модули SDK, такие как запрос, в скрипте контента, вместо этого вам нужно сделать запрос в main.js и затем доставить данные запроса в ваш скрипт контента с помощью worker.port.emit (). В документах подробно рассказывается о связи между скриптами контента:

https://addons.mozilla.org/en-US/developers/docs/sdk/1.4/dev-guide/addon-development/content-scripts/using-port.html

Пример реализации будет выглядеть так:

var pm = require("page-mod").PageMod({
    include: [page_url],
    contentScriptFile: [data.url('jquery.min.js'), data.url('panel.js')],
    onAttach: function(worker) {
        Request({
            url: "http://dl.dropbox.com/u/1212936/test.json",
            onComplete: function (response) {
                var parsed = JSON.parse(response.text);
                worker.port.emit('got-request', parsed);
            }
        }).get();
    }
});

В вашем скрипте контента: вы бы прикрепили слушателя к событию 'got-request':

self.port.on('got-request', function(data) {
    console.log(data);
    $('#data').html(pp(data));
});

Вот рабочий пример сборщика, который использует этот код - он очень простой, но, надеюсь, поможет:

https://builder.addons.mozilla.org/addon/1034982/latest/

...