2010-01-05 3 views
0

У меня есть строгое браузерное javascript & xlst application. Он обычно используется на локальной машине, но иногда доступен через Apache.window.onready = function() Сбой в IE

Главная страница content.html, которая получает свой контент, динамически изменяющийся. В одном случае href на одной странице открывает новое окно, и в итоге выполняется следующий код, который устанавливает функцию onready с целью получения содержимого нового окна.

Это работает практически во всех случаях. Он работает во всех случаях для Firefox. И он даже работает во всех случаях для IE при локальном запуске (например, файл: /// C: /Program%20Files/Apache%20Software%20Foundation/Apache2.2/htdocs/hlic/index.html).

Моя проблема заключается в том, что при доступе через Apache в IE я просто получаю пустое окно. Это действует так, что функция onready никогда не запускается. Однако, если я добавлю предупреждение («огонь»), появится предупреждение, после чего мое содержимое окна будет отображаться. Так почему же он работает только с оповещением? Что еще я могу сделать, чтобы контент появился. Любая помощь будет принята с благодарностью.

Вот код:

/* 
* 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"); 
    }   
} 

ответ

1

Вы могли бы, возможно, попробуйте проверить документ readyState, что-то вроде

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(); 

Не могу гарантировать это будет работать, но, возможно, стоит попробовать?

+0

Это было очень полезно. Спасибо! Для моего случая у меня может быть несколько всплывающих окон, инициированных с той же страницы, причем все они используют тот же код (content.html). Поэтому я просто не проверяю newWindowReadyFired в функции onready. –

+0

На самом деле, вам все равно должно быть безопасно - «закрытие javascript» (определение области видимости, позволяющее внутренним методам доступа к внешним переменным метода) * должно означать, что есть новый экземпляр этой переменной, созданный для каждого вашего вызова Presenter_PresentStreamInNewBrowser(), и правильный пример будет указан в проверках. Я на 90% уверен в этом (что также означает 10% неопределенности, поэтому вы все равно захотите проверить это как-то, возможно, поставив alert(), чтобы показать значение var и проверить его на втором окне нагрузка) – Graza

1

Лучшее предположение, что ready событие уже обжигали в целевом окне к тому времени ваш обработчик назначается, - другими словами, вы попали в состояние гонки.

Решение Я использовал, чтобы иметь что-то в content.html сам выполнить обратный вызов родительского окна с помощью window.opener либо в инлайн Javascript или в ready обработчика в content.html Это возможно в вашем случае использования ?

+0

+1, отличный анализ – orip

+0

Спасибо за ваш ответ. Проблема, похоже, связана с состоянием гонки. –

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