web-dev-qa-db-ja.com

jQuery:this.attr()は関数ではありませんか?

これを正しいスコープで使用していないのかどうかはわかりませんが、基本的にリンククリックをキャプチャし、リンクされたページに移動する前にページをフェードアウトさせるスクリプトがあります。ただし、リンクがJavaScript onclickの場合、スクリプトは失敗します。

ここに私のコードがあります:

<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関数を呼び出しています存在します。どうすればこれを達成できますか?

24
chaoskreator

Diodeusはattr()thisではなくjQueryコレクションのメソッドです)を使用する前に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を設定し、引数としてイベントオブジェクトへのアクセスを保証します。

5
eyelidlessness

使用:_this.attr_の代わりに$(this).attr

これにより、jQueryのコンテキストに強制されます。