Я вижу странное поведение в IE, пытающемся вызвать функции на другой странице через function.apply ().
Вот простой тестовый пример:
test1.html:
<HTML>
<HEAD>
<script language="javascript" type="text/javascript">
var opened = null;
function applyNone() {
opened.testFunc.apply(opened);
}
function applyArgs() {
opened.testFunc.apply(opened, ["applied array"]);
}
function call() {
opened.testFunc("called directly");
}
function remoteApply() {
opened.testApply(["used remote apply"]);
}
function remoteApplyCopy() {
opened.testApplyCopy(["used remote apply copy"]);
}
function openPopup() {
opened = window.open("test2.html", "_blank");
}
</script>
</HEAD>
<BODY>
<a href="#" onclick="openPopup()">OPEN</a>
<hr>
<a href="#" onclick="applyNone()">applyNone</a>
<a href="#" onclick="applyArgs()">applyArgs</a>
<a href="#" onclick="call()">call</a>
<a href="#" onclick="remoteApply()">remoteApply</a>
<a href="#" onclick="remoteApplyCopy()">remoteApplyCopy</a>
</BODY>
</HTML>
test2.html:
<HTML>
<HEAD>
<script language="javascript" type="text/javascript">
function testApply(args) {
testFunc.apply(this, args);
}
function testApplyCopy(args) {
var a = [];
for(var i = 0; i < args.length; i++) {
a.push(args[i]);
}
testFunc.apply(this, a);
}
function testFunc() {
var s = "Got: ";
for(var i = 0; i < arguments.length; i++) {
s += arguments[i] + " ";
}
document.getElementById("output").innerHTML += s + "<BR>";
}
</script>
</HEAD>
<BODY>
Hi there
<div id="output"/>
</BODY>
</HTML>
В Firefox и Chrome все методы работают правильно.
В IE (проверено в 6, 7 и 8) все методы, кроме applyArgs () и remoteApply (), работают как положено.
applyArgs () выдает ошибку «Ожидается объект JScript» при попытке вызова apply (test1.html строка 11).
remoteApply () выдает ту же ошибку «Ожидается объект JScript» при попытке вызова apply (test2.html строка 5).
Проблема в том, что мне нужно использовать apply (). Я могу обойти эту проблему, используя что-то вроде механизма remoteApplyCopy (), но я пытаюсь избежать этого. Почему apply () не работает?