contentScript: self.on('click', function() { tabs.open(url) }) - Не мога да отворя нов раздел тук

В моя елемент от менюто потребителят вижда вече преведен избран текст - това се прави в onMessage (и сега не мога да превеждам и отварям раздел в тази функция - само превеждам) и не разбирам - как мога да отворя нов раздел след потребител щракнете върху елемент - tabs.open не работи на contentScript, дори ако на contentScript извикам функция или ако променя на contentScriptFile. Кодът на моя аддон:

var contextMenu = require("sdk/context-menu");
var Request = require("sdk/request").Request;
var self = require('sdk/self');
var tabs = require('sdk/tabs');
var translating = 'translating...';

var menuItem = contextMenu.Item({
    label: translating,
    image: self.data.url('ico.png'),
    context: contextMenu.SelectionContext(),
    contentScript: 'self.on("context", function() {' +
                        'self.postMessage(window.getSelection().toString());' +
                        'return true;' +
                    '});' +
                    'self.on("click", function() {' +
                        'tabs.open("https://translate.yandex.by/?text=" + window.getSelection().toString());' + // this is not working here
                    '})',
    onMessage: function(selectionText) {
        menuItem.label = translating;
        Request({
            url: "https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20150402T173446Z.82a90fe78ca2aeaf.a3bd7c7a0f72b260e28f5d92e4f242cf6ba189d3&lang=ru&text="+selectionText,
            onComplete: function(response) {
                var translated = response.json.text[0];
                menuItem.label = translated;
            }
        }).get();
    }
});

person Vitaly Zdanevich    schedule 22.04.2015    source източник
comment
този оценен код...   -  person Mulan    schedule 22.04.2015


Отговори (1)


Наистина си близо. Обектът „tabs“ е достъпен само в index.js – трябва да мислите за оценения код, който предоставяте като свойството „contentScript“, като за напълно различна среда. Актуализирах кода, основно всичко, което е различно, е, че изпращам URL адреса на yandex обратно към index.js чрез postMessage, за да мога да отворя раздела в index.js:

var contextMenu = require("sdk/context-menu");
var Request = require("sdk/request").Request;
var self = require('sdk/self');
var tabs = require('sdk/tabs');
var translating = 'translating...';

var menuItem = contextMenu.Item({
    label: translating,
    image: self.data.url('ico.png'),
    context: contextMenu.SelectionContext(),
    contentScript: 'self.on("context", function() {' +
                        'var selectionText = window.getSelection().toString();' +
                        'self.postMessage({name:"context",data:selectionText});' +
                        'return true;' +
                    '});' +
                    'self.on("click", function() {' +
                        'var selectionText = window.getSelection().toString();' +
                        'self.postMessage({name:"click", data:"https://translate.yandex.by/?text=" + selectionText});' +
                    '})',
    onMessage: function(message) {
        if (message.name === 'context') {
            // handle the context message
            menuItem.label = translating;
            Request({
                url: "https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20150402T173446Z.82a90fe78ca2aeaf.a3bd7c7a0f72b260e28f5d92e4f242cf6ba189d3&lang=ru&text="+selectionText,
                onComplete: function(response) {
                    var translated = response.json.text[0];
                    menuItem.label = translated;
                }
            }).get();
        }
        else if (message.name === 'click') {
            // handle the click message
            tabs.open(message.data);
        }
    }
});

Вижте обширната документация на SDK относно как работят скриптовете за съдържание за повече информация по тази тема.

person therealjeffg    schedule 03.05.2015