9
votes

JavaScript Get Href quand Link a cliqué sur

Voici ma situation. J'ai des liens sur tout le site Web. Certains d'entre eux ressemblent à ceci:

Quelque fichier

Et certains ressemblent à ceci:

Quelque fichier < p> Tous les liens doivent appeler une certaine fonction () lorsque vous avez cliqué sur. Ceux qui ont l'appel dans l'attribut OnClick sont des pages de contenu Legacy. Les pages les plus récentes ont un événement de clic jQuery attaché à ceux-ci comme: xxx

alors voici la chose. Je peux mettre à jour une fonctionnement (), mais je ne peux pas toucher les liens réels ou que JQuery. Ce dont j'ai besoin, c'est savoir que la valeur HREF du lien a cliqué. J'ai essayé d'utiliser ce qui suit dans un certain temps (): xxx

mais cela ne fonctionne pas. J'ai aussi essayé console.log (window.event) et obtenir rien, dit qu'il est indéfini. Aucune idée de ce qui me manque ici, ou est-ce essentiellement impossible sans transmettre une référence à cela lorsque la fonction est appelée?

Edit: Pour être clair, je ne peux pas comme une solution courte ou même à moyen terme éditer L'appel à de fonctionnement () dans l'ONCLICK ou dans le code JQuery Black, je ne peux donc pas les modifier à TIXFUNCTION (CEL) ou similaire. Je ne suis pas sûr qu'il soit possible d'obtenir le href de l'intérieur de l'intérieur () sauf si je ne le fais si: (


1 commentaires

Mon violon fonctionne comme vous l'avez demandé. J'ai dû modifier vos blocs de code, mais seulement pour empêcher le lien d'essayer d'obtenir quelque chose et de conforme le reste du code en conséquence en raison du lien de référence PDF manquant.


5 Réponses :


11
votes

Vous n'avez besoin de rien d'autre que this.href code> à l'intérieur du Cliquez sur CODE> Callback.

$(document).ready(function()
{    
    function someFunction(event)
    {
        console.log(this.href);
        console.log(event);
    }

    $('a[href$=".pdf"]').click(function (event)
    {
        someFunction.apply(this, event);
    });
});


10 commentaires

OP a dit qu'il ne peut pas toucher la fonction de clic. Il a dit qu'il doit le faire en JavaScript mais sans modifier les 2 sections du code.


Il n'était pas complètement clair exactement ce qui ne peut pas être changé sur le code JQuery. Si rien ne peut être changé, il ne peut pas être fait.


Droite ... Je ne peux rien changer dans le codeblock de jquery ou l'appel onglick .. donc je ne peux donc pas simplement faire une fonction de fonctionnement (ceci); aussi, j'ai essayé de faire console.log (ceci .href); à l'intérieur de la fonctionnement () et cela m'a aussi donné «indéfini»


Je ne suis pas d'accord. Voir ma réponse.


@MYSQL_NOOBIE_XXXXX (addendadum à mon commentaire précédent): Vous ne pouvez pas accéder à la valeur HREF HREF de l'élément cliqué dans OFFONCTION sous une manière compatible entre navigation croisée sans changer Quelque chose Dans le bloc de code JQuery.


Oui. Le problème est que j'ai un client prêt à me permettre de changer cette fonction dans un fichier JavaScript, mais ne veut pas simplement changer le sélecteur de jQuery ou l'appel onclick qui est à la page, ne veut pas me laisser changer quoi que ce soit. fonction à ce moment :(


@MYSQL_NOOBIE_XXXXX Votre client semble stupide, déraisonnable et têtu. S'ils savent mieux que vous, pourquoi ne le font-ils pas eux-mêmes?


Ce n'est pas qu'ils soient stupides ou déraisonnables .. dans la plupart des ressources. Je peux leur fournir une nouvelle version de la fonction et ils peuvent appliquer suffisamment en 2s dans certains fichiers globaux. Mais pour changer le code sur la page sur toutes leurs pages ... nécessitera beaucoup plus de travail..quelque chose qu'ils "ne peuvent pas" faire à ce moment-là. Maintenant ... pourquoi ils ont duûr un tas de liens aléatoires et un code de jQuery sur un tas de pages en premier lieu ... LOL peut-être qu'il y a un peu de bêtise de leur part, car ils devaient maintenant jeter le "facile" options sur la porte.


Quoi qu'il en soit, j'ai donné un +1 pour effort, je suppose que je devrais simplement dire au client de le sucer, pas de joie avant de faire ce qui doit être fait: /


@MYSQL_NOOBIE_XXXXX de sorte qu'il va avec le code hérité. Je vis ce quotidien.



1
votes

Utilisez soit this.href , ou plus jQuery approprié $ (ceci) .attr ("href ') pour obtenir la valeur de chacun de vos liens. < / p>


6 commentaires

Il n'y a absolument pas besoin d'utiliser .attr () dans ce cas. this.href fonctionne dans tous les navigateurs et offre de meilleures performances et est significativement plus concis. Stackoverflow.com/a/4652402/139010


@ Mдγγбдll: J'étais sous l'impression que "plus anciennes" des versions d'IE (bien que je ne puisse pas me rappeler quelle versions) requises this.getattribute ("href") plutôt que le simple this.href ? Désolé, je ne peux pas fournir un soutien à cette compréhension, cependant ... juste une de ces choses que je croyais depuis si longtemps, je suppose. = /


@Davidthomas Je pourrais me tromper, car j'utilise cette réponse comme référence, mais je ne l'ai pas testé moi-même (je gère OS X au travail et à la maison, et une machine virtuelle ne vaut tout simplement pas la peine d'être effort).


@ MДγγбдll: Que puis-je dire? 'S a bon référence ..! Bien que je sois toujours curieux. Peut-être un travail pour demain, alors. Ou ... Chaque fois que je m'en souviens à ce sujet.


Ah, j'ai recommandé $ (this) .attr ('href') depuis que je me souviens de cela.href lancer des erreurs non définies dans les premières versions d'IE.


J'ai ajouté console.log (this.href); à l'intérieur de la fonctionnement () et il a dit "non défini" :(



0
votes

ici ya va. Essaye ça. Ajustez en conséquence pour vos besoins (j'ai supprimé le lien PDF car on n'existait pas dans mon violon).

Modifier: Testé dans FF et Chrome. Laissez-moi savoir si cela fonctionne pour ya.

http://jsfiddle.net/lazerblade01/dtvz5/22/


10 commentaires

Hello Lazerblade: Je suis allé à votre lien (en utilisant la dernière version de FF) et Console journal me donne un message d'erreur "L'événement n'est pas défini"


Ouais, j'ai testé en chrome. Je verrai si je peux aller travailler à FF aussi, donnez-moi quelques minutes. Besoin de ajuster.


Afaik, fenêtre.event n'est pas compatible avec le navigateur croisé. Je suis surpris que cela fonctionne dans quoi que ce soit d'autre que c'est-à-dire, et je doute sérieusement que vous puissiez jamais utiliser window.event dans Firefox.


Pas besoin de. Pensez en dehors de la boîte. Si vous ne pouvez pas capturer l'événement dans la première section du code car vous ne pouvez pas le changer, que faites-vous?


Les cerceaux que le code saute pour atteindre la compatibilité FF sont complètement inutiles, et vous toujours a changé le code de liaison d'événement JQuery. À ce rythme, vous pouvez aussi bien utiliser l'une des options (beaucoup plus propre) que j'ai présentées.


C'est-à-dire que cela nécessite beaucoup plus de cerceaux pour accomplir des choses dans CSS et JS que FF. Mais je me digresse. Oui, ma solution est volumineuse et nécessite beaucoup plus de code qu'il ne devrait. Vous seriez presque préférable de faire un remplacement sur tous les liens contenant du PDF dans le HREF et de les avoir sur une fonction différente. Mais tout ce qui fonctionne ...


"Tout ce qui fonctionne?" Cela fonctionne. la seule raison pour laquelle Ce mess travaille est parce que vous avez lié un deuxième gestionnaire d'événements, mais sérieusement, il n'est absolument pas nécessaire d'écrire une épave de code aussi de train. Cela lie également un second gestionnaire, , et est beaucoup plus clair, concis et maintenu. Je suis désolé, mais xkcd.com/386


Aie. Sauf que vous n'avez pas répondu à la demande de l'OP de ne pas modifier le document.Ready.


Je l'ai changé exactement autant que vous le faites - seul le sélecteur.


Oui. Le problème est que j'ai un client prêt à me permettre de changer cette fonction dans un fichier JavaScript, mais ne veut pas simplement changer le sélecteur JQuery ou l'appel onclick qui est à la page :(



2
votes

Alors je laisse cela laisser mijoter pendant un moment et je suis arrivé avec une solution à court terme ... c'est assez hacon hacky et je me sens un peu sale pour le faire mais parfois tu dois faire ce que tu dois faire ce que tu dois faire quoi que tu puisses faire vous devez faire ... Quoi qu'il en soit, je pose ma version laide ici pour d'autres personnes qui pourraient être sauvegardées dans un coin similaire ...

Gardez à l'esprit, le seul code que je suis autorisé à toucher en op est le une fonction de fonctionnement () fonctionne elle-même. En outre, je peux ajouter du code supplémentaire au même endroit que celui où il se trouve, c'est ce que j'ai fait ... p>

Fondamentalement, la solution consiste à créer un auditeur de clic supplémentaire qui met la valeur HREF dans un Variable exposée à la fonction, et la poule enveloppe le code de fonctionnefonction () dans un petit délai d'attente pour vous assurer que la nouvelle fonction de clic peut faire sa chose. P>

<!-- STUFF I CAN'T TOUCH! (located on-page) -->
<a target="_blank" onclick="someFunction()" href="/somFile.pdf">some file</a>
<a target="_blank" href="/somFile.pdf">some file</a>

<script type='text/javascript'>
$(document).ready(function(){
  $('a[href$=".pdf"]').click(function() {
    someFunction();
  });
});
</script>
<!-- END STUFF I CAN'T TOUCH! -->

/*** STUFF I CAN TOUCH! (located in a script include) ***/
// hackjob!
$(document).ready(function(){
  $('a').click(function() {
    if ($(this).attr('href')) someFunction.href = $(this).attr('href');
  });
});

function someFunction(a) {
  // more hackjob!
  window.setTimeout("console.log(someFunction.href);",200);
}
/*** END STUFF I CAN TOUCH!***/



12
votes

ici il est en pure javascript xxx


0 commentaires