Windows and Frames - California State University San Marcos

advertisement
Windows and Frames
Sahar Mosleh
California State University San Marcos
Page
1
Frames and the window Object
• Frames are a way of splitting up the browser window into various
panes, into which we can then load different HTML documents. The
frames are defined in a frameset-defining page by the <frameset>
and <frame> tags. The <frameset> tag is used to contain the
<frame> tags and specifies how the frames should look on the page.
The <frame> tags are then used to specify each frame and to include
the required documents in the page.
• We saw in Chapter 5 that the window object represents the
browser’s frame onto your page or document. If you have a page
with no frames, there will be just one window object. However, if
you have more than one frame, there will be one window object for
each frame. Except for the very top-level window of a frameset,
each window object is contained inside another.
• The easiest way to demonstrate this is through an example in which
we create three frames, a top frame with two frames inside it.
Sahar Mosleh
California State University San Marcos
Page
2
• For this multi-frame example, we’ll need to create three HTML
files. The first is the frameset-defining page.
• Save this as TopWindow.htm. Note that the src attributes for the two
<frame> tags in this page are Upperwindow. htm and
Lowerwindow. htm. We will create these next.
Sahar Mosleh
California State University San Marcos
Page
3
• This page is the source page for the top frame with the name
upperwindow and needs to be saved as Upperwindow. htm. The
final page is very similar to this:
Sahar Mosleh
California State University San Marcos
Page
4
• This is the source page for the lower frame; save it as
Lowerwindow. htm.
• These three pages fit together so that upperwindow. htm and
Lowerwindow. htm are contained within the Topwindow . htm page.
Sahar Mosleh
California State University San Marcos
Page
5
• When loaded into the browser, we have three window objects. One
is the parent window object and contains the file Topwindow . htm,
and two are child window objects, containing the files upperwindow.
htm and Lowerwindow. htm. The two child window objects are
contained within the parent window, as shown
Sahar Mosleh
California State University San Marcos
Page
6
• if any of the frames had frames contained inside them, these would
have window objects that were children of the window object of that
frame.When you load Topwindow htm into your browser, you’ll see
a series of four message boxes as shown below.
Sahar Mosleh
California State University San Marcos
Page
7
How It Works
• Let’s look at the frameset-defining page, starting with Topwindow
htm as shown in the following:
• The frameset is defined using the <frameset> tag. We use two
attributes: rows and ID. The rows attribute takes the value 50%, *!!
meaning that the first frame should take up half of the length of the
window, and the second frame should take up the rest of the room.
The ID attribute is used to give a name that we can use to reference
the page.
• The two child windows are created using <frame> tags. In each of
the <frame> tags, we specify a name by which the window objects
will be known and the src attribute of the page that will be loaded
into the newly created windows and will form the basis of the
document object that each window object contains.
Sahar Mosleh
California State University San Marcos
Page
8
• Let’s take a look at the upperwindow. htm file next. In the <body>
tag of the page, we attach a function windowon1oad() to the window
object’s onload event handler This event handler is called when the
browser has finished loading the window, the document inside the
window, and all the objects within the document. It’s a very useful
place to put initialization code or code that needs to change things
once the page has loaded but before control passes back to the user
• This function is defined in a script block in the head of the page as
follows:
Sahar Mosleh
California State University San Marcos
Page
9
• The window_onload function makes use of two properties of the
window object for the frame that the page is loaded in: its name and
parent properties. The name property is self-explanatory-—it’s the
name we defined in the frameset page. In this case, the name is
upperwindow.
• The second property, the parent property, is very useful. It gives you
access to the window object of the frame’s parent. This means you
can access all of the parent window object’s properties and methods.
Through these, you can access the document within the parent
window as well as any other frames defined by the parent. Here, we
display a message box giving details of the parent frame’s file name
or URL by using the href property of the location object (which
itself is a property of the window object).
• The code for Lowerwindow. htm is identical to the upperwindow.
htm, but with different results because we are accessing a different
window object. The name of the window object this time is
Lowerwindow. However, it shares the same parent window as
Upperwindow, and so when we access the parent property of the
window object we get a reference to the same window object as we
did in upperwindow. The message box demonstrates this by
displaying the file name/URL, or href property, and this matches the
file name of the page displayed in the Upperwindow frame.
Sahar Mosleh
California State University San Marcos
Page 10
• If you load the example in Internet Explorer and then load it into
Netscape browser, you may notice a very important difference and
one that highlights the often subtle ways that browsers are
incompatible.
• In IE, the message boxes for the Lowerwindow object may appear
first, meaning that the onload event handler of that window has fired
before the onload event handler of the Upperwindow.
• However, in Netscape, it’s usually the other way around; the
upperwindow object’s onload event handler fires first and then the
Lowerwindow object’s event handler fires.
• This may not be important here, but there will be times when the
order in which events fire is important and affects the working of
your code. It’s an incompatibility that’s worth noting and watching
out for in your own programs. Note that it would be very risky
relying on Netscape loading in one order and IE the other—it can
vary, and often for no apparent reason.
Sahar Mosleh
California State University San Marcos
Page 11
Coding between Frames
• We’ve seen that each frame exists as a different window and gets its
own window object. in addition, we saw that we can access the
window object of a frameset-defining page from any of the frame
pages it specifies, by using the window object’s parent property.
• Once we have a reference to the parent window’s window object, we
can access its properties and methods in the same way we access the
window object of the current page. in addition, we have access to all
the JavaScript variables and functions defined in that page.
Sahar Mosleh
California State University San Marcos
Page 12
Sahar Mosleh
California State University San Marcos
Page 13
• Notice that the two frames have the src attributes initialized as
page_a htm and page_b htm. However, we also need to create
page_c htm and page_d htm since we will be allowing the user to
choose the page loaded into each frame from these four pages. We’ll
create the page_a htm page first, as shown in the following:
Sahar Mosleh
California State University San Marcos
Page 14
Sahar Mosleh
California State University San Marcos
Page 15
• The other three pages are identical to page_a htm, except for one
line, so you can just cut and paste the text from page_a htm. Change
the HTML that displays the name of the page loaded to the
following:
• Then save this as page b htm.
• Do the same again, to create the third page (page C):
• Save this as page_c htm.
Sahar Mosleh
California State University San Marcos
Page 16
• The final page is again a copy of page_a htm except for the lines
• Save this as paged htm.
• Load FramesetPage htm into your browser and navigate to various
pages by clicking the links. Then click the List Pages Visited button
on Page A in the left-hand frame, and you should see a screen
similar to the
Sahar Mosleh
California State University San Marcos
Page 17
• Click the links in either frame to navigate the page to a new
location. For example, click the Page C link in the right frame, then
the Page D link in the left frame. Click the left frame’s List Pages
Visited button and you’ll see that page_c htm and page_d htm have
been added to the list.
• Normally when a new page is loaded, any variables and their values
in the previous page are lost, but with framesets it does not matter
which page is loaded into each frame—the top frame remains loaded
and its variables keep their values. What we are seeing in this
example is that, regardless of which page is loaded in each frame,
some global variable in the top frame is keeping track of the pages
that have been viewed and the top frame’s variables and functions
can be accessed by any page loaded into either the left or right
frames.
Sahar Mosleh
California State University San Marcos
Page 18
How It Works
• Let’s first look at the JavaScript in frameset_page htm, which is the
frameset-defining page. The head of the page contains a script block.
The first thing we do in this script block is to declare the variable
pagesVisited and set it to reference a new Array object. in the array,
we’ll be storing the file name of each page visited as the user
navigates the site.
• We then have two functions. The first of the two functions,
returnpagesvisited ( ) , does what its name suggests—it returns a
string containing a message and a list of each of the pages visited, it
does this by looping through the paqesvisited array, building up the
message string inside the variable returnvalue, which is then
returned to the calling function.
Sahar Mosleh
California State University San Marcos
Page 19
• The second function, addPage ( ), adds the name of a page to the
pagesvisited array.
Sahar Mosleh
California State University San Marcos
Page 20
• The fileName parameter passed to this function is the full file name
and path of the visited page, so we need to strip out the path to leave
us with just the file name. The format of the string will be something
like file: / / /JD: /myDirectory/page_b htm, and we need just the bit
after the last / characteL So in the first line of code, we find the
position of that character and add one to it because we want to start
at the next character.
• Then using the substr() method of the String object in the following
line, we extract everything from character position fileNameStart
right up to the end of the string. Remember that the substr() method
takes two parameters, namely the starting character we want and the
• length of the string we want to extract, but if the second parameter is
missing, all characters from the start position to the end are
extracted. We then add the file name into the array, the length
property of the array providing the next free index position.
Sahar Mosleh
California State University San Marcos
Page 21
• We’ll now turn to look collectively at the frame pages, namely
page_a . htm, page_b htm, page c htm, and page_d htm. In each of
these pages, we create a form called formi.
• This contains the textarea control that will display the list of pages
visited, and a button the user can click to populate the textarea.
• When one of these pages is loaded, its name is put into the
pagesvisited array defined in frameset page htm by connecting the
window object’s onload event handler to the addPage () function
that we also created in frarueset page htm. We connect the code to
the event handler in the <body> tag of the page as follows:
Sahar Mosleh
California State University San Marcos
Page 22
• Recall that all the functions we declare in a page are contained, like
everything else in a page, inside the window object for that page, but
because the window object is the global object, we don’t need to
prefix the name of our variables or functions with window.
• However, this time the function is not in the current page, but in the
frameset_page htm page. The window containing this page is the
parent window to the window containing the current page. We need,
therefore, to refer to the parent frame’s window object using the
window object’s parent property. The code window, parent gives us
a reference to the window object of framesetpage htm.
• With this reference, we can now access the variables and functions
contained in frameset_page htm. Having stated which window
object we are referencing, we just add the name of the function we
are calling, in this instance the addPage () function. We pass this
function the location. href string, which contains the full path and
file name of the page, as the value for its one parameter.
Sahar Mosleh
California State University San Marcos
Page 23
• As we saw earlier, the button on the page has its onclick event
handler connected to a function called butShowVisitectonclick () .
This is defined in the head of the page.
• in this function we call the parent window object’s
returnPagesVisited () function, which, as we saw earlier, returns a
string containing a list of pages visited. The value property of the
textarea object is set to this text.
• That completes our look at the code in the frame pages, and as you
can see, there’s not much of it because we have placed all the
general functions in the frameset page. Not only does this code reuse
make for less typing, but it also means that all your functions are in
one place. if there is a bug in a function, fixing the bug for one page
also fixes it for all pages that use the function.
Sahar Mosleh
California State University San Marcos
Page 24
• We’ve just seen how a child window can access its parent window’s
variables and functions, but how can frames inside a frameset access
each other? We saw a simple example earlier in this chapter, so this
time let’s look at a much more complex example.
Sahar Mosleh
California State University San Marcos
Page 25
• The easiest way to think of the hierarchy of such a frames-based
web page is similar to how you would think of family relationships,
which can be shown in a family tree diagram. if we represent our
frameset like that, it looks something like.
Sahar Mosleh
California State University San Marcos
Page 26
• From the diagram we can see that fraBottorn, the right-hand frame’s
bottom frame, has a parent frame called fraMain, which itself has a
parent, the top window. Therefore, if we wanted to access a function
in the top window from the frasottorn window, we would need to
access fraBottorn’s parent’s parent’s window object. We know that
the window object has the parent property, which is a reference to
the parent window of that window object. So, let’s use that and
create the code to access a function, for example, called myFunction
( ), in the top window.
• Let’s break this down. First
• Gets us a reference to the parent window object of the window in
which the code is running. The code is in fraBottorn, so window,
parent will be fraMain. However, we want the top window, which is
fraMain’s parent, so we add to the preceding code
Sahar Mosleh
California State University San Marcos
Page 27
• Now we have a reference to the top window. Finally, we call
myFunction () by adding that to the end of the expression.
• What if we wanted to access the window object of fraMenu from
code in fraBottom? Well, we have most of the code we need already.
We saw that window, parent. parent gives us the top window, so now
we just want that window’s child window object called fraMenu. We
can do this in three ways, all with identical results.
• We can use its index in the frames[] array property of the window
object as follows:
Sahar Mosleh
California State University San Marcos
Page 28
• Alternatively, we can use its name in the frames [] array like this:
• Finally, we can reference it directly by using its name as we can
with any window object.
• The third method is the easiest unless you have a situation where
you don’t know the name of a frame and need to access it by its
index value in the frames[] array, or perhaps where you are looping
through each child frame in turn.
Sahar Mosleh
California State University San Marcos
Page 29
• Since window, parent .parent fraMenu gets us a reference to the
window object associated with fraMenu, to access a function
myFunction () or variable rnyvariable, we would just type
• or
• What if we want to access not a function or variable in a page within
a frame, but a control on a form or even the links on that page? Well,
let’s imagine we want to access a control named rnycontrol, on a
form called myForm in the fraMenu page from the fraBottom page.
• Basically, it’s the same as how we access a form from the inside of
the same page as the script, except that we need to reference not the
window object of that page but the window object of fraMenu, the
page we’re interested in.
Sahar Mosleh
California State University San Marcos
Page 30
• Normally, we write document myForm mycontrol .value, with
window being assumed since it is the global object. Strictly
speaking, it’s window, document myForm mycontrol value.Now that
we’re accessing another window, we just reference the window we
want and then use the same code. So we need
• If we want to access the value property of mycontrol from
fraBottom. As you can see, references to other frames can get pretty
long, and in this situation it’s a very good idea to store the reference
in a variable. For example, if we are accessing myForm a number of
times, we could write
• So that now we can write
• Rather than
Sahar Mosleh
California State University San Marcos
Page 31
The top Property
• Using the parent property can get a little tedious when you want to
access the very top window from a frame quite low down in the
hierarchy of frames and window objects. An alternative is the
window object’s top property. This returns a reference to the
window object of the very top window in a frame hierarchy. In our
example, this is top window. For instance, in the example we just
saw
• could be written as
• Although, because the window is a global object, we could shorten
that to just
• So when should you use top rather than parent, or vice versa?
Both properties have advantages and disadvantages. The parent
property allows you to specify window objects relative to the current
window. The window above this window is window, parent, its
parent is window .parent .parent, and so on. The top property is
much more generic; top is always the very top window regardless of
the frameset layout being used.
Sahar Mosleh
California State University San Marcos
Page 32
• There will always be a top, but there’s not necessarily going to
always be a parent .parent. if you put all your global functions and
variables that you want accessible from any page in the frameset in
the very top window, window, top will always be valid regardless of
changes to framesets beneath it, whereas using the parent property is
dependent on the frameset structure above it. However, if someone
else loads your website inside a frameset page of their own, then
suddenly the top window is not yours but theirs, and window, top is
no longer valid. You can’t win, or can you?
• One trick is to check to see whether the top window contains your
page; if not, reload the top page again and specify that your top page
is the one to be loaded. For example, check to see that the file name
of the top page actually matches the name you expect. The window.
top. location. href will give us the name and path—if they don’t
match what we want, use window, top. location, replace (
myPagename. htm”) to load the correct top page. However, as we’ll
see later, this will cause problems if someone else is loading our
page into a frameset she has created—this is where something called
the “same origin policy” applies. More on this later in the chapter.
Sahar Mosleh
California State University San Marcos
Page 33
Sahar Mosleh
California State University San Marcos
Page 34
• As you can see, we’ve reused a lot of the code from frameset_page
htm, so you can cut and paste the script block from there. Only the
different code lines are highlighted. Save this page as complex_f
rameset_page htm.
• Next, create the page that will be loaded into fraMenu, namely
menupage htm. And save it as menupage htm.
Sahar Mosleh
California State University San Marcos
Page 35
Sahar Mosleh
California State University San Marcos
Page 36
• The fraMain frame contains a page that is simply a frameset for the
fraTop and fraBottom pages.
• For the next four pages, we reuse the four pages, page_a. htm,
page_b. htm, page_c . htm, and page_d . htm, from the first
example. You’ll need to make a few changes, as shown in the
following code.Again, all the pages are identical except for the text
shown in the page, so only page a . htm is shown. Amend the rest in
a similar way.
Sahar Mosleh
California State University San Marcos
Page 37
Sahar Mosleh
California State University San Marcos
Page 38
How It Works
• We’ve already seen how the code in the complex frameset_page htm
defining the top window works, as it is very similar to our previous
example. However, we’ll just look quickly at the <frameset> tags
where, as you can see, the names of the windows are defined in the
names of the <frame> tags.
• Notice also that the co ls attribute of the <frame set> tag is set to
200, a”. This means that the first frame will occupy a column 200
pixels wide, and the other frame will occupy a column taking up the
remaining space.
• Let’s look in more detail at the fraMenu frame containing
menu_page htm. At the top of the page, we have our main script
block. This contains the function choosepage_onchange (), which is
connected to the onchange event handler of the select box lower
down on the page. The select box has options containing the various
page URLs.
Sahar Mosleh
California State University San Marcos
Page 39
• The function starts by defining two variables. One of these,
choosePage, is a shortcut reference to the choose Page select object
further down the page.
• The if. else statement then sets our variable windowobject to
reference the window object of whichever frame the user has chosen
in the radFrame radio button group.
Sahar Mosleh
California State University San Marcos
Page 40
• As we saw earlier, it’s just a matter of following through the
references, so window, parent gets us a reference to the parent
window object. In this case, window, top would have done the same
thing. Then window, parent . fraMain gets us a reference to the
window object of the fraMain frame. Finally, depending on which
frame we want to navigate in, we reference the fraTop or fraBottorn
window objects contained within fraMain, using window, parent .
fraMain. fraTop or window, parent. fraMain. fraBottorn.
• Now that we have a reference to the window object of the frame in
which we want to navigate, we can go ahead and change its location.
href property to the value of the selected drop-down list item,
causing the frame to load that page.
Sahar Mosleh
California State University San Marcos
Page 41
• As we saw before, main_page. htm is simply a frameset-defining
page for fraTop and fraBot torn. Let’s now look at the pages we’re
actually loading into fraTop and fraBot torn. Because they are all the
same, we’ll just look at page_a. htrn.Let’s start by looking at the top
script block. This contains two functions, butshowVisited_onclick 0
and setFrameAndPageControls ( ) . We saw the function
butshowVisited_onclick () in the previous example.
• However, because the frameset layout has changed, we do need to
change the code. Whereas previously the returnpagesvisited ()
function was in the parent window, it’s now moved to the top
window. As you can see, all we need to do is change the reference
from window, parent . returnPagesVisited () to window, top.
returnPagesVisited();.
• As it happens, in the previous example the parent window was also
the top window, so if we had written our code in this way in the first
place, there would have been no need for changes here. It’s often
quite a good idea to keep all your general functions in the top
frameset page. That way all your references can be window, top,
even if the frameset layout is later changed.
Sahar Mosleh
California State University San Marcos
Page 42
• The new function in this page is setFrarneAndPageControls ( ) ,
which is connected to the onclick event handler of the links defined
lower down on the page.
• This function’s purpose is to make sure that if the user navigates to a
different page using the links rather than the controls in the fraMenu
window, those controls will be updated to reflect what the user has
done.
• The first thing we do is set the formobject variable to reference the
form1 in the fraMenu page as follows:
Sahar Mosleh
California State University San Marcos
Page 43
• Let’s break this down.
• window, parent
• gets us a reference to fraMain’s window object. Moving up the
hierarchy, we use
• window .parent, parent
• to get a reference to the window object of the top window. Yes,
you’re right. We could have used window. top instead, and this
would have been a better way to do it. I’m doing it the long way
here just to demonstrate how the hierarchy works.
Sahar Mosleh
California State University San Marcos
Page 44
• Now we move down the hierarchy, but on the other side of our tree
diagram, to reference the fraMenu’s window object.
• window parent. parent fraMenu
• Finally, we are only interested in the form and its controls, so we
reference that object like this:
• window parent. parent fraMenu document forml
• Now that we have a reference to the form, we can use it just as we
would if this were code in fraMenu itself.
Sahar Mosleh
California State University San Marcos
Page 45
• The function’s parameter linklndex tells us which of the four links
was clicked, and we use this value in the next line of the function’s
code to set which of the options is selected in the drop-down list box
on fraMenu’s form.
• The if. . else statement is where we set the fraMenu’s radio button
group radFrame to the frame the user just clicked on, but how can
we tell which frame this is?
Sahar Mosleh
California State University San Marcos
Page 46
• We check to see whether the current window object is the same as
the window object for fraTop. We do this using the self property of
the window object, which returns a reference to the current window
object, and window, parent fraTop, which returns a reference to
fraTop’s window object. if one is equal to the other, we know that
they are the same thing and that the current window is fraTop. if
that’s the case, the radFrarne radio group in the fraMenu frame has
its first radio button checked. Otherwise, we check the other radio
button for fraBottorn.
• The last thing we do in the function is return true. Remember that
this function is connected to an A object, so returning false cancels
the link’s action, and true allows it to continue, which is what we
want.
return true;
Sahar Mosleh
California State University San Marcos
Page 47
Opening Up a New Browser Window
• The window object has an open () method, which opens up a new
window, it takes three parameters, although the third is optional, and
it returns a reference to the window object of the new browser
window.
• The first parameter of the open () method is the URL of the page
that you want to be opened in the new window. However, if you
wish, you can pass an empty string for this parameter and get a
blank page, then use the docurnent.write() method to insert HTML
into the new window dynamically. We will give an example of this
later.
• The second parameter is the name we want to allocate to the new
window. This is not the name we use for scripting, but instead is
used for the target attribute of things such as hyperlinks and forms.
For example, if we set this parameter to mywindow and set a
hyperlink on the original page to
Sahar Mosleh
California State University San Marcos
Page 48
• then clicking that hyperlink will cause the hyperlink to act on the
new window opened. This means that test3.htm will be loaded into
the new window and not the current window. The same applies to
the <form> tag’s target attribute, which we’ll be looking at in the
chapters on server-side JavaScript. in this case, if a form is
submitted from the original window, the response from the server
can be made to appear in the new window.
• When a new window is opened, it is opened (by default) with a
certain set of properties, such as width and height, and with the
normal browser window features. Browser window features include
things such as a location entry field or a menu bar with navigation
buttons.
Sahar Mosleh
California State University San Marcos
Page 49
• The third parameter of the open() method can be used to specify
values for the height and width properties. Also, since by default
most of the browser window features are switched off, we can
switch them back on using the third parameter of the open ()
method. We’ll look at browser features in more detail shortly.
• Let’s first look at an example of the code we need to open a basic
window. We’ll name this window mywindow and give it a width and
height of 250 pixels. We want the new window to open with the
test2 htm page inside.
• You can see that test2 htm has been passed as the first parameter;
that is the URL of the page we want to open. We’ve named the
window mywindow in the second parameter. in the third parameter,
we’ve set the width and height properties to 250.
Sahar Mosleh
California State University San Marcos
Page 50
• You’ll also notice that we’ve set the variable newwindow to the
return value returned by the open() method, which is a reference to
the window object of the new window just opened. We can now use
newwindow to manipulate the new window and gain access to the
document contained inside it using the window, document property.
We can do everything with this reference that we did when dealing
with frames and their window objects. For example, if we wanted to
change the background color of the document contained inside the
new window, we would type
• How would we close the window we just opened? Easy, we just use
the window object’s close() method like this:
Sahar Mosleh
California State University San Marcos
Page 51
• Let’s look at the example we mentioned earlier of a products page
where clicking a product brings up a window with details of that
product. in a shameless plug, we’ll be using a couple of Wrox books
as examples, though, with just two products on our page, it’s not
exactly the world’s most extensive online catalog.
Sahar Mosleh
California State University San Marcos
Page 52
Sahar Mosleh
California State University San Marcos
Page 53
• Save this page as online_books htm. You’ll also need to create two
images and name them pro_asp. gif and beg_dreamweaver gif.
• Alternatively, you can find these files in the code download. Note
that if the user has disabled JavaScript, the window won’t be
opened. We can get around this by adding the page details to the href
attribute as follows:
<a href-”pro asp details.htm”
onclick=”return showDetails(this.href);”> <img ... ></a>
• We now need to create the two details pages, both plain HTML.
Sahar Mosleh
California State University San Marcos
Page 54
• Save this as pro asp_details .htm.
Sahar Mosleh
California State University San Marcos
Page 55
• Save the final page as beg_dreamweaver_details htm.
Sahar Mosleh
California State University San Marcos
Page 56
How It Works
• The files pro_asp_details htm and beg_dreamweaver _details . htm
are both plain HTML files, so we won’t look at them. However, in
online_books - htm we find some scripting action, which we will
look at here.
• in the script block at the top of the page, we first define a variable
detailswindow.
• We then have the function that actually opens the new windows.
Sahar Mosleh
California State University San Marcos
Page 57
• This function is connected to the onclick event handlers of the two
hyperlinks surrounding the book images that appear later in the
page. The parameter bookURL is passed by the code in the onclick
event handler and will be either beg_asp3_details.htm or
prof_js_details.htm.
• We create the new window with the window, open () method. We
pass the bookURL parameter as the URL to be opened. We pass
bookDetails as the name we want applied to the new window, if the
window already exists, another new window won’t be opened, and
the existing one will be navigated to the URL that we pass.
• This only occurs because we are using the same name (bookDetails)
when opening the window for each book. if we used a different
name, a new window would be opened.
Sahar Mosleh
California State University San Marcos
Page 58
• By storing the reference to the window object just created in the
variable detailswindow, we can access its methods and properties.
On the next line, you’ll see that we use the window object,
referenced by detailswindow, to set the focus to the new window
otherwise it will appear behind the existing window.
• Finally, we need to return false so that the normal action of the
hyperlink is canceled.
• Although it’s the user’s action of clicking the images that we’re
interested in, we need to wrap the images in a hyperlink tag and use
the onclick event associated with the A object because under
Netscape 4 img objects don’t have an onclick event handler You can
see this in the following code, where we create the images and
hyperlinks and connect the onclick event handlers to our function.
Although we are using the same function for each of the links’
onclick event handlers, we pass a different parameter, namely the
URL of the details page for that book.
Sahar Mosleh
California State University San Marcos
Page 59
Sahar Mosleh
California State University San Marcos
Page 60
Adding HTML to a New Window
• We mentioned earlier that we can pass an empty string as the first
parameter of the window object’s open () method and then write to
the page using HTML. Let’s see how we would do that.
• First, we need to open a blank window by passing an empty value to
the first parameter that specifies the file name to load.
• Now we can open the window’s document to receive our HTML.
• This is not essential when a new window is opened because the page
is blank, but with a document that already contains HTML, it has the
effect of clearing out all existing HTML and blanking the page,
making it ready for writing.
Sahar Mosleh
California State University San Marcos
Page 61
• Now we can write out any valid HTML using the document write ()
method.
• Each time we use the write () method, the text is added to what’s
already there until we use the document, close () method.
• If we then use the document.write () method again, the text passed
will replace existing HTML rather than adding to it.
Sahar Mosleh
California State University San Marcos
Page 62
Adding Features to Your Windows
• As we have seen, the window.open () method takes three
parameters, and it’s the third of these parameters that we’ll be
looking at in this section. Using this third parameter, you can control
things such as the size of the new window created, its start position
on the screen, whether the user can resize it, whether it has a toolbar,
and so on.
• Features such as menu bar, status bar, and toolbar can be switched
on or off using yes or 1 for on and no or 0 for off. To switch them
on, we can also just include their name without specifying a value.
• The list of possible options shown in the following table is not
complete, and not all of them work with both IE and NN browsers.
Sahar Mosleh
California State University San Marcos
Page 63
Sahar Mosleh
California State University San Marcos
Page 64
• As mentioned earlier, this third parameter is optional. If you don’t
include it, all the window features default to yes, except the
window’s size and position properties, which default to a set
position and size. For example, if you try this code:
Sahar Mosleh
California State University San Marcos
Page 65
Sahar Mosleh
California State University San Marcos
Page 66
• set to no by default. For example
• However, if you specify even one of the features, all the others
(except size and position properties) are
• produces a window with no features, as shown in Figure 7-11,
although we have defined its size this time. The larger window is the
original page, and the smaller one on top is the popup window.
Sahar Mosleh
California State University San Marcos
Page 67
• Let’s see another example. The following creates a 250-by-250-pixel
window, with a location and menu bar, and is resizable.
• A word of warning, however: Never include spaces inside the
features string; otherwise Netscape browsers will consider it invalid
and ignore your settings.
Sahar Mosleh
California State University San Marcos
Page 68
Scripting between Windows
• We’ve taken a brief look at how we can manipulate the new
window’s properties and methods, and access its document object
using the return value from the window, open () method. Now, we’re
going to look at how the newly opened window can access the
window that opened it and, just as with frames, how it can use
functions there.
• The key to accessing the window object of the window that opened
the current window is the window object’s opener property. This
returns a reference to the window object of the window that opened
the current window. So
• will change the background color of the opener window to red. We
can use the reference pretty much as we used the window, parent
and window, top properties when using frames.
Sahar Mosleh
California State University San Marcos
Page 69
Let’s look at an example where we open a new window and access a
form on the opener window from the new window:
Sahar Mosleh
California State University San Marcos
Page 70
Sahar Mosleh
California State University San Marcos
Page 71
• This is the code for our original window. Save it as openerwindow.
htm. Now we’ll look at the page that will be loaded by the opener
window.
Sahar Mosleh
California State University San Marcos
Page 72
• Open openerwindow. htm in your browser, and you’ll see a page
with the simple form shown in bellow
• Click the Open newwindow button, and you’ll see the window
original page.
Sahar Mosleh
California State University San Marcos
Page 73
• Type something into the text box of the new window. Then return to
the original opener window, click the Get Text button, and you’ll see
what you just typed into newwindow appear in the text box on the
opener window’s form.
• Change the text in the opener window’s text box and then return to
the newwindow and click the Get Text button. The text you typed
into the opener window’s text box will appear in newwindow’s text
box.
Sahar Mosleh
California State University San Marcos
Page 74
Moving and Resizing Windows
• Before we leave the subject of windows, let’s look at the methods
available to us for resizing and moving existing windows. Note that
Netscape 6/7 can be configured to not allow scripts to resize or
move existing windows.
• Once you have opened a window, you can change its position onscreen and its size using the window object’s resizeTo () and
moveTo() methods, both of which take two arguments in pixels.
• Let’s imagine, having just opened a new window, like this:
• that you want to make it 350 pixels wide by 200 pixels high and
move it to a position 100 pixels from the left of the screen and 400
pixels from the top. What code would you need?
Sahar Mosleh
California State University San Marcos
Page 75
• You can see that we can resize our window to 350 pixels wide by
200 pixels high using resizeTo (). Then we move it so it’s 100 pixels
from the left of the screen and 400 pixels from the top of the screen
using moveTo().The window object also has resizeBy () and
moveBy () methods. These each take two parameters, in pixels. For
example
• will increase the size of newwindow by 100 pixels horizontally and
200 pixels vertically. Similarly
• will move the newwindow by 20 pixels horizontally and 50 pixels
vertically. When using these methods, you must bear in mind that
users can manually resize these windows if they so wish. In
addition, the size of the client’s screen in pixels will vary between
users.
Sahar Mosleh
California State University San Marcos
Page 76
Security
• Browsers, such as Netscape Navigator and Internet Explorer, put
certain restrictions on what information scripts can access between
frames and windows.
• If all the pages in these frames and windows are based on the same
server, or on the same computer when you’re loading them into the
browser locally as we are, you have a reasonably free rein over what
your scripts can access and do.
• However, there are some restrictions. For example, if you try to use
the window, close () method in a script page loaded into a browser
window that the user opened, as opposed to a window opened by
your script, a message box will appear giving the user the option of
cancelling your close 0 method and keeping the window open.
Sahar Mosleh
California State University San Marcos
Page 77
• When a page in one window or frame hosted on one server tries to
access the properties of a window or frame that contains a page from
a different server, the “same origin policy” comes into play, and
you’ll find yourself very restricted as to what your scripts can do.
• Imagine you have a page hosted on a web server whose URL is http:
/ /www.myserver.com. Inside the page is the following script:
• Now we have two windows, one that is hosted at www.myserver.
com and another that is hosted on a different server, www.
anotherserver.com. Although this code does work, the same origin
policy prevents any access to the document object of one page from
another For example, the following code in the opener page
Sahar Mosleh
California State University San Marcos
Page 78
• will cause a security problem and will be prevented by the browser
Although you do have access to the window object of the page on
the other server, you only have access to a limited subset of its
properties and methods.
• The same origin restriction applies equally to frames as it does to
windows. The idea behind it is very sound: it is to prevent hackers
from putting your pages inside their own and extracting information
by using code inside their page. However, the restrictions are fairly
severe, perhaps too severe, and mean that you should avoid scripting
across frames or windows where the pages are hosted on different
servers.
• There is no easy way around the restrictions in Internet Explorer, but
Netscape Navigator browsers do support scripts that have been
digitally signed to validate their origin. These scripts suffer less
restriction than unsigned scripts, but it does mean that your pages
won’t be accessible from Internet Explorer Also, the certificate
required for signing is quite expensive.
Sahar Mosleh
California State University San Marcos
Page 79
Download