Je vois un comportement étrange dans IE essayant d'appeler des fonctions dans une autre page via function.apply().Pourquoi function.apply() ne fonctionne-t-il pas à travers les limites de document dans IE?
Voici un exemple simple de test:
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>
Dans Firefox et Chrome toutes les méthodes fonctionnent correctement.
Dans IE (testé dans 6, 7 et 8), tout sauf les méthodes applyArgs() et remoteApply() fonctionnent comme prévu. ApplyArgs() donne une erreur "objet JScript attendu" lorsqu'il tente d'appeler apply (test1.html ligne 11).
RemoteApply() renvoie la même erreur "objet JScript attendu" lors de l'appel de apply (test2.html ligne 5).
Le problème est, je dois être en mesure d'utiliser apply(). Je peux contourner le problème en faisant quelque chose comme le mécanisme remoteApplyCopy(), mais j'essaie d'éviter cela. Pourquoi ne s'applique pas() juste le travail?
Si vous finissez par copier le arguments dans un tableau, voici une méthode plus courte: 'var a = Array.prototype.slice.call (arguments, 0);' – Blixt
J'ai essayé d'utiliser slice en faisant args.slice(), mais j'ai eu la même erreur. J'ai aussi essayé de passer par Array.prototype – Herms
Aussi, je pense que je devrais faire ça dans le test2.html J'essaie d'éviter d'avoir du code supplémentaire sur la page cible tous (seulement les fonctions réelles étant appelées). – Herms