94 votes

Comment puis-je appeler par programme un onclick() de l'événement à partir d'une balise d'ancrage tout en gardant le " il " de référence dans le onclick de la fonction?

Est-il possible d'appeler par programme un événement onClick pour une balise d'ancrage, tout en conservant le " il " de référence à l'ancre?

Le suivant ne fonctionne pas... (du moins pas dans Firefox: document.getElementById ("linkid').cliquez sur() n'est pas une fonction)

<script type="text/javascript">
    function doOnClick() {
        document.getElementById('linkid').click();
        //Should alert('/testlocation');
    }
</script>
<a id="linkid" href="http://stackoverflow.com/testlocation" onclick="alert(this.href);">Testlink</a>

120voto

Gumbo Points 279147

Vous avez besoin d' apply le gestionnaire d'événement dans le contexte de cet élément:

var elem = document.getElementById("linkid");
if (typeof elem.onclick == "function") {
    elem.onclick.apply(elem);
}

Sinon, this fait référence au contexte le code ci-dessus est exécuté.

22voto

luschn Points 6092

Il y a une solution très simple avec jQuery, j'ai simplement utilisé et ça marche parfaitement bien:

<script type="text/javascript">
    function doOnClick() {
        $('#linkid').click();
    }
</script>
<a id="linkid" href="http://stackoverflow.com/testlocation" onclick="alert(this.href);">Testlink</a>

Testé avec IE8-10, Chrome, Firefox.

15voto

simplyharsh Points 11663

Pour déclencher un événement en gros, vous avez juste à appeler le gestionnaire d'événement pour que de l'élément. Légère modification de votre code.

var a = document.getElementById("element");
var evnt = a["onclick"];

if (typeof(evnt) == "function") {
    evnt.call(a);
}

0voto

David Caunt Points 30636

Si vous êtes en utilisant ce purement pour faire référence à la fonction de l'attribut onclick, cela semble être une très mauvaise idée. Inline événements sont une mauvaise idée en général.

Je vous suggère les points suivants:

function addEvent(elm, evType, fn, useCapture) {
    if (elm.addEventListener) {
    	elm.addEventListener(evType, fn, useCapture);
    	return true;
    }
    else if (elm.attachEvent) {
    	var r = elm.attachEvent('on' + evType, fn);
    	return r;
    }
    else {
    	elm['on' + evType] = fn;
    }
}

handler = function(){
   showHref(el);
}

showHref = function(el) {
   alert(el.href);
}

var el = document.getElementById('linkid');

addEvent(el, 'click', handler);

Si vous voulez appeler la même fonction à partir du code javascript, de simuler un clic pour appeler la fonction n'est pas la meilleure façon. Considérer:

function doOnClick() {
   showHref(document.getElementById('linkid'));
}

-1voto

hvdd Points 21

En général, je déconseille d'appeler les gestionnaires d'événements "manuellement".

  • Il est difficile de savoir ce qui est exécuté en raison de multiples enregistré les auditeurs
  • Danger pour entrer dans une récursive infinie et de l'événement en boucle (cliquez sur Une le déclenchement Cliquez sur B, le déclenchement sur Un, etc.)
  • Les mises à jour redondantes pour les DOM
  • Difficile de distinguer les changements réels dans la vue causé par l'utilisateur à partir des modifications effectuées dans le code d'initialisation (qui doit être exécutée qu'une seule fois).

Mieux, c'est de comprendre exactement ce que vous voulez qu'il arrive, mettez les dans une fonction et l'appel à la main, ET de l'inscrire comme écouteur d'événement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X