2010-10-01 10 views
13

W naszej (dość dużej i starej) aplikacji ASP.NET używamy wielu stron ładowanych do ramek, iframe i modalnych okien dialogowych (za pomocą window.showModalDialog). Zaczynamy dostrzegać ten błąd nieco powyżej i nie mogę znaleźć nigdzie jednego racjonalnego wytłumaczenia.JS: "The callee (serwer [nie aplikacja serwera]) nie jest dostępny i zniknął." accessing window.opener

  1. Blokowanie pop-upów. Nie. Nie uruchamiamy ich. Nawet wbudowany bloker.

  2. Strefa zaufana. Nie. Aplikacja działa teraz w LocalHost i znajduje się na liście zaufanych witryn.

  3. Bezpańskie promienie kosmiczne. Możliwe, ale nie możliwe. To zbyt konsekwentne.

I zrobił ostatecznie znaleźć się komunikat o błędzie pochowany na stronie Microsoftu w some dusty tome pobierania informacji o komunikat o błędzie automatyki. Mówili o programie Excel i powiedzieli: "W tym przykładzie Microsoft Excel jest aplikacją serwera Odwołanie do obiektu skoroszytu po jego zniszczeniu (lub zamknięciu) generuje błąd:"

To jest prawdopodobnie tak blisko, jak nigdy dotąd, do wyjaśnienia przyczyny błędu, bez rzeczywistego, konkretnego wyjaśnienia. Ktoś próbował użyć czegoś po tym, jak odesłano do niego odnośnik. Dziwne, nadal widać okna na ekranie. Ciekawe jednak, że to podejrzewa mnie o zaakceptowanej odpowiedzi na this.

Oto co się dzieje.

  • Strona A to strona główna.
  • PageA wyświetla stronę B w ramce. PageB to pasek narzędzi.
  • PageA wyświetla stronę C w innej ramce. To jest treść.
  • Wyświetla stronę PageD w niemodalnym oknie dialogowym.
  • PageD, z nieznanych mi powodów, chce zmodyfikować elementy sterujące na stronie B. Próbuje użyć window.opener, aby to zrobić, i strasznie zawodzi.

Jeśli ktoś mógłby mnie oświecić, dlaczego tak jest (kod działa w FF), byłbym wdzięczny.

+0

Która wersja IE i jakiego systemu operacyjnego? Jeśli to IE7, problem prawdopodobnie działa w trybie chronionym. Jeśli to IE8, prawdopodobnie jest to związane z LCIE. Czy możesz odtworzyć problem, jeśli uruchamiasz program IE jako administrator? – EricLaw

+0

IE8 z aplikacją hostowaną pod IIS7. Mogę spróbować uruchomić IE jako administrator, ale wciąż używamy VS2008 SP1, a debugowanie w Win7 jest raczej ... niewiarygodne. –

+0

Cześć Mike, każdy wgląd w to, co się dzieje ... Ja doświadczam tego samego problemu – krul

Odpowiedz

5

Powinienem był wcześniej zaktualizować to pytanie i przepraszam za opóźnienie. Nauczyłem się trochę, odkąd je opublikowałem, i oto czego się nauczyłem.

Dla okien otwieranych za pomocą window.showModalDialog, metoda window.opener zwraca wartość null, a nie odwołanie do okna otwierania. Aby uzyskać odwołanie do okna otwierającego, musisz przekazać je jako argument okna dialogowego.

Nie jest dla mnie jasne w tym miejscu, czy jest to zamierzone zachowanie; to najwyraźniej nieudokumentowane zachowanie. Ponadto, zgodnie z MSDN, window.opener działa tylko w przypadku stron załadowanych do ramek i ramek iframe.

2

Miałem dokładnie ten sam komunikat o błędzie w następującym scenariuszu: Okno Pop up wiatr B, użytkownik szuka czegoś i wiatr B wywołuje wiatr A przechodząc jakiś parametr. Metoda wywoływana przez wiatr A powinna zamykać wyskakujące okienko B po zakończeniu, wykonując to, co robi. Podałem parametr jako obiekt: p = {a: 1, b: "c"} po tym, jak przepisałem kod, aby przekazać każdy parametr osobno, błąd zniknął. callingMethod (1, "c");

nadzieję, że pomoże ktoś ...

+0

Wow. Dziekuję Dziekuję Dziękuję. Byłem zaskoczony, zanim przeczytałem twoją odpowiedź. – morgancodes

11

Chociaż moja odpowiedź nie jest bezpośrednio stosowane do tej konkretnej kwestii, jeśli otrzymuję ten błąd (wywoływany (serwer [nie aplikacja serwera]) nie jest dostępny i zniknął:) podczas komunikowania się między oknem podręcznym a oknem otwieracza, dzieje się tak dlatego, że okno podręczne utworzyło obiekt, który następnie został przekazany do okna otwieracza. Kiedy wyskakujące okno zostanie zamknięte, Internet Explorer zabije wszystkie obiekty utworzone przez wyskakujące okno. A ponieważ obiekt jest przekazywany przez odniesienie, obiekt, do którego odnosi się okno dialogowe otwieracza, już nie istnieje. Łatwym obejściem jest przekazanie wartości przez konwersję obiektu na ciąg JSON przy użyciu JSON.stringify. Następnie możesz przekonwertować ciąg z powrotem na obiekt w window.opener za pomocą JSON.parse().

Przykład:

Pop-up Okno:

window.opener.callback(JSON.stringify({ 
    id: 1, 
    name: "foo" 
})); 

Otwieracz Okno:

window.callback = function (response) { 
    var foo = JSON.parse(response); 
}; 

Stosując to podejście, okno otwieracz nie jest już odwołanie do obiektu, który został utworzony w wyskakujące okno, więc obiekt w oknie otwieracza przetrwa po zamknięciu okna podręcznego.

0

można dostać ten błąd w Excelu

Sub LoadParameterForm() 

If frmParm Is Nothing Then 
    Set frmParm = New frm_setParameters 
End If 

frmParm.Show 
end sub 

Tutaj frmParm jest zmienny poziom moduł. Klikając przycisk OK, zamierzam .HIDE() formularza, aby wybory użytkownika były lepkie. Jeśli użytkownik kliknie pole kontrolne X i zamknie formularz, oznacza to, że frmParm wskazuje coś, co już nie istnieje.

Nie znalazłem sposobu na sprawdzenie warunku, pułapkę na błąd, ustaw formularz na zero i spróbuj ponownie.

Zdaję sobie sprawę, że nie jest to dokładnie pytanie, które należy zadać, ale jest to konkretny przykład powiązanego problemu programu Excel wymienionego kilka razy w postach.

Powiązane problemy