DHTML-Skript erzeugt 100% CPU-Auslastung im Mozilla
Utz
- javascript
0 Bürgle
Hallo zusammen,
ich habe kürzlich das von http://www.webreference.com/js/column13/ her bekannte Newsticker-Skript für Mozilla angepasst. Das Skript läuft, aber: auf meiner Testumgebung (alte Möhre mit NT 4 und Mozilla 1.0) erzeugt jeder Scroll-Vorgang 100% CPU-Last, was ich nicht wirklich schön finde (selbe alte Möhre und Original-Skript mit IE bzw. NS4: keine spürbare CPU-Last). Meine Frage ist: ist das halt einfach so dass bei solchen DHTML-Spielchen Mozilla _sehr_ verschwenderisch mit den Ressourcen umgeht? Oder hab ich in meinem Skript irgendwo einen Ressourcen-Fresser, den ich eliminieren könnte?
Hier eine kompl. Testseite inkl. as-is lauffähigem Skript (- ist nur für Mozilla gedacht, k.A. was das Teil mit IE anstellen würde -):
===================
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Mozi-DHTML-Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
var bannerWidth;
var bannerHeight;
var bannerLeft;
var bannerTop;
// Steuerdaten für Newsticker
var interval = 20;
var increment = 1;
var pause = 5000;
var bannerColor = "#ffffff";
var leftPadding = 0;
var topPadding = 0;
// Nachrichtentexte - auch HTML-Code möglich
var ar = new Array(
'Nachricht 1',
'Nachricht 2',
'Nachricht 3'
);
checkBanner = true;
// Abstand von links holen - aus der alten Forumsauslese (Gott hab sie selig :-)
function getLeft(l)
{
if (l.offsetParent) return (l.offsetLeft + getLeft(l.offsetParent));
else return (l.offsetLeft);
}
// Abstand von oben holen - aus der alten Forumsauslese (Gott hab sie selig :-)
function getTop(l)
{
if (l.offsetParent) return (l.offsetTop + getTop(l.offsetParent));
else return (l.offsetTop);
}
// Hole die Maße des Platzhalter-Bildes und Abstände von links und oben
function getHoldspace() {
bannerWidth = document.getElementById("holdspace").width;
bannerHeight = document.getElementById("holdspace").height;
bannerLeft = getLeft(document.getElementById("holdspace"));
bannerTop = getTop(document.getElementById("holdspace"));
}
// Visibility setzen
function showMessage(n, show) {
msgId = "message" + n;
whichMsg = document.getElementById(msgId);
whichEl = whichMsg.style;
whichEl.visibility = (show) ? "visible" : "hidden";
}
// Von Welcher Message zu welcher soll gescrollt werden?
function nextMessage() {
checkBanner = false;
var fromInd = current;
current = (fromInd == ar.length - 1) ? 0 : fromInd + 1;
scrollBanner(fromInd, current);
}
// Bewege die Divs nach oben - bei Erreichen des Zielpunktes wird die Bewegung
// abgebrochen (clearInterval())
function moveUp() {
fromEl.top = (parseInt(fromEl.top) - increment);
if (parseInt(toEl.top) - increment <= toElTarget) {
toEl.top = toElTarget;
clearInterval(intervalID);
fromEl.visibility = "hidden";
checkBanner = true;
timeoutID = setTimeout("nextMessage()", pause);
} else {
toEl.top = (parseInt(toEl.top) - increment);
}
}
// Definiere Ausgangs- und Zielpunkte, rufe mit setInterval() moveUp() auf -
// moveUp() enthält die Überprüfung für clearInterval()
function scrollBanner(from, to) {
fromElId = "message" + from;
fromEl = document.getElementById(fromElId).style;
toElId = "message" + to;
toEl = document.getElementById(toElId).style;
toEl.top = parseInt(fromEl.top) + bannerHeight;
toElTarget = parseInt(fromEl.top);
showMessage(to, true); // show the upcoming message
intervalID = setInterval("moveUp()", interval);
}
// Das Div mit den Nachrichten wird erzeugt und eingehängt -
// Ein Elterndiv ("banner") enthält Kind-Divs ("message" + i),
// die die eigentlichen Nachrichten enthalten
function makeLayer() {
var myDiv = document.createElement("div");
myDiv.setAttribute("id", "banner");
myDiv.setAttribute("style", "position:absolute;");
for (var i = ar.length - 1; i >= 0; i--) {
var myMsgId = "message" + i;
var myMsg = document.createElement("div");
myMsg.setAttribute("id", myMsgId);
myMsg.setAttribute("style", "position:absolute;");
myDiv.appendChild(myMsg);
}
document.getElementsByTagName("body")[0].appendChild(myDiv);
with (myDiv.style) {
width = bannerWidth;
height = bannerHeight;
left = bannerLeft;
top = bannerTop;
clip = "rect(0 " + bannerWidth + " " + bannerHeight + " 0)";
backgroundColor = bannerColor;
}
for (i = 0; i < ar.length; i++) {
theChildId = "message" + i;
theChild = document.getElementById(theChildId);
with (theChild.style) {
visibility = "hidden";
left = leftPadding;
top = topPadding;
width = bannerWidth - leftPadding;
backgroundColor = bannerColor;
}
}
}
// Fülle die Kind-Divs mit Nachrichtentexten
function fillBanner() {
var whichEl;
for (var i = 0; i < ar.length; i++) {
MsgId = "message" + i;
whichEl = document.getElementById(MsgId);
whichEl.innerHTML = ar[i];
}
}
// Starte den ganzen Krempel
function startBanner() {
getHoldspace();
makeLayer();
fillBanner();
showMessage(0, true);
current = 0;
timeoutID = setTimeout("nextMessage()", pause);
}
</script>
</head>
<body>
<p>....ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...</p>
<div align="center"><img src="image.jpg" width="310" height="129" border="0" name="holdspace" id="holdspace" alt=""></div>
<p>....ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...ganz viel Text ...</p>
<script type="text/javascript">
startBanner();
</script>
</body>
</html>
===================
Grüße,
Utz
Hi!
Meine Frage ist: ist das halt einfach so dass bei solchen DHTML-Spielchen Mozilla _sehr_ verschwenderisch mit den Ressourcen umgeht?
Ja, ich hab mal was gebastelt, was Du vergleichen kannst in Mozilla/NS7 und IE6, falls Du es noch nicht kennst:)
http://www.buergle.de/performance.htm
Grüße, Bürgle
http://www.benotung.de
Hi Bürgle,
Ja, ich hab mal was gebastelt, was Du vergleichen kannst in Mozilla/NS7 und IE6, falls Du es noch nicht kennst:)
Kannte ich tatsächlich noch nicht - bei mir geht da im Mozilla auch die CPU-Last auf 100% hoch. Mist, eigentlich hatte ich gehofft, das Problem läge bei _mir_, denn dann hätt ich was dran ändern können...
Grüße,
Utz
Hi!
denn dann hätt ich was dran ändern können...
Programmiertechnisch ist man ziemlich machtlos...da hilft nur eins: IE nehmen :)
Grüße, Bürgle
http://www.benotung.de
Hi,
Programmiertechnisch ist man ziemlich machtlos...da hilft nur eins: IE nehmen :)
Guter Vorschlag! D.h., Du und ich, wir setzen uns zusammen und schreiben ein Plug-In für den Mozi, mithilfe dessen man das IE-ActiveX-Control aus dem Mozilla heraus aufrufen kann? Der Mozi dient dann dazu, den IE anzuzeigen, und der macht dann den Rest!
SCNR,
Utz
Hi!
Guter Vorschlag! D.h., Du und ich, wir setzen uns zusammen und schreiben ein Plug-In für den Mozi, mithilfe dessen man das IE-ActiveX-Control aus dem Mozilla heraus aufrufen kann? Der Mozi dient dann dazu, den IE anzuzeigen, und der macht dann den Rest!
Genau! Und der wiederrum kann auch bösartige Scripte ausführen...was folgt daraus??
Mozilla kann die Festplatte löschen! :):):)
Also:lassen wir das und nehmen gleich den IE, essen weiterhin krebserregende Chips und Pommes mit fetter Mayo und saufen/rauchen, was das Zeug hält!;)
Grüße, Bürgle :)
http://www.benotung.de
Hi,
Mozilla kann die Festplatte löschen! :):):)
Das sollten wir als allererstes implementieren, denn es wird dieses Feature sein, dass der IE-User/die IE-Userin beim Umstieg als allererstes vermissen wird! Und: Gewohntes aufzugeben schadet ja dem Umstiegswillen...so nach etwa zehn Jahren können wir dann ein Alert einbauen in der Art:
"Hey, Ihre Festplatte wird gleich böswilligerweise formatiert werden. Theoretisch muss das ja nicht so sein, aber wer will schon liebgewonnene Schrulligkeiten missen? Und: so ganz von vorn anzufangen hat ja immer auch seine Vorteile! Also: Festplatte formatieren?
[ja] [ja, unbedingt] [ja, und bitte gleich noch alle Datenbackup-Möglichkeiten kaputt machen] [in Zukunft bitte ohne Vorwarnung formatieren]
Grüße,
Utz
Moin,
Guter Vorschlag! D.h., Du und ich, wir setzen uns zusammen und schreiben ein Plug-In für den Mozi, mithilfe dessen man das IE-ActiveX-Control aus dem Mozilla heraus aufrufen kann?
FYI, so ein Plugin gibt es bereits: http://groups.yahoo.com/group/esker-activex-plugin/.
--
Henryk Plötz
Grüße aus Berlin
Moin,
Ja, ich hab mal was gebastelt, was Du vergleichen kannst in Mozilla/NS7 und IE6, falls Du es noch nicht kennst:)
http://www.buergle.de/performance.htm
Hmm, im IE 5.5 hier geht der Prozessor auch auf Vollast und ich kann im Vergleich zum Mozilla keine deutlichen Geschwindigkeitsunterschiede sehen (im Mozilla hat es alle handvoll Sekunden mal kurz gestockt, das wird aber eher daran liegen, dass der Mozilla auf einem anderen Rechner als der X-Server lief).
--
Henryk Plötz
Grüße aus Berlin