Glest
Gebruiker
- Lid geworden
- 6 sep 2007
- Berichten
- 688
Hoi allemaal,
Ik ben nu (voor het eerst) bezig met een puur Ajax applicatie (geen php backend). SEO is niet belangrijk voor het geval iemand daar over wil beginnen. Alles werkt eigenlijk, maar ik vraag me af of het niet beter kan.
De standaard methode tegenwoordig om de back/forward knoppen van je browser te laten werken met een Ajax applicatie, is het updaten van location.hash. In de meeste browsers zorgt dit voor een item in de geschiedenis lijst. Om dan vervolgens je Ajax applicatie aan te passen kun je elke x milliseconden controleren of de location.hash is gewijzigd. Niet erg efficiënt.
Maar bij IE moet het anders. Als je de location.hash wijzigt komt er géén item in de geschiedenis en kun je dus ook de back / forward knoppen niet gebruiken. Om dit te verhelpen kun je een verborgen iframe gebruiken en daar steeds de src van wijzigen. Stel je wilt bijvoorbeeld "index.html#state=1" in de geschiedenis hebben, dan verander je de src van het iframe in "hidden.html?state=1". hidden.html kan dan vervolgens dit script uitvoeren:
Hierdoor heb je in principe een werkende workaround. De hash van het parent window wordt geupdate, die wordt gepolled en je content wordt geupdate.
Maar, als je nou deze iframe hack in alle browser toepast en het script wat uitbreid zou je het hele pollen van de location.hash in principe achterwege kunnen laten. Stel je hebt een functie in je hoofd applicatie die de location.hash opvraagt.
Dan kun je het script in de body/head van hidden.html uitbreiden naar dit:
Dan hoef je niet meer elke 100 milliseconden de hash te vergelijken. Maar het grote nadeel is dat bij elke status update er een nieuwe pagina geladen moet worden in het iframe. Iets wat nu alleen bij IE hoeft, en wie gebruikt IE nou.
Ik vraag me dus eigenlijk af wat jullie denken dat beter is. Elke 100 ms de location.hash opvragen en vergelijken of bij elke state verandering een pagina laden in een verborgen iframe? Het is een kleine pagina, maar met langzaam netwerk verkeer kan het toch lang duren.
/edit: En ik zie nu dat er dubbele items in de geschiedenis komen bij firefox. Logisch opzich, één keer voor de iframe reload en één keer voor de hash update. Maar negeer dat maar voorlopig, misschien dat ik daar nog iets op kan vinden.
Ik ben nu (voor het eerst) bezig met een puur Ajax applicatie (geen php backend). SEO is niet belangrijk voor het geval iemand daar over wil beginnen. Alles werkt eigenlijk, maar ik vraag me af of het niet beter kan.
De standaard methode tegenwoordig om de back/forward knoppen van je browser te laten werken met een Ajax applicatie, is het updaten van location.hash. In de meeste browsers zorgt dit voor een item in de geschiedenis lijst. Om dan vervolgens je Ajax applicatie aan te passen kun je elke x milliseconden controleren of de location.hash is gewijzigd. Niet erg efficiënt.
Maar bij IE moet het anders. Als je de location.hash wijzigt komt er géén item in de geschiedenis en kun je dus ook de back / forward knoppen niet gebruiken. Om dit te verhelpen kun je een verborgen iframe gebruiken en daar steeds de src van wijzigen. Stel je wilt bijvoorbeeld "index.html#state=1" in de geschiedenis hebben, dan verander je de src van het iframe in "hidden.html?state=1". hidden.html kan dan vervolgens dit script uitvoeren:
PHP:
if (parent)
{
var query = window.location.search;
var hash = query.replace(/[?&;]/g, "#");
parent.location.hash = hash;
}
Hierdoor heb je in principe een werkende workaround. De hash van het parent window wordt geupdate, die wordt gepolled en je content wordt geupdate.
Maar, als je nou deze iframe hack in alle browser toepast en het script wat uitbreid zou je het hele pollen van de location.hash in principe achterwege kunnen laten. Stel je hebt een functie in je hoofd applicatie die de location.hash opvraagt.
PHP:
function process_hash()
{
// get location.hash and update page
}
Dan kun je het script in de body/head van hidden.html uitbreiden naar dit:
PHP:
if (parent)
{
var query = window.location.search;
var hash = query.replace(/[?&;]/g, "#");
parent.location.hash = hash;
parent.process_hash();
}
Dan hoef je niet meer elke 100 milliseconden de hash te vergelijken. Maar het grote nadeel is dat bij elke status update er een nieuwe pagina geladen moet worden in het iframe. Iets wat nu alleen bij IE hoeft, en wie gebruikt IE nou.
Ik vraag me dus eigenlijk af wat jullie denken dat beter is. Elke 100 ms de location.hash opvragen en vergelijken of bij elke state verandering een pagina laden in een verborgen iframe? Het is een kleine pagina, maar met langzaam netwerk verkeer kan het toch lang duren.
/edit: En ik zie nu dat er dubbele items in de geschiedenis komen bij firefox. Logisch opzich, één keer voor de iframe reload en één keer voor de hash update. Maar negeer dat maar voorlopig, misschien dat ik daar nog iets op kan vinden.
Laatst bewerkt: