bert: $(document).ready( --> $(document).onload(

Hi,

$(document).ready() feuert ja, bevor der content geladen wird. Gibt es auch eine Version, die erst danach feuert (z.B. $(document).onload() oÄ)?

Ich habe folgenden Scriptteil:

  
	$(document).ready(  
		function()  
		{  
			$('#dock<?php echo $newsrow["ID"]; ?>').Fisheye(  
				{  
					maxWidth: 16,  
					items: 'a',  
					itemsText: 'span',  
					container: '.dock-container2',  
					itemWidth: 13,  
					proximity: 35,  
					alignment : 'left',  
					valign: 'center',  
					halign : 'center'  
				}  
			)  
		}  
	);

Das gehört zu einem Script, welches ein Menü im MAC-Look darstellt.

Wenn ich nun mehrere News generiere, die untereinander dargestellt werden (jeweils mit einem Menü im MAC-Look), reagieren die Menüs teilweise auf eine falsche Mausposition.

Eigentlich sollten die Links, je näher die Maus, größer werden. Teilweise ist der sensitive Bereich allerdings vertikal verschoben (zu weit oben). Ich nehme an, dass hat damit zu tun, dass das Script zu früh geladen wird und dann nachträglich noch content "dazwischen" kommt.
Ich lasse mich natürlich auch gerne eines Besseren belehren.

Sollte es allerdings daran liegen, wie führe ich den Aufruf später durch?

Ich habe auch eine onload function, die diverse Scripte aufruft, allerdings kann ich das da nicht reinpacken, weil die ID ja dynamisch aufgerufen wird.

Danke für eure Hilfe!

  1. Hi!

    $(document).ready() feuert ja, bevor der content geladen wird.

    Wenn das die Dokumentation des von dir verwendeten Systems so sagt, dann wird da sicher so sein

    Gibt es auch eine Version, die erst danach feuert (z.B. $(document).onload() oÄ)?

    Auch das wird dir die Dokumentation erzählen.

    Falls du zufälligerweise jQuery meinst, dann heißen die Event-Handler alle gleich, nur ohne beginnendes on. Und ja, load/onload feuert, wenn alles geladen ist, inklusive eingebettete Dinge wie Bilder. ready feuert hingegen schon nachdem das DOM fertig ist.

    Ich nehme an, dass hat damit zu tun, dass das Script zu früh geladen wird und dann nachträglich noch content "dazwischen" kommt.

    Klingt zumindest plausibel. Was sagt dein Debugging-Versuch? Wannund wo sind Werte nicht so, wie du dir das vorgestellt hast?

    Sollte es allerdings daran liegen, wie führe ich den Aufruf später durch?

    Kommt darauf an, wann du den "content" nachlädst. Alles was davon abhängig ist, darf auch erst danach berechnet werden.

    Ich habe auch eine onload function, die diverse Scripte aufruft, allerdings kann ich das da nicht reinpacken, weil die ID ja dynamisch aufgerufen wird.

    "Dynamisch" ist ein Wort, das meist gar nichts erklärt. Ab wann oder unter welchen Umständen steht die ID zur Verfügung, wo und wie benötigst du sie aber?

    Lo!

    1. Falls du zufälligerweise jQuery meinst, dann heißen die Event-Handler alle gleich, nur ohne beginnendes on. Und ja, load/onload feuert, wenn alles geladen ist, inklusive eingebettete Dinge wie Bilder. ready feuert hingegen schon nachdem das DOM fertig ist.

      wenn ich das ready durch load ersetze funktioniert das menu nicht. also die funktion wird dann gar nicht aufgerufen..

      Sollte es allerdings daran liegen, wie führe ich den Aufruf später durch?

      Kommt darauf an, wann du den "content" nachlädst. Alles was davon abhängig ist, darf auch erst danach berechnet werden.

      Also es wird nichts mittels AJAX geladen, falls du das meinst.
      Es wird aus einer DB ausgelesen, welcher Content geladen werden soll (kann man online bearbeiten). Dieser wird dann geladen und eventuell werden news eingebettet, die aus der DB geladen werden.

      "Dynamisch" ist ein Wort, das meist gar nichts erklärt. Ab wann oder unter welchen Umständen steht die ID zur Verfügung, wo und wie benötigst du sie aber?

      Die ID steht zur Verfügung kurz bevor / wenn die oben gepostete Funktion aufgerufen wird. Wenn ich Sie vorher wüsste, könnte ich den aufruf ja statisch in meiner onload_misc() einbetten, die im body-tag per onload="" aufgerufen wird.

      1. Hi,

        Also es wird nichts mittels AJAX geladen, falls du das meinst.
        Es wird aus einer DB ausgelesen, welcher Content geladen werden soll (kann man online bearbeiten). Dieser wird dann geladen und eventuell werden news eingebettet, die aus der DB geladen werden.

        $(document).ready() feuert garantiert erst, nachdem dieser Inhalt vorliegt. Es wartet lediglich nicht auf das Laden eingebetteter Ressourcen wie z.B. Grafiken, was bei window.onload der Fall ist.

        Die ID steht zur Verfügung kurz bevor / wenn die oben gepostete Funktion aufgerufen wird. Wenn ich Sie vorher wüsste, könnte ich den aufruf ja statisch in meiner onload_misc() einbetten, die im body-tag per onload="" aufgerufen wird.

        Du solltest auf Event-Handler im HTML-Code verzichten.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
      2. Hi!

        wenn ich das ready durch load ersetze funktioniert das menu nicht. also die funktion wird dann gar nicht aufgerufen..

        Du hast auch keine Fehlermeldungen in der Konsole stehen? Du hast das geprüft, beispielsweise mit Firebug (Breakpoint setzen (gegebenenfalls mehrere), neu laden, schauen ob er dort bremst, ...)

        Sollte es allerdings daran liegen, wie führe ich den Aufruf später durch?
        Kommt darauf an, wann du den "content" nachlädst. Alles was davon abhängig ist, darf auch erst danach berechnet werden.
        Also es wird nichts mittels AJAX geladen, falls du das meinst.

        Man kann auch ohne AJAX "im DOM rumfummeln".

        Es wird aus einer DB ausgelesen, welcher Content geladen werden soll (kann man online bearbeiten). Dieser wird dann geladen und eventuell werden news eingebettet, die aus der DB geladen werden.

        Du hast ein Client-Problem, also ist das was beim Client passiert ausschlaggebend. Bau dir zur Not eine statische Seite zum Testen.

        Die ID steht zur Verfügung kurz bevor / wenn die oben gepostete Funktion aufgerufen wird. Wenn ich Sie vorher wüsste, könnte ich den aufruf ja statisch in meiner onload_misc() einbetten, die im body-tag per onload="" aufgerufen wird.

        EVA-Prinzip auf der Serverseite! Erst Daten zusammentragen, dann die Ausgabe erstellen, dann weißt du alles was du benötigst und kannst die Reihenfolge so gestalten, wie sie der Client braucht.

        Lo!

        1. EVA-Prinzip auf der Serverseite! Erst Daten zusammentragen, dann die Ausgabe erstellen, dann weißt du alles was du benötigst und kannst die Reihenfolge so gestalten, wie sie der Client braucht.

          Der gesamte Code wird durch PHP gebuffert und am Ende per ob_end_flush() ausgegeben. Und wenn der Fehler (wie gesagt nur manchmal) auftritt, dann ist er nach erneutem laden (F5) stets verschwunden...

          Kann mir also echt nicht erklären, woran es liegen könnte..

          1. Der gesamte Code wird durch PHP gebuffert und am Ende per ob_end_flush() ausgegeben.

            Das ist hier absolut unrelevant.

            Kann mir also echt nicht erklären, woran es liegen könnte..

            Wenn du es nicht kannst, wie können es auch nicht, aber du kennst deinen Code, wir nichr

            Struppi.

  2. Hi,

    $(document).ready() feuert ja, bevor der content geladen wird. Gibt es auch eine Version, die erst danach feuert (z.B. $(document).onload() oÄ)?

    ja, window.onload. Und zwar sogar ganz ohne jQuery.

    Eigentlich sollten die Links, je näher die Maus, größer werden. Teilweise ist der sensitive Bereich allerdings vertikal verschoben (zu weit oben). Ich nehme an, dass hat damit zu tun, dass das Script zu früh geladen wird und dann nachträglich noch content "dazwischen" kommt.

    Wenn Du diesem Content frühzeitig Dimensionen vermittelst, passiert dies nicht.

    Ich habe auch eine onload function, die diverse Scripte aufruft, allerdings kann ich das da nicht reinpacken, weil die ID ja dynamisch aufgerufen wird.

    René Mariks Maulwurf würde jetzt eine entscheidende Frage einwerfen: Hmwa?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. ja, window.onload. Und zwar sogar ganz ohne jQuery.

      kann man nachträglich, also während die seite geladen wird, zusätzlich befehle an eine funktion anhängen?

      ich habe in meinem body-tag onload="onload_misc()" stehen. hinter der funktion verbergen sich verschieden aufrufe von funktionen/befehlen.

      kann ich im body-bereich irgendwie die onload_misc() funktion um weitere befehle erweitern?

      Wenn Du diesem Content frühzeitig Dimensionen vermittelst, passiert dies nicht.

      wie ich vermutet habe

      Ich habe auch eine onload function, die diverse Scripte aufruft, allerdings kann ich das da nicht reinpacken, weil die ID ja dynamisch aufgerufen wird.

      René Mariks Maulwurf würde jetzt eine entscheidende Frage einwerfen: Hmwa?

      Beste! ^^
      Also während die News, die aktuell angezeigt werden sollen, geladen werden und der output genereiert wird, wird auch die oben genannte funktion aufgerufen, die ja die ID der jeweiligen News enthält (ID ist auch erst ab da bekannt). Daher kann ich die Funktion nicht statisch in meine onload_misc() packen.

      1. Hi,

        deine Frage zeigt wieder mal sehr schön, warum man (m.E.) mit JS-Frameworks nicht herumspielen sollte, wenn nicht entsprechende Grundkenntnisse im Umgang mit „normalem” JavaScript bereits vorhanden sind.

        ja, window.onload. Und zwar sogar ganz ohne jQuery.

        kann man nachträglich, also während die seite geladen wird, zusätzlich befehle an eine funktion anhängen?

        Ja, bspw. mit einer Methode analog zu der hier beschriebenen: </archiv/2009/3/t184303/#m1221915>

        ich habe in meinem body-tag onload="onload_misc()" stehen.

        Warum?

        Wenn du schon ein Framework wie jQuery einsetzt - dann solltest du wenigstens die Möglichkeiten, die dieses zum Eventhandling bietet, konsequent einsetzen, und nicht so einen fürchterlichen Mischmasch betreiben.

        kann ich im body-bereich irgendwie die onload_misc() funktion um weitere befehle erweitern?

        Ersetze zunächst mal dein onload-Attribut im BODY durch einen „vernünftigen” load-Event nach jQuery.

        Weitere Funktionen zum gleichen Handler hinzufügen kannst du damit m.W. problemlos, in dem du das ganze mehrfach aufrufst.

        Ob dies allerdings „irgendwo” im Inhalt von BODY geschehen sollte, wäre die nächste Frage.
        Organisiere dein Script lieber so, dass du nicht überall SCRIPT-Elemente herumfliegen hast.

        Also während die News, die aktuell angezeigt werden sollen, geladen werden und der output genereiert wird,

        Du redest hier von der serverseitigen Generierung des HTML-Codes, oder?

        wird auch die oben genannte funktion aufgerufen, die ja die ID der jeweiligen News enthält (ID ist auch erst ab da bekannt). Daher kann ich die Funktion nicht statisch in meine onload_misc() packen.

        Lasse den Client das komplette Dokument laden, und bearbeite anschliessend die in Frage kommenden Elemente per JavaScript.

        Zum Zugriff auf diese musst du nicht zwangsläufig deren IDs verwenden.
        Wenn die gar nicht „bekannt” sind, bietet es sich vermutlich eher an, die Elemente über einen passenden Selektor auszuwählen.

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]