2013-09-07 2 views
0

С в XUL на основе Firefox аддон, мне нужно:Загрузка нескольких страниц в скрытом IFRAME из XUL на основе расширения Firefox

  1. программно создать невидимый IFRAME (раз)
  2. использовать его для загрузки несколько URL-адресов, как аддон работает
  3. доступ возвращаемый HTML после каждого URL нагрузок

проблема: я могу получить только первую загрузку страниц для любого созданного фрейма, чтобы вызвать «OnLoad» или событие «DOMContentLoaded». Для последующих URL-адресов не запускается событие.

Примечание: Я также хорошо с помощью самой hiddenDOMWindow, если это возможно ...

Код:

var urls = ['http://en.wikipedia.org/wiki/Internet', 'http://en.wikipedia.org/wiki/IPv4', 'http://en.wikipedia.org/wiki/Multicast' ]; 

visitPage(urls.pop()); 

function visitPage(url) { 

    var XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; 

    var hiddenWindow = Components.classes["@mozilla.org/appshell/appShellService;1"].getService 
     (Components.interfaces.nsIAppShellService).hiddenDOMWindow; 

    var doc = hiddenWindow.document, iframe = doc.getElementById("my-iframe"); 

    if (!iframe) 
    { 
     iframe = doc.createElement("iframe"); 
     //OR: iframe = doc.createElementNS(XUL_NS,"iframe"); 

     iframe.setAttribute("id", "my-iframe"); 
     iframe.setAttribute('style', 'display: none'); 

     iframe.addEventListener("DOMContentLoaded", function (e) { 
      dump('DOMContentLoaded: '+e.originalTarget.location.href); 
      visitPage(urls.pop()); 
     }); 

     doc.documentElement.appendChild(iframe); 
    } 

    iframe.src = url;  
} 
+0

Оставьте свой код, пожалуйста. – nmaier

ответ

2

Есть некоторые ловушки:

  • В hiddenWindow ОТЛИЧАЕТСЯ между платформами. Это XUL на Mac и HTML еще.
  • Чтобы надежно перемещаться, вы должны использовать .setAttribute("src", url);.

Следующие работы для меня (Mac, Win7):

var urls = [ 
    'http://en.wikipedia.org/wiki/Internet', 
    'http://en.wikipedia.org/wiki/IPv4', 
    'http://en.wikipedia.org/wiki/Multicast' 
]; 

var hiddenWindow = Components.classes["@mozilla.org/appshell/appShellService;1"]. 
        getService(Components.interfaces.nsIAppShellService). 
        hiddenDOMWindow; 

function visitPage(url) { 
    var iframe = hiddenWindow.document.getElementById("my-iframe"); 
    if (!iframe) { 
     // Always use html. The hidden window might be XUL (Mac) 
     // or just html (other platforms). 
     iframe = hiddenWindow.document. 
       createElementNS("http://www.w3.org/1999/xhtml", "iframe"); 
     iframe.setAttribute("id", "my-iframe"); 
     iframe.addEventListener("DOMContentLoaded", function (e) { 
      console.log("DOMContentLoaded: " + 
         e.originalTarget.location); 
      var u = urls.pop(); 
      // Make sure there actually was something left to load. 
      if (u) { 
       visitPage(u); 
      } 
     }); 
     hiddenWindow.document.documentElement.appendChild(iframe); 
    } 
    // Use .setAttribute() to reliably navigate the iframe. 
    iframe.setAttribute("src", url); 
} 

visitPage(urls.pop()); 

Не перезарядить hiddenWindow себя, или вы сломается много другого кода.

Смежные вопросы