Règle d'action sur balise

Bonsoir les amis :hello:
Ouverture du topic à la demande de No-Name :icon_biggrin:

Je cherche comment je pourrais forcer toutes mes balises à agir en ajax dans un div donné, au lieu d’agir directement sur la page. Genre tous mes liens sans cible s’exécutent dans le div nommé dMain, et pour que les autres liens agissent “à l’extérieur”, je leur mettrai un target=“blank”

Pour l’instant, je devrais me palucher manuellement tous mes liens sous la forme :

<a href="#" onclick="new Ajax.Updater('dMain', '../mapage.php');">Lien</a>

Sauf que !
Ainsi, mes liens ne sont pas réels, et les moteurs de recherche ou autres liens directs ne fonctionneront pas…
Il me faudrait donc, quelque chose du genre, en automatique sur tous mes liens (sauf ceux avec target="_blank") :

<a href="mapage.php" onclick="new Ajax.Updater('dMain', this.href.value); return false;">Lien</a>

Une idée pour m’avancer un peu ? (Et oui, je ne suis pas le roi du JS !)

Par avance, merci :jap:

Tu utilises prototypes, donc pastebin.com…

à vrai dire, il ne se passe pas grand chose :ane:
Je n’ai même pas d’erreur Firebug, le lien s’exécute bêtement :confused:

Essaye sans le .value au href.

avec ou sans .value (il n’y était pas dans le code cité), ça ne change rien.
Pour voir comment ça réagit et le code HTML associé : www.onestation.fr…

Merci du coup d’main :jap:

Pour ce que j’en ai remarqué, ça marche, mais ce qui déconne c’est l’activation de l’événement onload(). Oh et bien sûr, c’est bien href, et pas href.value :wink:
Vu que tu utilises jQuery, tu peux aussi t’en servir pour activer ton basar.

Sinon, la méthode old school : tu fous un appel vers une fonction faisant tout ça (genre la fonction anonyme gérant le onload) dans l’attribut onload du tag body.

J’ai rajouté la librairie JQuery entre temps parce que le système de gestion du titrage/jaquettes était existant sur l’ancienne version du site web sous JQuery, j’voulais pas réinventer la poudre.
Par contre, j’ai pas tout saisi. Quel basar veux-tu que j’active avec jQuery ??
Si tu pouvais être plus prolixe sur les corrections à apporter, ça m’aiderai grandement :ane:

Bah pour la gestion d’événement :slight_smile: Tu peux utiliser jquery au lieu de prototype.
Bon, pas sûr que ça change grand chose :slight_smile:

-> pastebin.com…

Si, ça change un peu :slight_smile:

Pas avec la balise CData par contre. Cela dit, en l’enlevant, l’action AjaxUpdater fonctionne bien, mais pour que le lien soit bien chargé, Event.findElement(e) au lieu de link.href

Par contre, il faut que je trouve une astuce pour lancer my_onload() à chaque update Ajax, sinon les liens contenus dans la page appelée ne sont pas concernés par la règle… Pour le test j’ai mis sur onclick du body, et ça l’applique bien aux éléments ainsi chargés. Reste à trouver un élément déclencheur un peu plus cohérent… une idée ?
Edité le 05/08/2012 à 11:00

Bah, faut que tu modifies l’arbre DOM du sous document que tu charges…

Là, ça dépasse mes connaissances générales du JavaScript… :ane:
J’ai beau me documenter sur l’arbre DOM en général, je ne vois pas de quelle manière ça peut répondre à ma problèmatique…


Un appel à my_unload() au chargement du sous-document semblait si simple !

Bah tu peux le faire hein :slight_smile: pastebin.com…
Il s’agit d’utiliser les fonctionnalités de prototype, notamment le callback onComplete ou onSuccess. Bref : RTFM :stuck_out_tongue:

RTFM ? Quel est encore cette abréviation de nom d’oiseau ? =o

J’ai tenté un truc avec le onLoaded et onSuccess tout à l’heure, mais ça ne marchait pas vraiment :ane:
Merci pour le coup d’pouce en tout cas, j’vais regarder ça :wink:

Read That F***ing Manual, voyons :wink:

Comme si j’avais pas lu en long en large et en travers la doc de Prototype :o :ane:

:stuck_out_tongue:

Mais ceci étant, toute l’idée réside dans un événement onComplete / onSuccess (mieux) mettant à jour tout tes liens correctement. Je t’ai filé l’exemple dans mon précédent poste, ensuite je ne peux pas tester (vu que c’est du onload, faut recharger le document pour tester, mais ça perd le onload :)).

Par contre, y a un truc auquel tu ne fais pas gaffe là, c’est que le lien dépend de la source. ie: foobar.html marche pour un document index.html au même niveau que la page principale (et qui fait ces modifs).

J’ai mis en application hier l’exemple que tu avais posté et effectivement ça fonctionne bien.
Par contre je comprends pas cette histoire de niveau. Parce que peu importe le niveau bah ça marche aussi :neutre:

Edit : Autant pour moi, ça ne fonctionne en effet qu’en URL relatives ! cf tests : www.onestation.fr…
Edité le 06/08/2012 à 10:17

Voilà.
Je ne sais pas si prototype ou jquery dispose d’outils pour réécrire une URL en fonction d’une autre base. Mais soit tu n’utilises que des URLs absolues, soit tu réécris (et là, faut pas oublier les trucs à la con comme les , les …).

tu veux dire “que des URL relatives” !
Je pense que cette solution sera la plus simple, à moins que je sois bloqué plus loin dans le dev avec des URL absolues, auquel cas, j’aviserai à l’instant T…

Par contre y’a un truc qui me dérange beaucoup avec Ajax, c’est que du coup comme on ne change pas réellement de page, les liens ne sont pas bookmarquables. Alors moi je ruse en lançant les headers et l’habillage global si jamais un quidam décide de se rendre directement à mapage.php (par exemple par le biais de google et son indexation), par contre impossible d’utiliser les fonctions précédent et suivant du browser, et l’URL de la barre d’adresse ne change pas non plus. Y’a bien window.location.replace() mais du coup ça inhibe tout l’intérêt d’ajax puisque ça charge ladite page dans le navigateur…
Je pourrai jouer avec des ancres, qui du coup ne rechargent pas, mais ce ne sont pas les vraies pages, donc pas d’intérêt pour moi :confused:

URL absolues plutôt. Surtout si tu utilises PHP, c’est guère compliqué.
Et si tu n’es pas content avec AJAX, utilises des iframe :stuck_out_tongue:

Pour le côté bookmark, tu as la solution tweeter & cie : chaque URL termine par un #toto, qui est bookmarkable. Dans la fonction onSuccess, il te suffit donc de construire une pseudo ancre :

document.location.replace = ‘foobar.html#startFrom:’ + link.href;

Du coup : le navigateur n’y voie que du feu, et l’URL a changé sans recharger toute la page.

A toi ensuite de te servir de ça pour recharger (dans le onload) la bonne page.