[ Team LiB ] Previous Section Next Section

7.7 Reading a Frame's Dimensions

NN 6, IE 4(Win)/5(Mac)

7.7.1 Problem

You want to know the precise pixel dimensions of a frame after the frameset is rendered.

7.7.2 Solution

Because it is not uncommon to specify a percentage or * wildcard character for one or more frame size specifications, the actual rendered size is unknown until the browser completes all of its calculations for rendering. A script running in one of the frames can access the interior dimensions of any sibling frame (and its own frame) with the following function:

function getFrameSize(frameID) {
    var result = {height:0, width:0};
    if (document.getElementById) {
        var frame = parent.document.getElementById(frameID);
        if (frame.scrollWidth) {
            result.height = frame.scrollHeight;
            result.width = frame.scrollWidth;
        }
    }
    return result;
}

The function returns an object with height and width properties containing the rendered pixel measures of the frame whose ID is passed as a parameter. You get accurate readings in IE 4 or later for Windows and Netscape 7 or later. IE for Macintosh through Version 5.x provides accurate readings when the frame in question does not have scrollbars. When scrollbars are present, the returned sizes are reduced by the thickness of the scrollbars. Unfortunately, no property reveals whether a scrollbar is visible in the frame if the frame's scroll attribute defaults to the auto setting.

7.7.3 Discussion

The keys to making the function work include referencing the parent (or top) of the individual frames and the actual frame element as opposed to the frame-as-window object. Thus, the more common parent.frameName or parent.frames["frameName"] types of reference will not suffice. By referencing the frame element directly, you get the browser to report the rendered size of the element, irrespective of the content of the frame.

You can also install this function inside the frameset document's script. But you must then remove the reference to the parent in the fourth line of the function. Because the script already operates in the parent, its own element collection includes the frame elements. You can install this function in the frameset, yet still invoke it from one of the frames, as in:

var frameSize = parent.getFrameSize("myFrame4");

The parent window is part of the equation in one form or another.

7.7.4 See Also

Recipe 7.8 for resizing a frame under script control.

    [ Team LiB ] Previous Section Next Section