To continue the subject in my last post, these next cross-window bugs also derive from objects not being recognized properly when being passed between windows in JavaScript.
I needed the ability to dynamically run functions in the secondary window form the primary window where the parameters are taken from an array. Since a “function” from a secondary window is not seen as a function object from the primary window in IE, the apply member was not working.
I have included a fix for this below in the “RunFunctionInRemoteWindow” function, which is just a wrapper function in the second window that calls the apply function. This function manually copies the array through a for loop, instead of using slice, because in IE7 (but not IE8), the passed arrays were not seen as valid JSObjects, so the slice method (which is a standard method used for copying arrays by value) was not working.
LocalWindow.html [run this one]
<html><body>
<input type=button onclick="RunTest();" value='Click me when the second window has opened to run the test'>
<script type="text/javascript">
//Spawn the second window
var NewWindow=window.open('RemoteWindow.html');
//Run the test
function RunTest()
{
LocalAlertString('This is an alert generated from the local window');
NewWindow.RemoteAlertString('This is an alert generated from the remote window');
alert('The local window alert function is of type function: '+(LocalAlertString instanceof Function));
alert('The remote window alert function is of type function: '+(NewWindow.RemoteAlertString instanceof Function));
LocalAlertString.apply(window, ['This is an alert generated from the local window through the APPLY member']);
try {
NewWindow.RemoteAlertString.apply(NewWindow.window, ['This is an alert generated from the remote window through the APPLY member. This will not work in IE because the remote window\'s function is not actually a function.']);
} catch(e) { alert('The REMOTE APPLY failed: '+e.message); }
NewWindow.RunFunctionInRemoteWindow('RemoteAlertString', ['This is an alert generated from the remote window through the FIXED APPLY function.']);
}
//Generate an alert in the local window
function LocalAlertString(TheString)
{
alert('Local String: '+TheString);
}
</script></body></html>
RemoteWindow.html [do not run this one, it is opened as a popup from LocalWindow.html]
<html><body><script type="text/javascript">
//Generate an alert in the remote window
function RemoteAlertString(TheString)
{
alert('Remote String: '+TheString);
}
//Call functions in this window remotely through the "apply" member
function RunFunctionInRemoteWindow(FunctionName, Parameters)
{
//Manually copy the passed Parameters since "Parameters" may not be a valid JSObject anymore (this could be detected and array.slice used if it is still valid)
var ParametersCopy=[];
for(var i=0;i<Parameters.length;i++)
ParametersCopy[i]=Parameters[i];
window[FunctionName].apply(window, ParametersCopy);
}
</script></body></html>