2016-04-11 9 views
0

JavascriptでOOPが新しくなったので、独自の属性とメソッドを使用してSliderオブジェクトを作成したかったのです。私のメソッドslideNextImageでEventListenerを追加するまでうまく動作します。このメソッドがトリガーされると、メソッド内のすべての属性が未定義になります。イベントを付けないでメソッドを起動すると、うまくいきます。イベントに未定義のプロトタイプメソッドが添付されました

function Slider(photos, currentPhoto){ //Constructor 
    this.photos = photos; 
    this.currentPhoto = currentPhoto; 
} 

Slider.prototype.slideNextImage = function() { 
    document.getElementById("slider").style.backgroundImage = "url(" + this.photos[this.currentPhoto] + ")"; 
    console.log("La foto actual es la " + this.currentPhoto + " y en el almacen hay " + this.photos.length); 
} 

var photos = ["../imagenes/images/wallpaper_5.jpg", "../imagenes/images/wallpaper_4.jpg", "../imagenes/images/wallpaper_3.jpg", "../imagenes/images/wallpaper_2.jpg", "../imagenes/images/wallpaper_1.jpg"]; 

var slider = new Slider(photos, 0); 

document.getElementById("next").addEventListener("click", slider.slideNextImage); 

ありがとうございます。

答えて

2

「this」はこの場合実際に必要なオブジェクトにバインドされていないためです。

:それを解決するために

一つの方法は、明示的には、addEventListenerラインを変更することにより、スライダに「これ」をバインドすることである(あなたのケースには「これは」イベントがトリガされていた上の要素にバインドされます)

document.getElementById("next").addEventListener("click", Slider.prototype.slideNextImage.bind(slider)); 
+0

Awww、あなたは私にそれを打つことができます。 –

+0

ありがとう、今は完璧に動作します。グローバルオブジェクトとは、イベントを受け取っているオブジェクトを意味しますか? –

+0

うん、私は悪い、私はそれを修正しました。あなたは歓迎です:) – Jumpa

1

イベントハンドラとして呼び出されると、メソッドのコンテキストが失われます(thisはスライダオブジェクトではなくなりました)。いくつかのオプションがありますが、最も簡単なのはFunction.prototype.bindです。

slider.slideNextImage.bind(slider); 
関連する問題