Правильный доступ динамического iFrame в IE - PullRequest
2 голосов
/ 28 ноября 2011

Простой JS - пожалуйста, не предлагайте jQuery - это для букмарклета, который должен использовать как можно более простой JS.

Я надеюсь, что кто-то ЗНАЕТ ответ, так как я не могу создать надежную скрипку.

Этот код будет работать в объеме страницы, в которую он вставлен - он отлично работает в Fx6-9, сафари и последних Chromes на Windows XP и OSX - только IE дает мне неопределенное значение, когда я пытаюсь получить доступ к iFrame

var zContainer = document.getElementById('zContainer');
if (zContainer==null) {
  zContainer = document.createElement("div");
  zContainer.id="zContainer";
  document.body.appendChild(zContainer);
}    

var zStuff = {}; // minimise window var footprint
zStuff.html = '<body>Hello</body>';
if (!zFrame) { // did we already have one?
  zFrame = document.createElement("iframe");
  zFrame.id="zIframeId"; zFrame.name="zIframeName"; zFrame.frameBorder="0";
  zIFS = zFrame.style; zIFS.border="0"; zIFS.width="500px"; zIFS.height="500px"; zIFS.backgroundColor="white"; zIFS.display="block";
  zContainer.appendChild(zFrame); // append to div

  zFrame = window.frames["zIframeName"]; // undefined in IE8 !!!!!
  // zFrame = document.getElementById("zIframeId"); // undefined in IE8 !!!!!

  zFrame.src="javascript:'<body></body>'"; // initialise body
  zFrame.document.write(zStuff.html); // or zFrame.contentDocument.write
  zFrame.document.close(); 
  // zFrame.document.body.innerHTML=zStuff.html; // also does not work

//  zFrame.src="javascript:'"+zStuff.html+"'"; // alternative method - either one works in Fx/Chrome
}

Спасибо за любые подсказки и за то, что не проголосовали за это. Я надеюсь, что SO сообщество будет полезно для меня, поскольку я был к нему в течение последних полутора лет ...


Обновление - так как код, который я разместил, имел некоторые остатки отчаяния, я изменил его на

if (!zFrame) { // did we already have one?
  zFrame = document.createElement("iframe");
  zFrame.id="zIframeId"; zFrame.name="zIframeName"; zFrame.frameBorder="0";
  zIFS = zFrame.style; zIFS.border="0"; zIFS.width="500px"; zIFS.height="500px"; zIFS.backgroundColor="white"; zIFS.display="block";
  zContainer.appendChild(zFrame); // append to div

  zFrame.src="javascript:'<body></body>'"; // initialise body

  zFrame.document.write(zStuff.html); // or zFrame.contentDocument.write
  zFrame.document.close(); 
}

вышеизложенное теперь заменяет страницу, на которой я нахожусь, кодом в zStuff.html вместо замены только содержимого iFrame - оно также сломалось в Fx

Теперь я должен сделать это в Fx, который IE тоже не возражает, но все равно заменяет окно, а не iFrame

if (!zFrame) {
  zFrame = document.createElement("iframe");
  zFrame.scrolling="no"; zFrame.id="zIframeId"; zFrame.name="zIframeName"; zFrame.frameBorder="0";
  zIFS = zFrame.style; zIFS.border="0px none"; zIFS.width="549px"; zIFS.height="510px"; zIFS.backgroundColor="white"; zIFS.display="block";
  zDRContainer.appendChild(zFrame);
  zFrame.src="javascript:'<body></body>'";
  setTimeout(function() {
    var zFrame = window.frames["zIframeName"]; // this is needed for the document.write
    zFrame.document.write(zStuff.html); 
    zFrame.document.close();
  },100); 
}

1 Ответ

3 голосов
/ 28 ноября 2011

Взлом, который я предложил в чате:

var a = setInterval( function(){

    try{
    zFrame.contentWindow.document.write(zStuff.html);
    zFrame.contentWindow.document.close();
    clearInterval(a);
    }
    catch(e){}

}, 10 );

Поскольку неизвестно, когда IE разрешает доступ к contentWindow свойствам, это будет продолжаться до тех пор, пока это не будет разрешено.

...