【问题标题】:Optimization of jQuery SlideshowjQuery幻灯片的优化
【发布时间】:2012-09-16 08:51:24
【问题描述】:

下面的代码用于幻灯片放映。我想优化此代码,并希望与 SO 联系以尝试获得一些帮助。我知道我正在使用的这些选择器正在工作,但我很好奇是否有更有效的方式来编写我的画廊。我经常写这些相同的情况,想知道其他人是否觉得我做得对。

我只是在寻找有关格式的整体建议,以及优化我的 JS 以提高性能以及 DRY 代码方法。看看其他人如何编写类似的代码有助于我磨练自己的技能。

标记

  <a id="next">next</a><a id="prev">prev</a>
    <ul id="thumbnails">
      <li><a href="/path/to/src"><img src="50x50.jpg"></a></li>
      <li><a href="/path/to/src"><img src="50x50.jpg"></a></li>
      <li><a href="/path/to/src"><img src="50x50.jpg"></a></li>
    </ul>
   <img id="main-image" src="path/to/src">         

JS

$("#thumbnails a").click(function(e){      
  e.preventDefault();

  var $this = $(this),
      thesrc  = $this.attr('href'),
      desc = $this.attr('alt');    

  $this.addClass('current');
  $this.parent().siblings().children('a').removeClass('current');

  $("#main-image").fadeOut(400, function(){
    $('<img/>').attr('src', thesrc).load(function(){
      $("#main-image").attr('src', this.src).fadeIn(400);
      $("#caption").text(desc);
    });
  });                            
});

$("#next").click(function(e){
   e.preventDefault();     
   $('.current').parent().next().children('a').trigger('click');
});                                                                          

$("#prev").click(function(e){
  e.preventDefault();       
  $('.current').parent().prev().children('a').trigger('click');      
});      

【问题讨论】:

标签: javascript jquery optimization jquery-selectors


【解决方案1】:

jsBin demo

HTML:

  <p>
     <a id="prev">prev</a>
     <a id="next">next</a>    
  </p>
        
   <div id="thumbnails">
      <img src="1.jpg">
      <img src="2.jpg">
      <img src="3.jpg">
   </div>
  
  <div id="main-img-container">
       <div id="main-img"></div>
  </div>

基本 CSS:

#thumbnails img{
  height:30px;
}
div#main-img-container{
  height:200px;
  background: #eee url(loading_transparent.gif) no-repeat center center;  
}
div#main-img{
  width:100%;
  height:100%;
  background: transparent no-repeat center center;
  background-size:cover; 
}
#next, #prev{
  cursor:pointer;
  background:#eee;
  padding:4px 10px;
  -webkit-border-radius:5px;
          border-radius:5px;
}

jQuery:

var $imgs = $('#thumbnails img');
var imgsN = $imgs.length;
var $main = $('#main-img');
var c = 0; // a 'current' counter

function loadImage(){
  c= c===-1? c=imgsN-1 : c%imgsN; 
  var getSrc = $imgs.eq(c).attr('src');  
  $main.stop().fadeTo(200, 0.7, function(){ // just to make loading a bit visible :)
     $('<img>').attr('src', getSrc).load(function(){
       $main.css({backgroundImage: 'url('+ this.src +')'}).fadeTo(300,1);        
     });
  });  
}
loadImage(); // first kick! :)

$imgs.click(function(){  
  c = $(this).index(); 
  loadImage();  
});

$('#prev, #next').click(function(){
  var myID = this.id=='next' ? c++ : c--;
  loadImage();
}); 

【讨论】:

  • 谢谢 roXon,这正是我想要的,而且非常有意义。只是另一个问题。为了全局命名空间,您建议如何处理全局变量?
  • @jnolte 我建议你分配类型名称var。仅使用 E.g: varname = 而不是 var varname = 并没有错,唯一的区别是,如果您在 function 范围之外定义变量,则可能会特别遇到 Xscript 变量冲突。所以只要使用var varname =,除非你试图覆盖JS内存中的那个变量,而不是在函数中使用varname = something new
  • @jnolte 如果你更喜欢用逗号分隔你的变量, 非常欢迎你这样做。我也喜欢这样,但是对于一些新程序员(很多人来这里寻求答案)来说,这可能是一个额外的头痛,尽管有三元运算符哈哈所以我使用了 var var var :)
  • 非常感谢。这正是我一直在寻找的结果。只是想学习更有效的方法来编写我经常使用的代码并在此过程中学习一点:)
【解决方案2】:

优化美化:

e.preventDefault()
var $this = $(this),
    thesrc = $this.attr('href'),
    desc = $this.attr('alt')
    $this.addClass('current')
    $this.parent()
        .siblings()
        .children('a')
        .removeClass('current')
    $("#main-image").fadeOut(400, function () {
        $('<img/>').attr('src', thesrc)
            .load(function () {
            $("#main-image").attr('src', this.src)
                .fadeIn(400)
            $("#caption").text(desc)
        })
    })
    })
    $("#next").click(function (e) {
        e.preventDefault()
        $('.current').parent()
            .next()
            .children('a')
            .trigger('click')
    })
    $("#prev").click(function (e) {
        e.preventDefault()
        $('.current').parent()
            .prev()
            .children('a')
            .trigger('click')
    })

【讨论】:

  • 嗨@randy 我正在寻找更多优化。美化在旁观者的眼中。我尽可能喜欢单行格式。
  • jsfiddle.net/rkSLk ... 并单击按钮 [JSLint] JS 解释器遇到了困难。 AFAIK
  • 所有分号怎么了?它们在 javascript 中不是必需的,但使用它们是一种很好的做法,并且有助于提高可读性。另外,就优化而言,有一些地方可以使用 vanilla javascript,而且我看到了重复的选择器。
  • @MrOBrian 你忘了说:创建一个缩小插件也会导致手指疼痛
  • 更不用说您忽略了(OP 也是如此)缺少的第一个函数行
猜你喜欢
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 2011-01-01
相关资源
最近更新 更多