2012-10-04 10 views
6

Soy nuevo en el desarrollo de complementos de Firefox.Cómo llamar a una función de script de contenido desde main.js en el complemento de Firefox

Necesito una forma de llamar a una función de contentscript desde main.js en el complemento de Firefox.

He insertado el contenido xyz.js en cada página web de apertura.

Quiero llamar a la función abc() presente en mi contentscript xyz.js desde mi main.js al hacer clic en un botón que tengo en la barra de herramientas de navegación.

A continuación se muestra mi código.

main.js

.. 
function addToolbarButton() { 
    var document = mediator.getMostRecentWindow('navigator:browser').document;   
    var navBar = document.getElementById('nav-bar'); 
    if (!navBar) { 
     return; 
    } 
    var btn = document.createElement('toolbarbutton'); 
    btn.setAttribute('id', 'mybutton-id'); 
    btn.setAttribute('type', 'button'); 
    btn.setAttribute('class', 'toolbarbutton-1'); 
    btn.setAttribute('image', data.url('icon_16.png')); 
    btn.setAttribute('orient', 'vertical'); 
     btn.setAttribute('label', 'Test'); 
     btn.addEventListener('click', function() { 
      tabs.activeTab.attach({ 
      // 

       abc()  //here i want to call the function present in my contentscript 

      // 
     }); 
     }, false) 
    navBar.appendChild(btn); 
} 

.. 

xyz.js

.. 

function abc(){ 
//here is my code logic 
} 

.. 

vine a saber que el paso de mensajes es la forma de hacerlo, pero incapaz de implementar en Firefox.

Por favor, ayúdenme me he quedado atrapado.

Respuesta

4

No puede llamar a la función directamente, debe enviar un mensaje al script de contenido. Es decir, algo así:

var worker = tabs.activeTab.attach({ 
    ... 
}); 

// Some time later 
worker.postMessage("doABC"); 

Y en el guión contenido:

self.on("message", function(message) { 
    if (message == "doABC") 
    abc(); 
}); 

Para obtener más información sobre la comunicación con los guiones de contenido ver documentation.

+0

Esta es una pregunta muy común sobre SO: ¿deberíamos comenzar a vincular a una respuesta canónica en lugar de volver a responder? – canuckistani

+0

@canuckistani: ¿Hay una respuesta canónica? Mi respuesta aquí es simplemente un RTFM ampliado. La mayoría de las veces, sin embargo, son personas que simplemente no pueden concentrarse en el enfoque de mensajería del SDK. Sería todo para cerrar estas preguntas como duplicados, pero nunca hay una pregunta que sea lo suficientemente similar (probablemente una indicación de "demasiado localizado" en realidad). –

+0

Revisé la historia reciente de estas preguntas y acepto, todas son lo suficientemente diferentes. Gracias por tener la paciencia para señalarlos en la dirección correcta. – canuckistani

1

Según la documentación, debería funcionar de esta manera;

Sin embargo, tengo una pregunta similar Accessing pre-loaded content script from ActionButton aún no resuelta.

// main.js 
function handleClick(state) { 
    var myWorker = tabs.activeTab.attach({ 

    }); 
    myWorker.port.emit("initialize", "Message from the add-on"); 
} 

// content.js 
/*BEGIN Listen events coming from Add-on script*/ 
self.port.on("initialize", function() { 
    alert('self.port.on("initialize")'); 
    return; 
}); 
Cuestiones relacionadas