Javascript iframe проблема с кэшированием - PullRequest
1 голос
/ 17 марта 2010

У меня есть iframe, который загружает некоторые javascript через javascript. Только в Internet Explorer, это работает тогда и только тогда, когда IE имеет кэшированную копию javascript. Это означает, что перезагрузка страницы (или иным образом запуск сценария для повторного запуска, если он застрял в функции или где-либо еще) приведет к тому, что этот код будет работать, в противном случае это не будет. В частности, происходит сбой вызова document.write.

Главная страница:

<iframe height = "200" width = "200" id = "happy">
</iframe>
<script type="text/javascript">
 var a = document.getElementById("happy");
 scripttxt = '<a href="#" id="joy">JOY</a><'+'script type="text/javascript" src="fail.js"></'+'script>';
 a.src = "about:blank"; 
 a.contentWindow.document.open();
 a.contentWindow.document.write("<h3>Preview:</h3>" + scripttxt + "");
 a.contentWindow.document.close();
</script>
* * 1005 fail.js
document.write(document.getElementById("joy"));

Я понимаю, что я мог бы использовать условные комментарии, чтобы IE пропускал document.open() и document.close() в скрипте главной страницы, но при этом IE пропускал document.open () и document.close () чувствовал себя немного странно (Правка) ... и ломает другие вещи в IE .

Edit: При правильной работе iframe будет содержать под заголовком предварительного просмотра текст: JOYhttp://mymachine:myport/mainpage.htm#, где JOY - гиперссылка. Когда это терпит неудачу, это пропустит http://mymachine:myport/mainpage.htm#. На самом деле мне все равно, как document.write обрабатывает запись узла a, просто то, что он может успешно получить элемент и что-то успешно написать.

Я также попробовал эту версию скрипта, по совету Джастина, но он ведет себя точно так же:

var a = document.getElementById("happy");
a.src = "about:blank";  
r = document.createElement("a");
r.id="joy";
r.href="#";
r.innerText="JOY";
s = document.createElement("script");
s.src="fail.js";    
a.contentWindow.document.body.appendChild(r);
a.contentWindow.document.body.appendChild(s);

Ответы [ 3 ]

0 голосов
/ 18 марта 2010

Почему вы используете document.write? Вместо этого попробуйте добавить узел скрипта.

var d = document.getElementById("happy"),
    s = document.createElement("script");

s.src= "http://asdf.com/asdf.js";
d.contentWindow.document.body.appendChild(s);
0 голосов
/ 18 марта 2010

Мое текущее решение, которое, кажется, работает, таково:

Изменение

a.contentWindow.document.close();

до

if (!isIE) {a.contentWindow.document.close();}

и добавьте этот код над скриптом:

<script type='text/javascript'>
    isIE = false;
</script>
<!--[if IE]>    
<script type='text/javascript'>
    isIE = true;
</script>
<![endif]-->

Это решение меня очень огорчает.

0 голосов
/ 18 марта 2010

Попробуйте изменить свой код так:

// ...
var doc = a.contentWindow.document.open();
doc.write("<h3>Preview:</h3>" + scripttxt + "");
doc.close();

ой, подождите, нет, у меня похожая проблема.

Что ж, затирание вашего документа с "document.write" в любом случае немного странно. Какова общая цель здесь? Не можете ли вы добавить контент в документ другим способом?

Мне кажется, я понимаю, к чему вы клоните: можно было бы ожидать, что браузер будет подчиняться обычному образу жизни, загружая скрипт (и ожидая завершения HTTP GET), запуская скрипт & mdash ; это должно означать, что вызов write в скрипте должен все еще иметь открытый документ & mdash; а затем вернуться. Опять же, мне это кажется немного рискованным, учитывая, что речь идет об однопоточной среде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...