2014-09-02 4 views
0
context_menu.Item({ 
    label: "Search", 
    context: context_menu.SelectionContext(), 
    contentScriptFile: [data.url("my_scripts/post_messages.js")], 
    onMessage: function(msg) { 
     if (msg == 'context') { 
      var text = get_selected_text(); 
      if (text.length > 2) { 
       this.label = 'Search "' + text + '"'; 
      } else { 
       this.label = ""; 
      } 
     } 
     if (msg == 'click') { 
      var filename = 'selected_word.txt'; 
      var str = get_selected_text(); 
      saveText(filename, str); 
     } 
    }, 
}); 

Выше является частью моего кода. Проблема заключается в том, когда this.label настроен как «", в меню правой кнопки мыши отображается пустая метка, но я не хочу, чтобы это было показано. Я знаю, что это можно сделать, если self.on («context», ...); функция возвращает false, но я не знаю, как отправить сообщение в скрипт содержимого.firefox addon контекстное меню этикетка

Кстати, функция get_selected_text() лучше определена в сценарии аддона, используя «sdk/selection», поэтому он не определен в скрипте содержимого.

Как отправить сообщение (выбор) в сценарий содержимого, или это возможно? Или что именно происходит после self.on ('context', ...); функция возвращает false, чтобы сделать вкладку не показанной?

ответ

1

Я сделал решение, не совершенное, но достаточно для меня.

var selection_workers = []; 
tabs.on('ready', function(tab) { 
    var worker = tab.attach({ 
     contentScriptFile: [data.url("my_scripts/receive_post_messages.js"),], 
    }); 
    selection_workers.push(worker); 
}); 

selection.on('select', function() { 
    var obj = { 
     text: get_selected_text(), 
     url: tabs.activeTab.url, 
    }; 
    for (var i in selection_workers) { 
     var worker = selection_workers[i]; 
     worker.port.emit('selected_text', obj); 
    } 
}); 

Затем сохраните выделенный текст как атрибут тела, чтобы я мог делать то, что хочу.

0

Попробуйте этот код. Я использую таблицу стилей, чтобы отображать ее не всякий раз, когда метка найдена с уникальным значением dont show this label unique ya ya.

Теперь вместо того, чтобы устанавливать его в пустую, установите его на labelValToHide.

var {Cc, Ci} = require('chrome'); 
var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService); 
var labelValToHide = "dont show this label unique ya ya"; 
var css = "label[value='" + tempHold + "'] { display:none; }"; 
var newURIParam = { 
    aURL: 'data:text/css,' + encodeURIComponent(css), 
    aOriginCharset: null, 
    aBaseURI: null 
} 
cssUri = Services.io.newURI(newURIParam.aURL, newURIParam.aOriginCharset, newURIParam.aBaseURI); 
sss.loadAndRegisterSheet(cssUri, myServices.sss.AUTHOR_SHEET); 

context_menu.Item({ 
    label: "Search", 
    context: context_menu.SelectionContext(), 
    contentScriptFile: [data.url("my_scripts/post_messages.js")], 
    onMessage: function(msg) { 
     if (msg == 'context') { 
      var text = get_selected_text(); 
      if (text.length > 2) { 
       this.label = 'Search "' + text + '"'; 
      } else { 
       this.label = labelValToHide; 

      } 
     } 
     if (msg == 'click') { 
      var filename = 'selected_word.txt'; 
      var str = get_selected_text(); 
      saveText(filename, str); 
     } 
    }, 
}); 


//on unload of addon run this: 
//myServices.sss.unregisterSheet(cssUri, myServices.sss.AUTHOR_SHEET); 
Смежные вопросы