При выполнении следующего примера с использованием Firefox 3:
<html>
<head>
<script language="javascript" type="text/javascript">
<!--
function openWindow(){
var w = window.open('', 'otherWin', 'width=600,height=600');
w.document.write(document.getElementsByTagName("html")[0].innerHTML);
w.document.close();
reportLinks(w.document.links);
}
function reportLinks(links){
var report = 'links: '+links.length;
for (var i=0;i<links.length;i++){
report += '\n (link='+links[i].href+')';
}
alert(report);
}
//-->
</script>
</head>
<body>
<p><a href="javascript: openWindow()">Open Same Content and Show Links Report</a></p>
<p><a href="javascript: reportLinks(document.links)">Show Links Report</a></p>
</body>
</html>
Вы увидите, что как количество ссылок, отображаемых при нажатии на «Показать отчет о ссылках», так и при нажатии «Открыть одинаковое содержимое и Показать отчет о ссылках» будет равно 2. Однако при наличии ссылки на внешний файл JavaScript с этой страницы поведение кажется другим (просто создайте пустой файл some.js, если хотите). При нажатии «Открыть одинаковое содержимое и Показать отчет о ссылках» количество ссылок будет равно 0.
<html>
<head>
<script language="javascript" type="text/javascript" src="some.js"></script>
<script language="javascript" type="text/javascript">
<!--
function openWindow(){
var w = window.open('', 'otherWin', 'width=600,height=600');
w.document.write(document.getElementsByTagName("html")[0].innerHTML);
w.document.close();
reportLinks(w.document.links);
}
function reportLinks(links){
var report = 'links: '+links.length;
for (var i=0;i<links.length;i++){
report += '\n (link='+links[i].href+')';
}
alert(report);
}
//-->
</script>
</head>
<body>
<p><a href="javascript: openWindow()">Open Same Content and Show Links Report</a></p>
<p><a href="javascript: reportLinks(document.links)">Show Links Report</a></p>
</body>
</html>
Вероятно, это вопрос загрузки страницы и того момента, когда reportLinks выполняется точно. Я предполагаю, что добавлен внешний файл some.js, чтобы документ не был полностью собран. Можно ли зарегистрировать этот вызов reportLinks для события onload, чтобы быть уверенным, что document.links завершен?
Кстати, пример отлично работает в обоих случаях с Google Chrome.
(добавлено после ответа1)
По предложению Марселя К. Я переписал пример, добавил код, так как я действительно хотел бы, чтобы дело пошло. А теперь тестируем его, и этот простой пример, похоже, работает с Firefox и с Chrome.
<html>
<head>
<script type="text/javascript" src="some.js"></script>
<script type="text/javascript">
<!--
function openWindow(){
var w = window.open('', 'otherWin', 'width=600,height=600');
w.document.write('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">\n<html>\n'+
document.getElementsByTagName("html")[0].innerHTML+'\n</html>');
w.onload=function(){
reportLinks(w.document.links);
};
w.document.close();
}
function reportLinks(links){
var report = 'links: '+links.length;
for (var i=0;i<links.length;i++){
report += '\n (link='+links[i].href+')';
}
alert(report);
}
//-->
</script>
</head>
<body>
<p><a href="javascript: openWindow()">Open Same Content and Show Links Report</a></p>
<p><a href="javascript: reportLinks(document.links)">Show Links Report</a></p>
</body>
</html>
Я надеялся на этом простом примере показать простой случай реального кода, который я пишу. Экран предварительного просмотра печати сложного HTML, в котором я хочу отключить все открытые ссылки после открытия. Но в этом случае обработчик загрузки никогда не вызывается ... Как я могу зарегистрировать обработчик загрузки в этом случае наиболее надежным способом?
Большое спасибо,
Marcel