By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
434,914 Members | 1,100 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 434,914 IT Pros & Developers. It's quick & easy.

Passing a Javascript window reference to the session

P: 3
I have a web page where a member can open up a chat window (child window) with another member.
- From there the member can also navigate to other web pages.
- From other pages in the site, they may also open up new chat windows with other members (just not the same one).
- Each chat page is opened with the member name as the window name.
- When I log off from the web page, I would like all the chat windows to automatically close.

I have tried to create an array to store the window references from the created chats but the problem is that once I navigate to a different page, the array is not persisted (as per the Javascript memory scope).

I have tried the solution offered in
http://bytes.com/groups/javascript/8...e-page-another
However, this only works in IE and only for 1 open chat window. Once I have multiple chat windows up, it fails to close any of them. It also does not work for firefox with even 1 window.

Ideally, I would like to save each window reference back to the server as a session variable (using AJAX). I would store each reference in a session variable array. However, as a first step, I don't seem able to get the value of the window reference from within Javascript itself. When I try to examine the value (which I understand is a reference), I get '[object Window]'.

for example:

Expand|Select|Wrap|Line Numbers
  1. var newWin = open('chat.html', 'user1', ...)
  2. alert(newWin); // gives me a value of '[object Window]'
  3.  
My Ajax related code is written in anticipation of this working (see below) but unfortunately, I am passing '[object Window]'

Expand|Select|Wrap|Line Numbers
  1. function trackOpen(newWin) {
  2.     http.open('GET', 'windowmgmt.php?a=' + newWin);
  3.     http.onreadystatechange = handleResponse;
  4.     http.send(null);
  5.  
  6. }
  7.  

Does anyone know if this reference can be examined and I can get the value of this reference? I'm not even sure if my approach is even possible or if there is a better approach, so I am grateful for any advice.

Thanks.
Jan 22 '09 #1
Share this Question
Share on Google+
5 Replies


acoder
Expert Mod 15k+
P: 16,027
If you see [object Window] then you have a reference which you can close with the close() method.

For subsequent windows, keep unique references, so that the first one is not overridden. Are all new windows opened from the first main parent web page, or could they be opened from the child windows?
Jan 23 '09 #2

P: 3
Hi acoder,

All new chat windows are always opened from the first main parent web page. You are not able to open a chat window from another.

The problem is that I have to save this [object Window] reference to the session and keep the array of open windows in the session and when the user logs off make this available to the javascript.

I will give this a try assuming that the [object Window] when passed to the session can actually be passed back and used to close the window.

Thanks for your time to read and reply.
Jan 23 '09 #3

acoder
Expert Mod 15k+
P: 16,027
No, it won't quite work like that.

When you create a new window:
Expand|Select|Wrap|Line Numbers
  1. var win = window.open(...);
win is a reference to the window. You can now close this window:
Expand|Select|Wrap|Line Numbers
  1. win.close();
If you move from this page, you would lose these references.

One possibility is to avoid pop-up windows and use chat pseudo-windows within the page using DHTML. The other possibility is to update the parent window with references to the child windows from the child windows by checking that the variable is set using window.opener.win. If not set, reset it to 'this'. I've not tested this, but it should work.
Jan 26 '09 #4

P: 3
Hi acoder,

Thank you for your suggestion. I tried the second suggestion and this seemed to work very well. The only other thing I had to do was to keep sending the child reference to the parent (since everytime I navigate to another page on parent browser, the reference is lost again). I placed the window reference assignment as per the following:

Expand|Select|Wrap|Line Numbers
  1. function saveHandle()
  2. {
  3.     if (!window.opener.win) {
  4.         window.opener.win = this; 
  5.     }
  6.     setTimeout("saveHandle()",1000);
  7. }
  8.  
To close the window, I simply needed the following function:
Expand|Select|Wrap|Line Numbers
  1. function closeIMWindows() {
  2.     window.win.close();
  3. }
  4.  
However, is it possible for window.opener.win to be an array? since I have to keep track of multiple child windows?

I modified the previous code to:
Expand|Select|Wrap|Line Numbers
  1. function saveHandle()
  2. {
  3.     var found = false; 
  4.     var openWindows = window.opener.win.length;
  5.  
  6.     for(r=0;r<openWindows;r++) {
  7.  
  8.             if (this == window.opener.win[r])
  9.             {
  10.                 found = true;
  11.                 break;
  12.             } 
  13.     }
  14.  
  15.     if (found == false){
  16.         window.opener.win[window.opener.win.length+1] = this;
  17.     }    
  18.  
  19.     setTimeout("saveHandle()",1000);
  20.  
  21. }
  22.  
The issue is that 'window.opener.win.length' does not seem to be recognized and I am not sure how to specify window.opener.win as an array. Can you provide any other suggestions?

Thanks for your help thus far.
Jan 26 '09 #5

acoder
Expert Mod 15k+
P: 16,027
win is just a variable name. It could be any valid variable name.

It needs to be an array, so when you create windows, add them to the array:
Expand|Select|Wrap|Line Numbers
  1. var win = []; // empty array
  2. win[0] = window.open(...);
In your code, you need to check for the existence of window.opener.win to avoid errors.
Jan 26 '09 #6

Post your reply

Sign in to post your reply or Sign up for a free account.