Подтвердить что ты не робот

Jquery - this.attr() не является функцией?

Я не совсем уверен, не использую ли я это в правильной области или что-то в этом роде, но у меня есть script, который в основном фиксирует щелчок ссылки и заставляет страницу исчезать перед тем, как перейти на связанную страницу. Однако, если ссылка является javascript onclick, script терпит неудачу. Здесь мой код:

<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>

Как вы можете видеть, я пытаюсь выполнить проверку, чтобы увидеть, имеет ли ссылка атрибут onclick, а затем вызывает функцию onclick, если она существует. Как я могу достичь этого?

4b9b3361

Ответ 1

В то время как Diodeus прав, что вам нужно обернуть this в коллекцию jQuery перед использованием attr() (это метод коллекции jQuery, а не HTMLElement), вы можете просто пропустить 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);
    }
});

Обратите внимание, что я использовал свойство (когда загружается документ HTML, атрибуты обычно предварительно загружаются в свойства, причем атрибуты on_______ предварительно загружаются как методы. Также обратите внимание, что я использовал this.onclick.call(), а не eval(), установив правильный this для onclick методов и обеспечения доступа к объекту события в качестве аргумента.

Ответ 2

Использование: $(this).attr вместо this.attr

Это заставляет его в контексте jQuery.