Home Page
  • March 19, 2024, 01:28:12 am *
  • Welcome, Guest
Please login or register.

Login with username, password and session length
Advanced search  

News:

Official site launch very soon, hurrah!


Author Topic: JavaScript problems when crossing windows Part 2  (Read 7887 times)

Dakusan

  • Programmer Person
  • Administrator
  • Hero Member
  • *****
  • Posts: 534
    • View Profile
    • Dakusan's Domain
JavaScript problems when crossing windows Part 2
« on: January 21, 2010, 11:29:43 am »


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>
Logged