2008-08-30 16 views
6

Estoy tratando de abrir una nueva pestaña del navegador con los resultados de una solicitud POST. Estoy tratando de hacerlo a través de una función que contiene el código siguiente:¿Cómo se hace una solicitud en una nueva pestaña del navegador usando JavaScript/XUL?

var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"] 
    .getService(Components.interface 
s.nsIWindowMediator); 
var browserWindow = windowManager.getMostRecentWindow("navigator:browser"); 
var browser = browserWindow.getBrowser(); 
if(browser.mCurrentBrowser.currentURI.spec == "about:blank") 
    browserWindow.loadURI(url, null, postData, false); 
else 
    browser.loadOneTab(url, null, null, postData, false, false); 

estoy usando una cadena como url, y los datos JSON como Postdatum. ¿Hay algo que estoy haciendo mal?

Lo que sucede, se crea una nueva pestaña, la ubicación muestra la URL en la que quiero publicar, pero el documento está en blanco. Los botones Atrás, Adelante y Recargar están todos en gris en el navegador. Parece que hizo todo, excepto que ejecutó el POST. Si dejo el parámetro postData desactivado, entonces ejecuta correctamente un GET.

identificador de construcción: Mozilla/5.0 (Macintosh; T; Intel Mac OS X 10.5; en-US; rv: 1.9.0.1) Gecko/2008070206 Firefox/3.0.1

Respuesta

0

tratar con addTab en lugar de loadOneTab, y elimina el último parámetro.

Consulte this page en el Centro de desarrollo de Mozilla para obtener información sobre cómo abrir pestañas.

Usted podría utilizar esta función, por ejemplo:

function openAndReuseOneTabPerURL(url) { 
    var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] 
        .getService(Components.interfaces.nsIWindowMediator); 
    var browserEnumerator = wm.getEnumerator("navigator:browser"); 

    // Check each browser instance for our URL 
    var found = false; 
    while (!found && browserEnumerator.hasMoreElements()) { 
    var browserInstance = browserEnumerator.getNext().getBrowser(); 

    // Check each tab of this browser instance 
    var numTabs = browserInstance.tabContainer.childNodes.length; 
    for(var index=0; index<numTabs; index++) { 
     var currentBrowser = browserInstance.getBrowserAtIndex(index); 
     if ("about:blank" == currentBrowser.currentURI.spec) { 

     // The URL is already opened. Select this tab. 
     browserInstance.selectedTab = browserInstance.tabContainer.childNodes[index]; 

     // Focus *this* browser 
     browserInstance.focus(); 
     found = true; 
     break; 
     } 
    } 
    } 

    // Our URL isn't open. Open it now. 
    if (!found) { 
    var recentWindow = wm.getMostRecentWindow("navigator:browser"); 
    if (recentWindow) { 
     // Use an existing browser window 
     recentWindow.delayedOpenTab(url, null, null, null, null); 
    } 
    else { 
     // No browser windows are open, so open a new one. 
     window.open(url); 
    } 
    } 
} 
4

Algo que es menos Mozilla específico y debería funcionar razonablemente bien con la mayoría de los navegadores:

  • Crear un formulario oculto con los campos configure la forma en que los necesita
  • Asegúrese de que el atributo "objetivo" del formulario esté configurado en "_BLANK"
  • Envíe el formulario por programación
3

La respuesta a esto fue encontrada por shog9. El parámetro postData debe ser un objeto nsIMIMEInputStream como se detalla en here.

Cuestiones relacionadas