2013-03-07 56 views
1

由於HTML代碼:jQuery:通過數據屬性選擇某些元素失敗 - 爲什麼?

<div id="details" data-type="motion"> 
    <p>Lorem ipsum</p> 
</div> 
<img src="http://placehold.it/50x50" data-type="motion" /> 
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidun...</p> 

爲什麼不工作下面的腳本的選擇是否正確?

$(document).ready(function() { 

    $('[data-type="motion"]').each(function() { 

     $this = $(this); 

     $(window).bind('scroll', function() { 

      var yOffset = (window.pageYOffset/$this.data('speed')) + 'px'; 

      $this.css({'border': '1px solid red'}); 
     }); 

    }); 

}); 

使用'[data-type="motion"]',只有圖像被選中。 'div[data-type="motion"]'當然只選用那個數據屬性的div。 '*[data-type="motion"]'也只匹配圖像& 'img[data-type="motion"], div[data-type="motion"]'似乎有點多餘,也不工作。

下面是一個小提琴證明行爲:http://jsfiddle.net/Y7QXn/

回答

5

的問題不是選擇,它的局部變量不是本地:

$this = $(this); 

這將創建一個全局變量,所以每個元素的事件處理器會影響最後一個元素。

使它成爲一個局部變量:

var $this = $(this); 
+1

當然,我怎麼會忘了說了,謝謝您! – Sven 2013-03-07 10:58:34

1

在HTML:

<div id="details" data-type="motion"> 
    <p>Lorem ipsum</p> 
</div> 
<img src="http://placehold.it/50x50" data-type="motion" /> 
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidun...</p> 

$this.data('speed')失敗,因爲不存在與data-speed=""沒有元素。

,你也需要改變的變量這樣的範圍:

var $this = $(this); 
+0

雖然你的觀點是100%核心,其他答案解決了我的問題。當你在午餐期間嘗試簡化測試用例時會發生這種情況;-) – Sven 2013-03-07 10:58:16

+0

哈哈......我實際上添加了其他東西並去吃零食。 – 2013-03-07 11:06:09

0

我認爲它應該做的事是這樣的:fiddle

$(window).bind('scroll', function() { 
     $('[data-type="motion"]').each(function() { 
      $this = $(this); 
      var yOffset = (window.pageYOffset/$this.data('speed')) + 'px'; 
      $this.css({ 
       'border': '1px solid red' 
      }); 
     }); 
    }); 
相關問題