2015-09-28 16 views
5

削除しませんが、それは動作しません。私はlodashのスロットルの有無に関わらずリスナーを設定しようとしましたが、何の違いもありません。ここに私のコードは次のとおりです。イベントリスナーは、私は窓に設定されたイベントリスナーを削除する必要が

setupListener() { 
    window.addEventListener('resize', _.throttle(this.handler.bind(this), 750)); 
    window.addEventListener('scroll', _.throttle(this.handler.bind(this), 750)); 
} 

removeListener() { 
    window.removeEventListener('resize', _.throttle(this.handler.bind(this), 750)); 
    window.removeEventListener('scroll', _.throttle(this.handler.bind(this), 750)); 
    window.addEventListener('load', this.handler.bind(this), false); 
} 

static isElementInViewport (el) { 
    let rect = el.getBoundingClientRect(); 
    return (
     rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && 
     rect.right <= (window.innerWidth || document.documentElement.clientWidth) 
    ); 
} 

handler() { 
    if (this.options.url === undefined) {throw new Error('no url specified');} 
    if (InfiniteScroll.isElementInViewport(this.elementToWatch)) { 
     this.removeListener(); 
     this[this.options.transport](); 
    } 
} 

私も除去promisifyしようとしました:

handler() { 
    if (this.options.url === undefined) {throw new Error('no url specified');} 
    if (InfiniteScroll.isElementInViewport(this.elementToWatch)) { 
     Promise.resolve(this.removeListener()) 
      .then(val => { 
       this[this.options.transport](); 
      }); 
    } 
} 

いずれかの違いはありませんでした。

後のコードで、私は、リスナーを再割り当てしたい:

handleResponse(data) { 
     console.log('handleResponse' + data); 
     Promise.resolve(this.addElementsToDOM(data)) 
      .delay(1000) 
      .then(() => { 
       this.page++; 
       this.elementToWatch = document.getElementById(this.element).rows[document.getElementById(this.element).rows.length - this.options.loadTiming]; 
       //this.setupListener(); 
      }); 
    } 

私はすべてのステップを記録し、その理由を見つけることができませんしました。誰かが助けてくれますか?

追記:削除し、リスナーにすべての時間を追加するよりも、スクロールイベントを処理する良い方法はありますか?

+1

ありがとうございます@こちらは、この質問と回答を見ました。私は名前付きファンクションを既に使用していると思います。 –

+0

はい、間違いなくポイントがありません。あなたはあなたが 'add 'したもの、つまり' bind() 'から返された値ではなく、別の呼び出しでラップされたものを' remove ***'する必要があります。 – Amit

+1

私の答え、@ J.Doeを試しましたか? – Buzinas

答えて

5

事がある:あなたがイベントリスナーを追加するとき、ブラウザはその「キー」は、パラメータとして渡しているfunction参照として保存されます。したがって、削除する場合は、その参照を送信する必要があります。

あなたの問題を解決するには2つの方法があります。最初は名前の関数を作成することです:

setupListener() { 
    this.listener = function() { 
    _.throttle(this.handler.bind(this), 750); 
    }.bind(this); 

    window.addEventListener('resize', this.listener); 
    window.addEventListener('scroll', this.listener); 
} 

removeListener() { 
    window.removeEventListener('resize', this.listener); 
    window.removeEventListener('scroll', this.listener); 
    window.addEventListener('load', this.handler.bind(this), false); 
} 

他には、ウィンドウのaddEventListenerメソッドをオーバーライドすることであるが、私はあなたがそれを行うことをお勧めしません。

+1

downvoterに:理由を説明するコメントを残すことができますか? – Buzinas

+1

おそらくこの質問は閉じられていて、答えられていないはずです。また、最後のポイントは 'addEventListener'をオーバーライドすることです。そうしないと良い提案です。頭に自分自身を撮影するのではなく、最初にこれらのアイデアは言及しない方がいいです。 – Amit

+0

ありがとうございました! –

関連する問題