2009-12-04 87 views
1

我一直在尋找一段時間,而我只是用JQuery和JavaScript來弄清楚我的錯在哪裏。任何幫助將不勝感激。我有下面的腳本,這對一個元素很有用。我如何修改這個以處理多個元素?如果頁面上有多個元素,滑塊將滾動一切,而不僅僅是一個容器內的元素。我知道我可以在技術上爲每種方法創建新的變量和新的類名,但這很混亂,我知道必須有一個更聰明的方法。將jQuery隔離爲只包含元素

<script type="text/javascript" charset="utf-8"> 
    window.onload = function() { 
     var container = $('div.sliderGallery'); 
     var ul = $('ul', container); 

     var itemsWidth = ul.innerWidth() - container.outerWidth(); 

     $('.slider', container).slider({ 
      min: 0, 
      max: itemsWidth, 
      handle: '.handle', 
      stop: function (event, ui) { 
       ul.animate({'left' : ui.value * -1}, 500); 
      }, 
      slide: function (event, ui) { 
       ul.css('left', ui.value * -1); 
      } 
     }); 
    }; 
</script> 

這裏是html。

<div class="sliderGallery"> 

    <ul id="audio-downloads"> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    </ul> 

    <div class="slider"> 
    <div class="handle"></div> 
    </div> 

</div> 

<div class="sliderGallery"> 

    <ul id="audio-downloads"> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    <li><a href="#">Audio Title</a></li> 
    </ul> 

    <div class="slider"> 
    <div class="handle"></div> 
    </div> 

</div> 

回答

1

更新也只是注意到你正在使用window.onload。在jQuery中,您應該使用$(document).ready()或其別名$(function())

你只需要使用一個each()通過sliderGallery元素的集合運行:

$(function(){ // This replaces your window.onload function wrapper 
    $('div.sliderGallery').each(function(){ 
     var ul = $('ul', this); 

     var itemsWidth = ul.innerWidth() - $(this).outerWidth(); 

     $('.slider', this).slider({ 
      min: 0, 
      max: itemsWidth, 
      handle: '.handle', 
      stop: function (event, ui) { 
       ul.animate({'left' : ui.value * -1}, 500); 
      }, 
      slide: function (event, ui) { 
       ul.css('left', ui.value * -1); 
      } 
     }); 
    }); 
}) 

each回調函數,this =當前DOM節點。如果你在上下文中需要它作爲jQuery對象,請使用$(this)

+0

你仍然使用'容器',它不再被定義。 – jitter 2009-12-05 00:58:48

+0

@jitter,很好的捕獲。錯過了那一個! – 2009-12-05 01:02:54

+0

這幾乎修好了!這實際上是有道理的。現在唯一的問題是它是一個滑塊,現在當您拖動它時滑塊不會跟隨鼠標。那有意義嗎?我可以讓它們互相獨立滾動,但滑塊不會隨鼠標移動。我正在使用jQuery和jQuery UI的最新版本 – jaasum 2009-12-05 01:15:05

-1

嘗試是這樣的 - 這是你的代碼轉換爲可在負載腳本來選擇性地應用插件:

<script type="text/javascript" charset="utf-8"> 
    // This replaces window.load: 
    $(function() { 
     // Matches each slider gallery and applies one plugin to each. 
     $('.sliderGallery').sliderGallery(); 
    }); 

    // Your very own jQuery plugin 
    $.fn.sliderGallery = function() { 
     var container = $(this); // $(this) is the element you applied the plugin to. 
     var ul = $('ul', container); 

     var itemsWidth = ul.innerWidth() - container.outerWidth(); 

     $('.slider', container).slider({ 
      min: 0, 
      max: itemsWidth, 
      handle: '.handle', 
      stop: function (event, ui) { 
       ul.animate({'left' : ui.value * -1}, 500); 
      }, 
      slide: function (event, ui) { 
       ul.css('left', ui.value * -1); 
      } 
     }); 
    }; 
</script> 

希望這有助於。

+0

這並沒有解決任何問題,你只是移動代碼:)你需要'this.each'循環 – 2009-12-04 23:01:32

+1

感謝這一點,但這仍然幫助我大致瞭解插件如何工作以及我將來如何使用它們:) – jaasum 2009-12-05 01:19:04

+0

啊是的 - 對不起。這會教我在喝醉的時候做stackoverflow。 – 2009-12-05 08:38:00