11525 sujets

JavaScript, DOM et API Web HTML5

Pages :
Bonjour,

Dans le cadre d'une application web j'aurais besoin de simuler un clic sur un lien.
je ne peux contourner ce besoin.

J'ai d'abord tenté d'appeler la méthode click sur l'objet Anchor mais elle n'existe pas sur tous les navigateurs.

Ensuite j'ai pensé créer un nouvel événement, mais je n'ai pas réussi à le créer et le rattacher à un lien.

Si vous avez des infos sur le sujet vous êtes mon ami.

merci d'avance,

cdt,

taobang

attention : il ne s'agit pas là d'écouter un événement via un addEventListener mais bien de créer un event et le rattacher à un noeud ...
philippelemesle a écrit :
attention : il ne s'agit pas là d'écouter un événement via un addEventListener mais bien de créer un event et le rattacher à un noeud ...


Salut,

quelle différence? je pense que ton probleme n'est pas bien exposé... ou alors c'est pas mon jour et je capte pas... Smiley biggol
Modifié par skywalk3r (28 Feb 2008 - 12:15)
je dirais que ce n'est pas parceque tu ne captes pas que le problème n'est pas bien exposé.

Je n'ai pas dû être assez clair :

un listener tourne sur ma page écoutant les clics souris.

j'ai besoin de générer le même événement qu'un utilisateur générerait en cliquant sur un lien de la page.

est-ce assez clair ?
Smiley lol Désolé je capte pas, ca vient surement de moi...

En fait tu veux déclancher par javascript un évenement sur un lien? Ce à quoi je t'aurais conseillé de faire :
document.getElementById('monLien').click()

Mais à la lecture de ton premier post il semble que tu aies déjà essayé... Et après test sous FF ça ne marche pas.
Modifié par skywalk3r (28 Feb 2008 - 12:28)
Tu peux sans problème ajouter un autre gestionnaire via un addEventListener sur les liens, même si un gestionnaire pour le click est déjà à l'écoute sur ta page...

Tu peux même, avec cette méthode, attacher plusieurs gestionnaires au même événement sur un élément donné, par exemple...

elt=document.getElementById("toto");
elt.addEventListener("click", ilSentaitBonLeSableChaud, false);
elt.addEventListener("click", monGestionnaire, false);


Attention à l'accessibilité: vérifie que si le javascript est désactivé, l'utilisateur a accès à des informations équivalentes et aux mêmes fonctionnalités si cela est pertinent.
De plus, double tes événements click par des événements keypress...
merci à skywalk3r d'avoir tenté dans son dernier post de répondre à mon problème !

c'est en effet ce comportement que je cherche.

Gilles : mon problème n'est pas d'écouter les événements mais d'en générer un from scratch ! qui sera catché par mon listener tournant sur la page.
Je n'y arrive pas meme avec un fireEvent sur mootools...

Donc si je comprends bien tu as un lien sur qui pointe vers une page. Pour une raison particulière tu veux faire en sorte que javascript déclanche le click sur ce lien et donc le changement de la page courante sur celle du lien...? si c'est juste cela tu peux par js faire ceci :
window.location.href = document.getElementById('monLien').href
?
Modifié par skywalk3r (28 Feb 2008 - 12:37)
Je ne le pensais pas mais après test, le code s'execute (sous FF du moins)

Edit : sous IE, Opéra et Safari également

Sinon il y a aussi la possibilité de tester si le début de la chaine du href commence par "javascript:" et de faire un
eval(document.getElementById('monLien').href);


Ce qui serait inutile etant donné que de toute facon avec l'autre méthode le js est executé... je n'en reviens tjs pas d'ailleurs puisque ca n'est pas du ressort de window.location.href d'executer du code...
Modifié par skywalk3r (28 Feb 2008 - 12:45)
Salut,

Je confirme, Philippe : tu n'es pas clair... Un exemple de ce que tu veux obtenir, et un bout de code, auraient été fortement appréciés pour t'aider.

Essaie peut-être de regarder du côté de dispatchEvent (la solution standard, définie dans le DOM) et son équivalent sous IE (fireEvent). Mais comme elles sont peu utilisées, il n'est pas évident de trouver des infos dessus.

