Установка события OnLoad для вновь открытого окна в IE6 - PullRequest
3 голосов
/ 29 октября 2008

Мне нужно установить атрибут onload для нового всплывающего окна. Следующий код работает для Firefox:

<a onclick="printwindow=window.open('www.google.com');printwindow.document.body.onload=self.print();return false;" href='www.google.com'>

Однако, когда я пытаюсь это сделать в IE, я получаю сообщение об ошибке - "printwindow.document.body null or notfined"

Цель состоит в том, чтобы открыть новое окно и вызвать диалоговое окно печати для этого окна после его открытия.

Есть какие-нибудь подсказки о том, как заставить это работать? Важно не использовать javascript где-либо еще на целевой странице, так как я не контролирую его. Все функции должны быть указаны в ссылке, которую я разместил выше.

Ответы [ 6 ]

4 голосов
/ 31 марта 2011

Хотя в более ранних ответах правильно указывалось, что новое окно должно быть из того же домена, они неправильно ответили, почему он получил ошибку «printwindow.document.body null или не определена». Это потому, что IE не возвращает никакого статуса из window.open (), что означает, что вы можете открыть страницу и попытаться получить к ней доступ ДО того, как будет доступна загрузка.

По этой причине вам нужно использовать что-то вроде setTimeout для проверки. Например:

printwindow = window.open('print.html');
var body;
function ieLoaded(){
    body = printwindow.document.getElementsByTagName("body");
    if(body[0]==null){
        // Page isn't ready yet!
        setTimeout(ieLoaded, 10);
    }else{
        // Here you can inject javascript if you like
        var n = printwindow.document.createElement("script");
        n.src = "injectableScript.js";
        body.appendChild(n);

        // Or you can just call your script as originally planned
        printwindow.print();
    }
}
ieLoaded();

Это дополнительно обсуждается здесь

1 голос
/ 29 октября 2008

Это невозможно, если обе страницы не находятся в одном домене. Ваш код не работает в FF, а печатает текущую страницу. Если страницы находятся в одном домене, вы должны написать:

printwindow=window.open('/mypage.html');
printwindow.onload = function() {
  printwindow.focus();
  printwindow.print();
}
0 голосов
/ 29 октября 2008

Последнее (по общему признанию, плохое) решение, которое работало для всех браузеров, заключалось в том, чтобы использовать setTimeout и вызывать print () таким образом вместо изменения атрибута onload:

<a onclick="self.printwindow=window.open('print.html');setTimeout('self.printwindow.print()',3000);return false;" href='print.html'>
0 голосов
/ 29 октября 2008

Проверьте наш jQuery. В частности, функция готовности документа.

http://docs.jquery.com/Tutorials:How_jQuery_Works#Launching_Code_on_Document_Ready

0 голосов
/ 29 октября 2008

onload - это свойство объектов окна, а не элементов тела, несмотря на то, что атрибут HTML может заставить вас поверить. Это ссылка:

printwindow.onload

Однако в этом контексте вы не можете передать ей строку JavaScript - вам нужно передать ей функцию. Итак, полный скрипт вроде бы будет выглядеть так

printwindow.onload=function(){self.print();}

Теперь, сложив все вместе

<a href="www.google.com" onclick="var printwindow=window.open(this.href,'printwindow');printwindow.onload=function(){self.print();};return false;" >try it</a>

ОДНАКО! Это не будет работать для вас по адресу "www.google.com". Модель безопасности браузера предотвращает доступ родительских окон к объектам окон дочерних окон, ЕСЛИ они оба не находятся при одном и том же доменном имени.

0 голосов
/ 29 октября 2008

Вы полагаетесь на "printwindow.document.body.onload = self.print ();" строка выполняется до того, как дочерний документ заканчивает загрузку. Я не думаю, что вы можете это гарантировать.

Вот идея: подготовьте HTML или страницу, в которой нет ничего, кроме страницы, которая вам нужна в iframe. Эта страница будет иметь body.onload = self.print ().

...