【问题标题】:Isolating jQuery to only contained elements将 jQuery 隔离为仅包含的元素
【发布时间】:2009-12-04 22:36:57
【问题描述】:

我一直在寻找一段时间,但我对 JQuery 和 javascript 太陌生了,无法弄清楚我哪里出错了。任何帮助将不胜感激。我有下面的脚本,它适用于一个元素。如何修改它以使用多个元素?如果页面上有多个元素,则滑块将滚动所有内容,而不仅仅是一个容器中的元素。我知道从技术上讲,我可以为每个方法创建新变量和新类名,但这很麻烦,我知道必须有更聪明的方法。

<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>

【问题讨论】:

    标签: jquery slider


    【解决方案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)

    【讨论】:

    • 你仍然使用container,它不再被定义了。
    • @jitter,很棒的收获。错过了!
    • 这几乎修复了它!这实际上很有意义。现在唯一的问题是它是一个滑块,现在拖动它时滑块不会跟随鼠标。那有意义吗?我可以让它们彼此独立滚动,但滑块不会随鼠标移动。我正在使用最新版本的 jQuery 和 jQuery UI
    • 在做一些研究时,我意识到 .slider 是 jquery UI 中的一个函数。它似乎正在以应有的方式工作,只是它没有用鼠标移动句柄 div。是我的语法错误还是可能是 CSS 问题?不确定(在这方面还是个新手)。
    • @jassum 如果您将代码发布到某处并粘贴链接,我可以为您查看。
    【解决方案2】:

    试试这样 - 这会将您的代码转换为插件,可以有选择地应用在加载脚本中:

    <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>
    

    希望这会有所帮助。

    【讨论】:

    • 这没有解决任何问题,你只是移动了代码:) 你需要 this.each 循环
    • 谢谢你,这仍然帮助我大致了解插件的工作原理以及我将来如何使用它们:)
    • 啊,是的 - 很抱歉。那会教我在喝醉的时候做stackoverflow。
    猜你喜欢
    • 2014-12-05
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多