Encore une fois, peut-être que tu peux faire plus simple, mais pour ça il faudrait expliquer précisément ce que tu veux faire.
et bien Julien je peux utiliser d'autres mots mais je crains que cela ne simplifie pas ma problématique.

mais je vais quand même le faire !!!!

considérons une page HTML avec un lien.
Sur le chargement de la page, on va essayer de créer un événement
qui sera considéré par le DOM comme équivalent à celui qui est généré lorsqu'une personne clique sur le lien

on aurait donc un code qui ressemble à ca (sous firefox tout du moins) :


<html>
<head>
<script language="javascript">
function simulateClick() {
  var evt = document.createEvent("MouseEvents");
  evt.initMouseEvent("click", true, true, window,
    0, 0, 0, 0, 0, false, false, false, false, 0, null);
  var cb = document.getElementById("lien3"); 
  cb.dispatchEvent(evt);
 
}
</script>
</head>
<body onLoad="simulateClick()">
<div>
<a id="lien3" href="javascript:alert('coucou')">mon lien à cliquer</a>
</div>
</body>
</html>
OK,

En théorie, le code suivant devrait suffire :
function simulateClick() {
  var cb = document.getElementById("lien3");
  if (cb.dispatchEvent) {
    var evt = document.createEvent("MouseEvents");
    evt.initEvent("click", true, true);

    cb.dispatchEvent(evt);
  } else {
    cb.click();
  }
}

Mais apparemment, Firefox ne va pas suivre le lien non plus avec dispatchEvent... Bref, bon courage et préviens-nous si tu trouves une solution.
Gilles a écrit :
De plus, double tes événements click par des événements keypress...

Euh non, "click" est déclenché en cas d'interaction avec le clavier.
Julien Royer a écrit :
(...)bon courage et préviens-nous si tu trouves une solution.

Euh non, "click" est déclenché en cas d'interaction avec le clavier.


Il me semblait que ce n'était le cas que pour les éléments pouvant recevoir le focus clavier (liens, boutons, champs de formulaires, j'en oublie probablement...). Pour un élément quelconque, il me semble qu'il faut le préciser.

Il est vrai qu'ici on parle de liens Smiley biggol
je ne vois toujours pas le but profond de tout cela...
ce n'est pas ton "vrai" code, bien sûr?
qu'est-ce que tu veux vraiment faire avec ce lien?
rassure toi Javatwister d'autres m'ont fourni au moins un début de réponse à ma question ...
ne partez pas du principe que les personnes postant n'ont pas réfléchi à leur besoin, ou ne connaissent rien à rien ...

ds mon projet il y a du fabridge, du flex, du javascript, des webservices, du java ...
si j'ai formulé cette question, c'est que mon besoin est très précis et s'insère ds cette ensemble de technos.

Julien Royer m'a confirmé ce que je pensais ...

"Firefox ne va pas suivre le lien non plus avec dispatchEvent"
skywalk3r a écrit :
Je ne le pensais pas mais après test, le code s'execute (sous FF du moins)

Edit : sous IE, Opéra et Safari également


Si si elle est correct. Sinon il y a la solution avec eval()
mon test :
<script language="javascript">

function evalLink()
{
	eval(document.getElementById('monLien').href);
}
</script>

<a id="monLien" href="http://www.google.fr">mon lien vers google</a>
<a href="javascript:evalLink()">evaluation d'url ??</a>


et moi j'ai une belle erreur Smiley fache
Smiley sweatdrop

A vrai dire le test que tu as fait ne correspond a aucune des deux solutions que je t'ai donnée.

Celles que j'ai decrites plus haut correspondrait plus aux deux fonctions dans cet exemple :

<script>
function evalLink1()
{
	if(document.getElementById('monLien').href.match(new RegExp("javascript:.*"))){
		eval(document.getElementById('monLien').href);
	} else {
		window.location.href = document.getElementById('monLien').href;
	}
}

function evalLink2()
{
	window.location.href = document.getElementById('monLien').href;
}
</script>

<a id="monLien" href="http://www.google.fr/">mon lien vers google</a>

<a href="javascript:evalLink1()">evaluation d'url méthode 1</a>
<a href="javascript:evalLink2()">evaluation d'url méthode 2</a>


Et là... pas d'erreurs Smiley cligne
Pages :