web-dev-qa-db-fra.com

jQuery: this.attr () n'est pas une fonction?

Je ne sais pas trop si je ne l'utilise pas dans la bonne portée ou quoi, mais j'ai un script qui capture essentiellement un clic sur le lien et fait disparaître la page avant de passer à la page liée. Cependant, si le lien est un JavaScript onclick, le script échoue.

Voici mon code:

<script type="text/javascript">

    pageObj = {
        init: function(){
            $("body").fadeTo("slow", 1);
        },
        redirectPage: function(redirect){
            window.location = redirect;
        },
        linkLoad: function(location){
            $("body").fadeOut(1000, this.redirectPage(location));
        }
    };

    $(document).ready(function() {
        pageObj.init();

        $("a").click(function(e){
            e.preventDefault();
            if (this.attr('onclick') !== undefined) {
                eval(this.attr('onclick').val());
            } else {
                var location = this.href;
                pageObj.linkLoad(location);
            }
        });
    });

</script>


Comme vous pouvez le voir, j'essaie de vérifier si le lien a l'attribut onclick, puis d'appeler la fonction onclick si elle existe. Comment puis-je atteindre cet objectif?

25
chaoskreator

Bien que Diodeus soit correct, vous devez encapsuler this dans une collection jQuery avant d'utiliser attr() (c'est une méthode d'une collection jQuery, pas d'un HTMLElement), vous pouvez sautez tout aussi bien attr().

$("a").click(function(e){
    var location;
    e.preventDefault();
    if ($.isFunction(this.onclick)) {
        this.onclick.call(this, e);
    } else {
        location = this.href;
        pageObj.linkLoad(location);
    }
});

Notez que j'ai utilisé la propriété (lorsqu'un document HTML se charge, les attributs sont généralement préchargés dans les propriétés, les attributs on_______ Étant préchargés en tant que méthodes. Notez également que j'ai utilisé this.onclick.call() plutôt que eval(), définissant les this corrects pour les méthodes onclick et garantissant l'accès à l'objet événement comme argument.

6
eyelidlessness

Utilisez: $(this).attr au lieu de this.attr

Cela le force dans le contexte de jQuery.