2009-04-26 50 views
1

方面,我需要一些幫助在此代碼塊幫助:

options.imgs.click(function() { 
      var allImgs = $("#big img"); 
      $("#big img").each(function(n) { 
       this.index = n; 
      }) 
      animateImage(allImgs); 
     }) 

    }; 

    function animateImage(images) { 
     for(var i = 0; i < images.length; i++) { 
      if (images[i].index == 0) { 
       alert($(this).index) 
      } 
     } 
    } 

我的問題是:

$(this).effect('scale', { percent: 200 }, 1000) 

不工作。我希望該語句引用索引爲0的圖像,並將其縮放200%。但$(this)根本不是指第一個圖像。

+0

我沒有看到您在示例中使用問題代碼的位置。但你總是可以做$(「#big img:first」)。將動畫應用到第一張圖片的效果 – 2009-04-26 05:35:38

+0

@Deviant,他粘貼的問題行可能屬於animateImage函數。 – strager 2009-04-26 06:14:30

回答

2

只要你打電話功能的「這個」變量發生變化:

function test() { 
    alert(this); // this will be the window object 
} 
$('p b').click(function() { 
    alert(this); // this will be the bold element object 
    test(); 
}); 

例如,(使用Firebug)運行此對這個頁面,我可以點擊「問」和在頂部右側(它們被粗體顯示)的「被查看」項目...並且你得到的是來自測試功能的警報,其中這個是窗口對象,而不是因爲它在事件處理器。

爲了解決這個問題,只是通過你想通過功能上下工夫對象:

options.imgs.click(function() { 
      var allImgs = $("#big img"); 
      $("#big img").each(function(n) { 
        this.index = n; 
      }) 
      animateImage(allImgs, this); 
    }) 

}; 

function animateImage(images, img) { 
    for(var i = 0; i < images.length; i++) { 
      if (images[i].index == 0) { 
        alert($(img).index) 
      } 
    } 
} 
0

Call function with 「this」

基本上你想要的是更換

animateImage(allImgs); 

animateImage.call(this, allImgs); 

你可以重構你的代碼到這個(或類似的東西):

options.imgs.click(function() { 
    var allImgs = $("#big img"); 
    allImgs.each(function(n) { 
     this.index = n; 
    }); 

    allImgs.get(0).effect('scale', { percent: 200 }, 1000); 
}); 

你也可以開始效果一邊each參數n == 0。 (我沒有在我的例子中這樣做,因爲它不完全像你有的代碼(忽略醜陋的併發問題))。

0

當您在點擊調用中時,第一個參數(「this」)是您單擊的DOM元素。您的DOM元素是否具有「索引」屬性?

我也推薦你使用「對象轉儲」功能(這裏是一個例子:http://weblogs.asp.net/skillet/archive/2006/03/23/440940.aspx)。用法與此類似:

$("a").click(function(){ 
    alert(object_dump(this)) 
}); 

(注意object_dump()函數返回一個字符串,你需要「警報()」,或做別的事情與它)。