2010-01-05 5 views
0

J'ai un navigateur strictement basé sur javascript & xlst application. Il est normalement utilisé sur une machine locale, mais est parfois accessible via Apache.window.onready = function() échoue dans IE

La page principale est content.html dont le contenu est modifié dynamiquement. Dans un cas, un href dans une page ouvre une nouvelle fenêtre et finalement le code suivant est exécuté, ce qui crée une fonction onready, avec l'intention d'obtenir le contenu de la nouvelle fenêtre.

Cela fonctionne dans presque tous les cas. Cela fonctionne dans tous les cas pour Firefox. Et il fonctionne même dans tous les cas pour IE lorsqu'il est exécuté localement (par exemple, file: /// C: /Program%20Files/Apache%20Software%20Foundation/Apache2.2/htdocs/hlic/index.html).

Mon problème est que lorsque j'accède via Apache dans IE, je viens d'obtenir une fenêtre vide. C'est comme si la fonction onready n'était jamais activée. Cependant, si j'ajoute une alerte ("fire"), l'alerte s'affiche, après quoi le contenu de ma fenêtre s'affiche. Alors, pourquoi ça marche seulement avec l'alerte? Que puis-je faire d'autre pour que le contenu apparaisse? Toute aide serait grandement appréciée.

Voici le code:

/* 
* PresentStreamInNewBrowser 
* 
*  Creates a new browser window and fills with 
*  provided content stream. Also sizes the 
*  window to either default dimensions or to any  
*  supplied dimensions. 
* 
*  A close and a print button are added to the bottom 
*  of the content stream. 
* 
*  Inputs: 
*   pageStream - content stream to display 
*    in new window. 
*   height, width, top, left - dimensions 
*    for the newly opened window. (optional) 
* 
*/ 
function Presenter_PresentStreamInNewBrowser(pageStream, height, width, top, left) 
{ 
    // set the features 
    var features = "height=" + height; 
     features += ",width=" + width; 
     features += ",top=" + top; 
     features += ",left=" + left; 
     features += ",scrollbars=yes"; 
     features += ",resizable=yes"; 

    // open the window 
    var presenter = this; 
    var newWindow = window.open(
     app.NormalizeURI("deview/frames/content.html"), '', features); 

    // the rest of the code executes when the content window 
    // calls its onready function, after it has loaded 
    newWindow.onready = function() { 



     var doc = newWindow.document; 

     // create stylesheet links if applicable 
     for(var i = 0; i < pageStream.stylesheet.length; i++) { 
      var linkElement = doc.createElement("link"); 
      linkElement.rel = "stylesheet"; 
      linkElement.href = pageStream.stylesheet[i]; 
      doc.getElementsByTagName("head")[0].appendChild(linkElement); 
     } 

     // insert content 
     doc.body.innerHTML = ""; 
     doc.body.appendChild(pageStream.content.importIntoDocument(doc)); 
     doc.body.appendChild(doc.createElement("br")); 

     // Handle generation of special pages. 
     presenter.AddGeneratedContent(doc); 

     // add a close button 
     var selectionString = 
     "displayStrings/promptStrings/promptString[@id='close_button_anchor']"; 
     var buttontext = app.displayStringsDOM.selectSingleNode(
     selectionString).firstChild.nodeValue; 
     var closeButtonElement = doc.createElement("button"); 
     closeButtonElement.id = "closebutton"; 
     closeButtonElement.className = "addonbutton"; 
     closeButtonElement.onclick = "javascript:window.close()"; 
     closeButtonElement.value = buttontext; 
     doc.body.appendChild(closeButtonElement); 

     // add a print button 
     selectionString = 
     "displayStrings/buttonLabelStrings/buttonLabelString[@id='print_button_anchor']"; 
     buttontext = app.displayStringsDOM.selectSingleNode(
     selectionString).firstChild.nodeValue; 
     var printButtonElement = doc.createElement("button"); 
     printButtonElement.id = "printbutton"; 
     printButtonElement.className = "addonbutton"; 
     printButtonElement.onclick = "javascript:window.print()"; 
     printButtonElement.value = buttontext; 
     doc.body.appendChild(printButtonElement); 

     // close up shop 
     newWindow.document.body.appendChild(
     newWindow.document.createElement("br")); 
     newWindow.document.title = '-'; 

     // add some language dependent text 
     presenter.AddButtonLabel(doc); 
     presenter.AddExamLabels(doc); 

     //alert("fire"); 
    }   
} 

Répondre

1

Vous pouvez peut-être essayer de vérifier le document readyState, quelque chose comme

var newWindowReadyFired = false; 

newWindow.onready = function() { 
    if (newWindowReadyFired) return; //just in case race condition got us in here twice 
    newWindowReadyFired = true; 

    //....the rest of your event handler 
} 

function chkFunc() { 
    if (newWindowReadyFired) return; //magic already done 

    if (newWindow.document && newWindow.document.readyState == 4) { 
    newWindow.onready(); 
    } else { 
    setTimeout(chkFunc,"100"); //wait and try again 
    } 
} 
chkFunc(); 

ne peut pas garantir que cela fonctionne, mais peut-être la peine d'essayer?

+0

C'était extreamly utile. Je vous remercie! Pour mon cas, je peux effectivement avoir plusieurs pop-ups initiés à partir de la même page, tout en utilisant le même code (content.html). Donc je ne vérifie pas newWindowReadyFired dans la fonction onready. –

+0

En fait, il devrait toujours être sécuritaire de le faire - "javascript closures" (scoping, permettant aux méthodes internes d'accéder aux variables de la méthode externe) * devrait * signifier qu'une nouvelle instance de cette variable est créée chaque fois que vous appelez La méthode Presenter_PresentStreamInNewBrowser() et l'instance correcte sont référencées dans les contrôles. Je suis sûr à 90% de cela (ce qui signifie également 10% d'incertitude, donc vous voudrez toujours vérifier cela vous-même, peut-être en mettant un alert() pour montrer la valeur de la var et la vérifier sur votre seconde fenêtre charge) – Graza

1

meilleure estimation est que l'événement ready a déjà tiré dans la fenêtre cible au moment où votre gestionnaire est attribué - en d'autres termes, vous frappez une condition de course.

La solution que je l'ai utilisé est d'avoir quelque chose dans content.html lui-même exécuter un rappel à la fenêtre parent à l'aide window.opener soit en ligne Javascript ou dans un gestionnaire readyau sein content.html Est-ce possible dans votre cas d'utilisation ?

+0

+1, super analyse – orip

+0

Merci pour votre réponse. Le problème semble être lié à une condition de concurrence. –

Questions connexes