2013-02-21 12 views
10

utworzyć IFRAME dynamicznie w następujący sposób:iframe contentWindow rzuca Błąd odmowy dostępu po skróceniu document.domain

var wrapUpIframe = document.createElement("iframe"); 
wrapUpIframe.id = 'WrapUpDialog3'; 
wrapUpIframe.src = 'WrapUpDialog.html';  
document.body.appendChild(wrapUpIframe); 

po dynamiczne tworzenie mój document.domain jest skrócony z Servername.dc.com tylko dc.com,

ale gdy próbuję uzyskać dostęp contentWindow mam Odmowa dostępu błąd:

document.getElementById("WrapUpDialog3").contentWindow.SomeFunction(); 

Uwaga: Kiedy definiuję IFRAME statycznie w HTML, działa dobrze.
Próbowałem również zmienić moje IFRAME document.domain w następujący sposób:

WrapUpDialog3.document.domain = dc.com; 

Sprawdziłem zarówno document.domain i moją domenę IFRAME i oba są identyczne.

Co mogę zrobić?

Pracuję z IE9.

+0

W jakiej przeglądarce występuje takie zachowanie? Po wpisaniu kodu do debuggera Chrome mogę uzyskać dostęp do "el.contentWindow" dobrze. Zauważ, że nie tylko domena musi się zgadzać, ale pełne pochodzenie, możesz więc spróbować porównać 'document.location.origin' z dwóch okien. –

+0

@nhaldimann pracuję z IE9 –

+0

Zostało tutaj odpowiedzi: http://stackoverflow.com/questions/364952/jquery-javascript-accessing-contents-of-an-iframe Bertrand – Bertrand

Odpowiedz

9

Najpierw spójrz na poprawną odpowiedź z tego post. Wydaje mi się, że to może być twój problem.

Jeśli nie, to może ten szybki hack, który widziałem z innego post może pomóc.

var frame = $('<iframe>') 
.attr('id', 'myIframe') 
.addClass('someClass') 
.attr('src', 'javascript:(function() {' +'document.open();document.domain=\'myDomain.net\';document.close();' + '})();'); 
.appendTo($('#someDiv')); 

Nie jestem pewien, czy jest to istotne, ale znalazłem to również w Internecie link.

OK, aby odpowiedzieć na Twój komentarz. Funkcja javascript nie przypisuje źródła, ustawia domenę dokumentu, która najwyraźniej nie jest poprawnie wykonywana w I.E.

Sprawdź ten przykład link dla innego przykładu i objaśnienia.

Więc co chciałbym spróbować może być coś takiego ...

var wrapUpIframe = document.createElement("iframe"); 
wrapUpIframe.id = 'WrapUpDialog3';  
wrapUpIframe.src = setSrc(); 
document.body.appendChild(wrapUpIframe); 

function setSrc(){document.open();document.domain=\'dc.com\';document.close();return 'WrapUpDialog.html';} 

Być może będziesz musiał bawić się z jak przywrócić rzeczywisty URL iframe po uruchomieniu funkcji, która ustawia domenę dokumentu. Ale z tego, co widzę, to może ci pomóc.

Miałem podobny problem, ale nie do końca ten sam problem, dlatego nie mogę podać dokładnej poprawki. Funkcja ustawiająca domenę dokumentu spowodowała, że ​​pominąłem błąd odmowy dostępu.

Możesz również dodać to do głównego dokumentu, aby upewnić się, że domeny są zgodne.

<script type="text/javascript"> 
    document.domain = 'dc.com'; 
    </script> 

Chciałam również dodać link jakiegoś wyjaśnienia na jawnie ustawienie document.domain że używałem wcześniej. Pomogło mi to w przeszłości. Szczególnie ten cytat ...

Explicitly setting the value indicates intent to "cooperate" with a script on another subdomain (under the same parent domain).

Dor, możesz mieć problem z regulacją czasu. Znalazłem kod (tutaj), który właśnie przetestowałem, który działa dla mnie.Upewnia się, że element iframe został wczytany przed próbą uzyskania dostępu do contentWindow.

var iframe = document.createElement("iframe"); 
iframe.src = "WrapUpDialog.html"; 

if (iframe.attachEvent){ 
    iframe.attachEvent("onload", function(){ 
     alert("Local iframe is now loaded."); 
    }); 
} else { 
    iframe.onload = function(){ 
     alert("Local iframe is now loaded."); 
    }; 
} 

document.body.appendChild(iframe); 

var iframeWindow = iframe.contentWindow || iframe.contentDocument.parentWindow; 
+0

Dzięki za odpowiedź, mój src powinien być zewnętrzną stroną html - WrapUpDialog.html, jak załadować ją za pomocą sugestii? –

+0

Dor, czy próbujesz załadować funkcje js wspomniane w tym pytaniu (http://stackoverflow.com/questions/14849606/load-external-html-file-to-div-and-use-its-js-functions) na tej stronie html? – Vic

+1

Dor, która część pomogła? – Vic

2

Jak obsługiwać pliki? Czy widzisz file:/// w pasku adresu? Jeśli tak, spróbuj podać swój kod za pomocą serwera internetowego.

Google Chrome daje błąd odmowy dostępu, jeśli wypróbuję Twój kod za pomocą file:///, ale działa on, gdy jest obsługiwany z lokalnego serwera WWW (tzn. Adres zaczyna się od http://localhost/).

+0

Używam zwykłej strony HTML, bez plików –

1

Ponieważ nie przyjęto jeszcze żadnej z podanych odpowiedzi, prawdopodobnie nadal występuje problem.

Spróbuj jednoznacznie ustawić document.domain na obu stronach HTML (wydaje się, że robisz to tylko na jednej stronie). Oznacza to, że zgodnie z sugestią @Vic, trzeba dodać następujący kod javascript do HTML, który zawiera iframe:

document.domain = 'dc.com'; 

Oznacza to, że kod będzie wyglądać następująco:

document.domain = 'dc.com'; 
var wrapUpIframe = document.createElement("iframe"); 
wrapUpIframe.id = 'WrapUpDialog3'; 
wrapUpIframe.src = 'WrapUpDialog.html';  
document.body.appendChild(wrapUpIframe); 

Następnie w WrapUpDialog.html sama (nie na stronie głównej, bo wtedy można obejść system zabezpieczeń!) trzeba ustawić document.domain także:

document.domain = dc.com; 

więc ta linia Y nasz nie będzie działać:

WrapUpDialog3.document.domain = 'dc.com'; 

WrapUpDialog.html bo sam musi wyrazić zgodę na jego stronie „macierzystego”, aby wykonać swój skrypt.

Więcej informacji na tej stronie: What does document.domain = document.domain do?.

Ostatnia podpowiedź: wypróbuj kod za pomocą różnych przeglądarek: IE9, Firefox, Google Chrome. Może to pomóc ci określić, czy prawdopodobnie masz do czynienia z dziwactwem jednej konkretnej przeglądarki.

Powiązane problemy