0

私は ajax を使用して Web サービスから XML を動的にロードしています。返されるレコードは、URL の「ロード」または「呼び出し」ごとに 25 項目に制限されています。ページの高さの 90% に達したとき (または、ページの下部に達したとき - どちらを選択するかはまだわかりません)、startindexnum という名前の変数が 25 ずつインクリメントされます。

そのため、startindexnum は 25 から始まります...その後、関数の最初の「起動」の後、startindexnum は 50 になり、3 回目には 75 になります。

私の問題は、それが複数回起動し、やや不安定であることです.一番下までスクロールすると複数回処理され、25回以上増加することがあります(間違いなく、複数回実行した結果だと思います)。

XML を取得する ajax URL に追加するインクリメンタル startindex 変数を正しく生成するために、これを取得するために何を調整する必要があるか、誰にもわかりませんか? ありがとう。

var scrollcount = 1;
var startindexnum = 25;
var processing;

$(document).ready(function(){
    $(document).scroll(function(e){
       if (processing)
            return false;

            window.onscroll = function(ev) {

             if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight){
                //if ($(window).scrollTop() >= ($(document).height() - $(window).height())*0.9){
                    // you're at x%  of the page
                    processing = true;
                    scrollcount = scrollcount + 1;
                    startindexnum = scrollcount * startindexnum;
                    console.log(scrollcount);
                    docall();

                    processing = false;

                };
            };
    });
});
4

2 に答える 2

1

問題は、私が賭けdocall()ているのは非同期呼び出しであるため、その呼び出しの後にprocessingto を設定falseしても、将来のスクロール イベントをブロックすることはありません。

false の設定は、結果が返される前に発生しています。processingタスクの実行が完了したら、 false に戻す必要がdocall()あります。

         if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight){
            //if ($(window).scrollTop() >= ($(document).height() - $(window).height())*0.9){
                // you're at x%  of the page
                processing = true;
                scrollcount = scrollcount + 1;
                startindexnum = scrollcount * startindexnum;
                console.log(scrollcount);
                docall();

                //processing = false;  <--get rid of this

            };

function docall(){

    //When you are done fetching the new data and update the page set 
    function AjaxCallIsDone() {
        processing = false;
    }

}
于 2013-02-20T14:25:56.307 に答える
0

エパスカレロの投稿に加えて...

$(document).scroll(fn) と window.onscroll は必要ありません。これは、ドキュメント スクロール ハンドラが実行されるたびにアタッチされます。いくつかのこと:

1) まず、John Resig によるこのスクロール ポストを見てください。J.Resigによるスクロール

2) jquery メソッドが必要な場合は、document $(window).scroll(fn) の代わりに window を使用します。

3)そうでない場合は、次の方法でうまくいくと思います。

var scrollcount = 1;
var startindexnum = 25;
var processing;

$(document).ready(function(){
    window.onscroll = function(ev) {
        if (!processing) {   
            if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight){
                processing = true;
                scrollcount = scrollcount + 1;
                startindexnum = scrollcount * startindexnum;
                console.log(scrollcount);
                docall();
            }
        }               
    }
});
于 2013-02-20T14:55:16.597 に答える