Maximaler Z-Index

Ortwin1st

Mitglied
Hi,

habe die Suchefunktion benutzt, aber bzgl. des o.g. Betreffs nichts gefunden (außer hier).

Den maximalen Z-Index von 2147483647 (2^31-1) hatte ich schon vor der Suche rausbekommen, hatte nur nach einer Bestätigung gesucht, ob das wirklich sein kann. Der o.g. Link bestätigt dies. Das Verhalten in den Mozilla-Browsern scheint mir zu gefallen, jedoch suche ich eine Lösung für den IE.

Zum Problem
Bei meinem Script (in dem der zIndex auch in Cookies gespeichert wird) kam es zu Darstellungsfehlern. Irgendwann wurde der Wert gänzlich ignoriert. Hat etwas gedauert, bis ich rausgefunden habe warum. Der zIndex in meiner Variablen hatte einen 11-stelligen Wert, beginnend mit 9 (!). Aber der Inhalt der Eigenschaft behielt bei allen Objekten immer nur '2147483647'.

Jetzt möchte ich ein Workaround dazu ausarbeiten, habe aber leider keine Idee wie.
Code:
    // Konstanten
    var zIndOver=Math.pow(2,31)-4; // max. zIndex für meine Objekte

   var divClass[0] = new CBlabla(); // Erzeugung eines Klassenobjekts

    if(divClass[0].zInd > zIndOver) 
    {
        // nicht richtig; hier muss Workaround stehen
        divClass[0].zInd = divClass[0].zInd * (-1); 
    }

    divObj.style.zIndex = divClass[0].zInd; // Zuweisung der Eigenschaft
Das ist nur ein Ausschnitt des Codes. Es gibt natürlich meherere Instanzen der Klasse, die alle einen eigenen zIndex haben. Die Reihenfolge soll daher im gültigen Bereich (-2147483648 bis 2147483647) erhalten bleiben.

Jemand eine Idee :)
 
Zuletzt bearbeitet:
Also nach dem ich viel, viel, viel Gehirnschmalz verbraten habe, bin ich zu einem Lösungsansatz gekommen. Der wird aber nicht mit einer Zeile erledigt sein. Leider. :( Vielleicht denke ich zu kompliziert und es gibt was viel einfacheres?

Ich kenne die Anzahl der Klasseninstanzen. Sagen wir ich hätte 500 Instanzen der o.g. Klasse Cblabla();
Nun würde ich ein Array erstellen, dass jeden zIndex der 500 Instanzen enthält. Dieses Array würde ich aufsteigend sortieren. (vielleicht gibt es schon eine vorgefertigte Funktion?) Nun kann ich die Position des Arraywertes als neuen zIndex missbrauchen, der 500 nicht übersteigen wird. Für die Zuordnung der Werte wäre vielleicht ein mehrdimensionales Array praktisch, indem ich neben dem zIndex auch die ID der Klasse speichern könnte, um die Zuordnung vereinfachen könnte (vielleicht auch beschleinigen?). Das verkompliziert aber die Sache nochmals.
Die andere Frage ist, in wie weit verlangsamt dieser Algorythmus das Script?

Praktisch gesehen wäre es unrealistisch, dass es mehr als 2^31 Instanzen der Klasse geben wird. Somit würde der zIndex immer im darstellbaren Bereich bleiben.

Die Umsetzung hört sich auch nach einem großen Stück Arbeit an. :-/
 
Wenn ich dich recht verstanden habe, wird es einfacher, als du dir vielleicht vorstellst.;)

Die Objekte sind ja schon alle in einem Array, und einen solchen kannst du über eine eigene Sortierfunktion bequem sortieren, z.B. nach dem Attribut zInd der darin enthaltenen Objekte.

Hier mal ein Beispiel, es werden darin 10 Objekte erstellt, mit den Attributen ID(fortlaufend) und zInd(zufällig).

Über die Sortier-Funktion werden sie dann ganz einfach innerhalb des Arrays sortiert, und auch zInd kann recht simpel neu zugewiesen werden:

Code:
<html>
<head>
<title>Test</title>

<style type="text/css">
<!--
*{font:normal 11px Monospace;}
h1{font-size:14px;font-weight:bold;background:#c1c1c1}
-->
</style>
</head>
<body>
<h1>Unsortiert:</h1>
<script type="text/javascript">
<!--

function print_o(o)
{
  document.write('<hr>');
  for(var k in o)
    {
      document.write(k+'=>'+o[k]+'<br>');
    }
}

function zSort(a,b)
{ 
  return a.zInd-b.zInd; 
}

function CBlabla(a,b)
{
  this.id='id#'+a;
  this.zInd=b
}


divClass=[];

for(i=0;i<10;++i)
  {
    divClass.push(new CBlabla(i,parseInt(Math.random()*10)));
    print_o(divClass[i]);
  }

//-->
</script>
<h1>Sortiert:</h1>
<script type="text/javascript">
<!--

divClass.sort(zSort);

for(i=0;i<10;++i)
  {
    print_o(divClass[i]);
  }

//-->
</script>
<h1>Sortiert mit neuem zInd:</h1>
<script type="text/javascript">
<!--

for(i=0;i<10;++i)
  {
    divClass[i].zInd=i;
    print_o(divClass[i]);
  }

//-->
</script>
</body>
</html>

Ich hoffe, das bringt dich weiter :)
 
hmm... danke. Gut zu wissen.

Leider ist es doch nicht ganz so einfach. Weil in wirklichkeit habe ich keinen Array für Klasseninstanzen benutzt, sondern verwende einen Hash, was die ganze Sache wiederrum verkompliziert. Ich spreche die Klasseninstanz also über divClass[divId] an. Diese Div-Id ist die tatsächliche Id des Div-Objekts, die aus Buchstaben und Zahlen besteht (z.B. id#1, id#2, id#9, id#35, id#n). Das ganze dient dazu, dass ich das Div schnell der dazugehörigen Klasseninstanz zuordnen kann. Diese eindeutige Div-Id kommt also 3x vor.
- Div-Objekt
- Hash-Wert
- Membervariable der Klasseninstanz (eigentlich überflüssig)

Dazu gibt es aber diese spezielle for-Schleife, oder? Sowas wie:
Code:
for (var i in divClass.items) 
{
...
}

Das ganze muss ich mir mal bei Gelegenheit durch den Kopf gehen lassen und integrieren, wenn ich dazu Zeit finde. Evtl. muss ich noch andere Änderungen vornehmen, da die Funktion schon steht und sich andere Abhängigkeiten ergeben könnten. Aber das ist jetzt auf jeden Fall schaffbar. Werde dann das Ergebnis hier posten.

EDIT:
Hab mir das mal näher angesehen. Gleich mal eine Frage:
Code:
divClass=[]; // Ist das eine neue Methode ein Array zu erzeugen?
Wenn ich ein Hash verwenden würde, würde die sort()-Funktion auch flach fallen, oder? Da müsste dann was eigenes her.

Bzgl. dem Thema Hash scheint SelfHTML etwas schwach bestückt zu sein... jedenfalls fehlt es mir schwer, eine Referenz zu finden, was für Methoden dafür verfügbar sind. Auch diese Referenz hier ist etwas schwach bestückt.
So wie es aussieht, werde ich den Sortieralgorhytmus selber schreiben müssen.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück