Friedel: Scriptproblem in Opera5

Ich habe eine Seite in einem Frameset. In dieser Seite soll ein Div neben dem Mauszeiger erscheinen. Leider gelingt mir das bisher nicht in allen Browsern. Beim IE geht es fogendermassen:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type=text/javascript>
<!--
var Xpos  = 0;
var Ypos  = 0;
var Xscroll  = 0;
var Yscroll  = 0;
var fensterbreite = 500;
var fensterhoehe = 400;

function init() {
Fensterbreite();
Fensterhoehe();
Mauspos();
}

function Mauspos(){
document.onmousemove = MouseMotionHandlerIE
}

function MouseMotionHandlerIE() {
savePos(window.event.x, window.event.y, document.body.scrollLeft, document.body.scrollTop);
moveBox(Number(Xpos)+Number(Xscroll), Number(Ypos) + Number(Yscroll));
}

function savePos(Xposnew, Yposnew, Xscrollnew, Yscrollnew) {
Xpos = Xposnew;
Ypos = Yposnew;
Xscroll = Xscrollnew;
Yscroll = Yscrollnew;
}

function moveBox(x, y) {
if (x-document.body.scrollLeft+296<=fensterbreite) {
 document.getElementById("ntcaw").style.left = x*1+16;
} else {
 if (x-document.body.scrollLeft>=296) {
  document.getElementById("ntcaw").style.left = x*1-296;
 } else {
  document.getElementById("ntcaw").style.left = document.body.scrollLeft;
 }
}
if (y-document.body.scrollTop+316<=fensterhoehe) {
 document.getElementById("ntcaw").style.top = y*1+16;
} else {
 if (y-document.body.scrollTop>=316) {
  document.getElementById("ntcaw").style.top = y*1-316;
 } else {
  document.getElementById("ntcaw").style.top = document.body.scrollTop;
 }
}
}

function Fensterbreite() {
if (window.innerWidth) {fensterbreite=window.innerWidth};
if (document.body && document.body.offsetWidth) {fensterbreite=document.body.offsetWidth};
}

function Fensterhoehe() {
if (window.innerHeight) {fensterhoehe=window.innerHeight;}
else if (document.body && document.body.offsetHeight) {fensterhoehe=document.body.offsetHeight;}
}

//-->
</script>
</head>

<body onLoad="init()" onResize="init()">
<div id="ntcaw" style="position:absolute;">...</div>
Rest der Seite
</body></html>

Das funkioniert auch in Opera6 und Opera7. Leider nicht in Opera5. Auch für Netscape ab Version 6 und Mozilla habe ich einen Weg gefunden. Nur für Opera5 weiß ich nicht, wie ich es machen kann. Das Problem ist, dass bei Opera5 die Methoden document.body.scrollLeft und document.body.scrollTop "undefined" zurück geben.

Wer weß Rat?

  1. Hi,

    also hier ein paar Dinge, was mir zu Opera 5 einfällt:

    1. style.top und left darf NUR Integerwerte enthalten (also nicht mit "px" hinten dran.)

    2. document.body.scrollLeft und scrollTop solltest du durch
    window.pageXOffset und pageYOffset ersetzen können. (auch für Netscape 4)

    3. style.width kann man nur durch style.pixelWidth (integer) setzen.

    4. offsetWidth gibts nicht, aber entspricht style.pixelWidth

    Das sind so ein paar Besonderheiten. Sicher gibts noch mehr.

    Gruß
    Christian

    PS: Du solltest das hier:
    style.left = x*1+16;
    durch
    style.left = x*1+16+"px";
    ersetzen.
    Teste mal das Skript unter Mozilla/Netscape6+, wenn du als Doctype ein XHTML Doc angibst. Dann sollte dein Skript aus obigem Grund nicht klappen!
    Aber für Opera 5 muss das "px" wieder weg!!!