5

私はpreventDefaultこのような要素イベントで使用しました:

$('#element').click(function (e) {
    do stuff...
});

今、私はすでに使用したい引数をとる関数を持っていますが、どのようにすればよいpreventDefaultかわかりません:

<a href="#services" id="services_link" class="services" onclick="sectionScroll('services')">Services</a>


function sectionScroll(id) {
    history.pushState(null, null, '#' + id);
    $('html, body').animate({
        scrollTop: $("#" + id).offset().top
    }, 1000);
}

代わりに return false を使用してみましたが、リンクがクリックされたときにちらつきが発生しました。

preventDefault上記の関数にどのように追加できますか?

編集

私の最初の質問は、他の引数を持つ関数で preventDefault を使用することに関するものでした。最終的にはインライン JavaScript を使用する必要がなかった (回避する方法がないように見えた) ので、これを使用しました。とてもきれいだと思います:

<a href="#services" class="menu-link">Services</a>


   $('.menu-link').click(function (e) {
        e.preventDefault();
        var location = $(this).attr('href');
        history.pushState(null, null, location)
        $('html, body').animate({
            scrollTop: $(location).offset().top
        }, 1000);
    });
4

5 に答える 5

13

インライン イベント ハンドラーを本当に使用したい場合は (お勧めしませんが)、次のようにしてください。

<a href="#services" id="services_link" class="services"
   onclick="sectionScroll('services', event)">Services</a>

<script type="text/javascript">
function sectionScroll(id, e) {
    e.preventDefault();
    history.pushState(null, null, '#' + id);
    $('html, body').animate({
        scrollTop: $("#" + id).offset().top
    }, 1000);
}
</script>
于 2012-11-21T22:34:28.807 に答える
2

他の例と同様に、jQuery を使用してクリック イベントを処理できます。

<a href="#services" id="services_link" class="services">Services</a>

$('#services_link').click(function (e) {
    var id = "services";

    history.pushState(null, null, '#' + id);
    $('html, body').animate({
        scrollTop: $("#" + id).offset().top
    }, 1000);

    e.preventDefault();
}

preventDefaultこれにより、イベントを呼び出すことができます。

これは、インライン Javascript を使用しなくなり、イベント ロジックをすべて 1 つのメソッド (つまり jQuery) を使用して処理できるため、一部が jQuery で一部がインラインであるというよりもはるかに優れています。

「インライン スクリプトを避けるべき理由」を読んで、インライン スクリプトを避けるべき理由を理解することをお勧めします。

于 2012-11-21T22:22:21.727 に答える
0

イベント ハンドラから false を返すだけです。

<a href="#services" id="services_link" class="services" onclick="return sectionScroll('services')">Services</a>


function sectionScroll(id) {
    history.pushState(null, null, '#' + id);
    $('html, body').animate({
        scrollTop: $("#" + id).offset().top
    }, 1000);
    return false; // note the addition of return keyword in onclick attribute above
}
于 2012-11-21T22:20:56.533 に答える
0

HTMLの代わりにjs自体でイベント Handler を割り当てることができます

<a href="#services" id="services_link" class="services"
                                       data-id="services">Services</a>

/

 $('#services_link').on('click', function(e){
        e.preventDefault();
        // data-id is a HTML5 data attribute

        var id = $(this).data('id');
        history.pushState(null, null, '#' + id);
        $('html, body').animate({
            scrollTop: $("#" + id).offset().top
        }, 1000);
    });
于 2012-11-21T22:24:06.240 に答える
-1

.on("click") が body または html に "overflow:hidden" を追加すると、コールバック内で e.preventDefalt() を使用したとしても、ページが一番上までスクロールします。

于 2016-04-02T10:00:45.277 に答える