[Javascript] Mac IE oddities with rollover help pop-ups
McCoy, Thomas
TMccoy at city.newport-beach.ca.us
Fri Dec 20 10:36:53 CST 2002
Our new Web site incorporates boxes that pop up when you roll over a link
(to help people decide which link they want). It works good in most
browsers, except Mac IE 5... where the pop up spans the entire screen.
I throw myself upon the mercy of the JavaScript mailing list... I would
appreciate any help you all may offer. Thanks :)
Sincerely,
Thomas McCoy
(see it in action - mouse over a tab at:
http://www.city.newport-beach.ca.us/nbpl/ )
SCRIPT:
// to invoke:
//<SCRIPT LANGUAGE="JavaScript" SRC="/popup.js"
TYPE="text/javascript"></SCRIPT>
//<BODY onLoad="init()">
//<DIV ID=popupDiv STYLE="position:absolute; visibility:hidden;
z-index:1000"></DIV>
//<A HREF="URL" ONMOUSEOVER="popup('POPUP_CONTENTS')"
ONMOUSEOUT="popdn()">link</A>
pop_border = 1;
pop_pad_top = 3;
pop_pad_left = 4;
pop_bordercolor = "#003300";
pop_bgcolor = '#FFFFCC';
pop_font = "Arial,Verdana,,Helvetica,sans-serif";
pop_textsize = 2;
pop_fontsize = '7pt';
pop_textcolor = "#003300";
pop_offset_x = 12;
pop_offset_y = 10;
//--
var pop = null;
var initialized = false;
var pop_width = 200;
var mouse_x=0, mouse_y=0;
// Decide browser version
var ie4 = document.all && !document.getElementById;
var ie5 = document.all && document.getElementById;
var ns6 = !document.all && document.getElementById;
var ns4 = document.layers;
function init(){
// popup
if(ie4 || ie5 || ns4 || ns6){
// Make a popup object shortcut
if (ns4) pop = document.popupDiv;
if (ie4 || ie5) pop = popupDiv;
if (ns6) pop = document.getElementById("popupDiv");
// Capture mouse movement
if (ns4) document.captureEvents(Event.MOUSEMOVE);
document.onmousemove = mouseMoved;
} else {
popup = do_nothing;
popdn = do_nothing;
}
initialized = true;
}
// Show a popup
function popup(text,width,height) {
if (!initialized) return false;
pop_width = (width)? width:200;
pop_contentwidth = pop_width - (pop_border*2) - (pop_pad_left*2);
// Make layer content
if (typeof width != 'undefined') { var html_width = 'WIDTH='+width+' '; }
if (typeof height != 'undefined') { var html_height = 'HEIGHT='+height+' ';
}
else var html_height = '';
if (ie4 || ie5) { var layerhtml = "<DIV STYLE=\"background:"+pop_bgcolor+";
border:"+pop_border+"px solid "+pop_bordercolor+"; padding:"+pop_pad_top+"px
"+pop_pad_left+"px; font:"+pop_fontsize+" "+pop_font+";
color:"+pop_textcolor+"\">"+text+"</DIV>"; }
if (ns4) { var layerhtml = "<TABLE "+html_width+html_height+" BORDER=0
CELLPADDING="+pop_border+" CELLSPACING=0
BGCOLOR="+pop_bordercolor+"><TR><TD><TABLE WIDTH=\"100%\" "+html_height+"
BORDER=0 CELLPADDING="+pop_pad_left+" CELLSPACING=0
BGCOLOR="+pop_bgcolor+"><TR><TD><FONT FACE=\""+pop_font+"\"
COLOR=\""+pop_textcolor+"\"
SIZE=\""+pop_textsize+"\">"+text+"</FONT></TD></TR></TABLE></TD></TR></TABLE
>"; }
if (ns6) { var layerhtml = "<TABLE "+html_width+html_height+" CELLSPACING=0
STYLE=\"background:"+pop_bgcolor+"; border:"+pop_border+"px solid
"+pop_bordercolor+"\"><TR><TD STYLE=\"padding:"+pop_pad_top+"px
"+pop_pad_left+"px; font:"+pop_fontsize+"
"+pop_font+"\">"+text+"</TD></TR></TABLE>"; }
// Write layer
layerWrite(layerhtml);
// Position layer
setPopupPos(mouse_x, mouse_y);
// Show layer
show(pop);
return true;
}
// Show a news story as a popup
function news_popup (heading,text) {
if (!initialized) return false;
var layerhtml = "<TABLE WIDTH=240 BORDER=0 CELLPADDING=2 CELLSPACING=0
BGCOLOR="+pop_bordercolor+"><TR><TD><TABLE WIDTH=100% BORDER=0
CELLPADDING=10 CELLSPACING=0 BGCOLOR="+pop_bgcolor+"><TR><TD
VALIGN=top><FONT FACE=\""+pop_font+"\" COLOR=\""+pop_textcolor+"\"
SIZE=\""+pop_textsize+"\"><SPAN
CLASS=popup_heading><NOBR>"+heading+"</NOBR></SPAN><BR>"+text+"</FONT></TD><
/TR></TABLE></TD></TR></TABLE>";
// Write layer
layerWrite(layerhtml);
// Position layer
setPopupPos(mouse_x, mouse_y);
// Show layer
show(pop);
return true;
}
// Clears popups if appropriate
function popdn() {
if ( initialized && (ie4 || ie5 || ns4 || ns6) && (pop != null) ) {
hide(pop);
}
return true;
}
// Store mouse coordinates and move popup layer accordingly
function mouseMoved(e) {
if ( ns4 || ns6 ) {
mouse_x=e.pageX;
mouse_y=e.pageY;}
if (ie4) {
mouse_x=event.x;
mouse_y=event.y;}
if (ie5) {
mouse_x=event.x+self.document.body.scrollLeft;
mouse_y=event.y+self.document.body.scrollTop;}
setPopupPos(mouse_x, mouse_y);
}
// Determine popup position (relative to cursor)
function setPopupPos(mouse_x, mouse_y) {
if (!initialized) return false;
// Get window size
if (ie4 || ie5) { var win_width = self.document.body.clientWidth; var
win_height = self.document.body.clientHeight; }
if (ns4) { var win_width = self.innerWidth; var win_height =
self.innerHeight; }
if (ns6) { var win_width = self.outerWidth; var win_height =
self.outerHeight; }
// Get window scroll position
var win_scroll_x = (ie4 || ie5) ? self.document.body.scrollLeft :
self.pageXOffset;
var win_scroll_y = (ie4 || ie5) ? self.document.body.scrollTop :
self.pageYOffset;
// Get popup dimensions
var pop_width_current = (ie4 || ie5)? pop.clientWidth:pop.offsetWidth;
var pop_height_current = (ie4 || ie5)? pop.clientHeight:pop.offsetHeight;
//alert (mouse_x + ':' + mouse_y + "\n" + win_width + ':' + win_height +
"\n" + pop_width_current + ':' + pop_height_current + "\n" + pos_x + ':' +
pos_y );
var scrollbar_size = (ie4 || ie5)? 0:16;
// Set horizontal pos
var pos_x = mouse_x + win_scroll_x + pop_offset_x;
if (pos_x + pop_width_current > win_width + win_scroll_x - scrollbar_size)
pos_x = win_width + win_scroll_x - pop_width_current - scrollbar_size;
if (pos_x < win_scroll_x)
pos_x = win_scroll_x;
// Set vertical pos
var pos_y = mouse_y + pop_offset_y;
// stick to edge of window if would pass bottom edge
// if (pos_y + pop_height_current > win_height + win_scroll_y -
scrollbar_size)
// pos_y = win_height + win_scroll_y - pop_height_current - scrollbar_size;
// move above cursor if would pass bottom edge
if (pos_y + pop_height_current > win_height + win_scroll_y -
scrollbar_size)
pos_y = mouse_y - pop_height_current - pop_offset_y;
//self.status = "msx:" +mouse_x+ " msy:" +mouse_y+ " | posx:" +pos_x+ "
posy:" +pos_y+ " | scrx:" +win_scroll_x+ " scry:" +win_scroll_y+ " | offx:"
+pop_offset_x+ " offy:" +pop_offset_y+ " | cW:" + pop_width_current + " cH:"
+ pop_height_current;
// Move the layer
moveLayerTo(pop, pos_x, pos_y);
}
function moveLayerTo(obj,x,y) {
if (ns4) {
obj.left = x;
obj.top = y;
} else if (ie4 || ie5) {
obj.style.left = x;
obj.style.top = y;
} else if (ns6) {
obj.style.left = x + "px";
obj.style.top = y + "px";
}
}
// ==========================================
// Make an object visible
function show(obj) {
if (ns4) obj.visibility = "show";
else if (ie4 || ie5) obj.style.visibility = "visible";
else if (ns6) obj.style.visibility = "visible";
}
// Hides an object
function hide(obj) {
if (ns4) obj.visibility = "hide";
else if (ie4 || ie5) obj.style.visibility = "hidden";
else if (ns6) obj.style.visibility = "hidden";
}
// Writes to a layer
function layerWrite(txt) {
if (ns4) {
var lyr = self.document.popupDiv.document;
lyr.write(txt);
lyr.close();
} else if (ie4 || ie5) {
// pop.innerHTML = txt;
document.all.popupDiv.innerHTML=txt;
} else if (ns6) {
var range = self.document.createRange();
range.setStartBefore(pop);
domfrag = range.createContextualFragment(txt);
while (pop.hasChildNodes()) {
pop.removeChild(pop.lastChild);
}
pop.appendChild(domfrag);
}
}
function do_nothing() {
return 1;
}
More information about the Javascript
mailing list