mmofacts.com

Anker in dynamisch erzeugtem HTML anspringen

gepostet vor 17 Jahre, 5 Monate von Todi42
Hallo,
vielleicht weis jemand von euch Rat. Ich möchte den Inhalt eines DIVs durch eine via asynchronem HTTP geladene HTML-Seite austauschen und dann zu einem Anker auf der Seite navigieren. In etwas so:
var inhalt = ...;
$('DIV_name').innerHTML = inhalt;
window.location.hash = '#Anker';
Leider funktioniert dies weder im FF 1.5, NS 7.1 oder IE 7.0 zuverlässig. Verzögere ich die letzte Zuweisung über setTimeout() um 0 oder mehr Milisekunden, so fängt es langsam an, in dem einen oder anderen Browser zu funktionieren und bei einer Sekunde funktioniert es bei allen drei Browsern. Das kann aber nicht wirklich eine Lösung sein.
Kennt jemand von euch das Problem und evtl. auch einen workaround? Im Kleinen konnte ich das Problem übrigens nicht reproduzieren.
mfg Todi
gepostet vor 17 Jahre, 5 Monate von RaydenDD
Das hat bei mir schon in normalem HTML mit Bildern net funktioniert ... wenn die Bilder zu spät geladen wurden .. würd mich auch interessieren die Lösung
gepostet vor 17 Jahre, 5 Monate von knalli
Ich würde als Workaround mal das Element A dynamisch einfügen, also ungefähr so (ungetestet, schreibe so runter):

function fuegeAnkerHinzu(elem, ankername){
var a = document.createElement("a");
a.setAttribute("name", ankername);
elem.appendChild(a);
}
..
fuegeAnkerHinzu( $('meinelement'), 'Name');
edit: Nicht richtig gelesen.. mein Kaffee wirkt noch nicht!!
Kannst du das Springen nicht in die geladene Seite verlagern?
gepostet vor 17 Jahre, 5 Monate von Todi42
Original von knalli
Kannst du das Springen nicht in die geladene Seite verlagern?

Das Problem scheint nicht das Laden der Seite sondern das Rendern der Seite zu sein. Selbst wenn die Seite im selbst geschriebenen Cache liegt, tritt das Problem auf. Man müste irgend etwas finden, um das Ende des Renderns zuverlässig zu ermitteln. Von mir aus kann das dann auch mit 10Hz gepollt werden. Da hätte ich keine Skrupel.
gepostet vor 17 Jahre, 5 Monate von knalli
Gehört denn "innerHTML" überhaupt zum "Rendern", also ich meine.. wird der Inhalt überhaupt so dynamisch per DOM ansprechbar? Bei mir geistert da noch immer da was rum, Erfindung von MS, eigentlich kein Standard.. besser wäre da sicherlich, das ganze Teil echt dynamisch zu erzeugen?
Hm.. kann man denn nicht erst abfragen, ob "Anker" existiert? Darüber einen (periodischen) Timeout/Updater setzen.. Abbruchbedingung ist dann "Wurde gefunden" und Ausführung des Springens.
gepostet vor 17 Jahre, 5 Monate von Todi42
Original von knalli
Gehört denn "innerHTML" überhaupt zum "Rendern", also ich meine.. wird der Inhalt überhaupt so dynamisch per DOM ansprechbar? Bei mir geistert da noch immer da was rum, Erfindung von MS, eigentlich kein Standard.. besser wäre da sicherlich, das ganze Teil echt dynamisch zu erzeugen?

Bei der nächsten, großen Überarbeitung des Framworks, würde ich das sicher so machen. Jetzt ist es aber leider zu spät.
Original von knalliHm.. kann man denn nicht erst abfragen, ob "Anker" existiert? Darüber einen (periodischen) Timeout/Updater setzen.. Abbruchbedingung ist dann "Wurde gefunden" und Ausführung des Springens.

Danke, damit werde ich mal ein bischen herum probieren.
gepostet vor 17 Jahre, 5 Monate von Todi42
Original von knalliHm.. kann man denn nicht erst abfragen, ob "Anker" existiert? Darüber einen (periodischen) Timeout/Updater setzen.. Abbruchbedingung ist dann "Wurde gefunden" und Ausführung des Springens.

Das funktioniert ganz prima, zumindest im NS7.1 IE 7.0 und FF 1.5. Mein Safari mag interressiert das einen Sch.... Dr....
Danke, das ist für mich jetzt erstmal die provisorische Lösung ;-)
gepostet vor 17 Jahre, 5 Monate von KoMtuR
Original von Todi42
Hallo,
vielleicht weis jemand von euch Rat. Ich möchte den Inhalt eines DIVs durch eine via asynchronem HTTP geladene HTML-Seite austauschen und dann zu einem Anker auf der Seite navigieren. In etwas so:
var inhalt = ...;
$('DIV_name').innerHTML = inhalt;
window.location.hash = '#Anker';
Leider funktioniert dies weder im FF 1.5, NS 7.1 oder IE 7.0 zuverlässig. Verzögere ich die letzte Zuweisung über setTimeout() um 0 oder mehr Milisekunden, so fängt es langsam an, in dem einen oder anderen Browser zu funktionieren und bei einer Sekunde funktioniert es bei allen drei Browsern. Das kann aber nicht wirklich eine Lösung sein.
Kennt jemand von euch das Problem und evtl. auch einen workaround? Im Kleinen konnte ich das Problem übrigens nicht reproduzieren.
mfg Todi

Schonmal probiert ein Scripttag an die Variable inhalt anzufügen, welches halt dieses "window.location.hash..." beinhaltet? So dass dieses Script ausgeführt wird, wenn die Sachen in die Seite eingefügt wurden (rein theoretisch, habs nicht getestet)
gepostet vor 17 Jahre, 5 Monate von Todi42
Original von KoMtuR
Schonmal probiert ein Scripttag an die Variable inhalt anzufügen, welches halt dieses "window.location.hash..." beinhaltet? So dass dieses Script ausgeführt wird, wenn die Sachen in die Seite eingefügt wurden (rein theoretisch, habs nicht getestet)

Nö, jetzt hab ich ja ein funktionierendes Provisorium und nichts hält bekannter Weise länger als ein Provisorium ;-)
Ich wäre mir auch nicht sicher, ob JavaScript, das an innerHTML zugewiesen wird überhaupt ausgeführt wird. Aber trotzdem Danke für den Tip.
gepostet vor 17 Jahre, 5 Monate von KoMtuR
hmm stimmt mittels innerhtml wird das javascript nicht ausgeführt. schade eigentlich
gepostet vor 17 Jahre, 5 Monate von knalli
Auf wieviel haste denn den Timeout gesetzt? Und auch eine maximale Anzahl von Schleifendurchgängen? Ich denke da an sowas wie ein Verbindungsfehler, Seitenumbau..
gepostet vor 17 Jahre, 5 Monate von Todi42
Ein paar Zeilen Kode sagen mehr als tausend Worte:

_poll_anchor : function(anchor, count) {
count = count || 10;
var i = 0;
for ( ; i != document.anchors.length && '#' + document.anchors.name != anchor; ++i )
;

if ( i != document.anchors.length ) {
window.location.hash = anchor;
} else {
if ( count ) {
--count;
window.setTimeout(function(){
Menu._poll_anchor(anchor, count)
}, 100);
}
}
},

Auf diese Diskussion antworten