2011-08-13 49 views
0

请参阅我的脚本在这里:LIVE EXAMPLEjQuery函数 - 难以理解的行为

有我注意到一个难以理解的行为。

的Onload 'All'有3个选项明显 - 但是当你切换到'logo'和回'all'我们有4

为什么?第一个标签中应该有4个项目。

如何进行脚本工作:

  • onload事件 - 我已经定义了我们的var filterClass = "all";是所有这意味着,只显示li'all'类。
  • 当您选择一些正面的顶部菜单 - 它正在它的类,并且使用相同的类(“礼”具有多类)
  • 上的每一个变化发现li我们运行CreateTabs功能基本上检查有多少个“礼”我们有,并在制表符(每个选项卡上4)。

的Onload素文字 - 这CONTROLES类:

$('#portfolio-items li').CreateTabs(); 
var filterClass = "all"; 

$('.portfolio-filter li a').click(function() { 


    $('.portfolio-filter > .selected').prop('class', ''); 
    $(this).parent('li').addClass('selected'); 

    filterClass = $(this).attr('class'); 

    $('#portfolio-items li').hide(); 
    $('#portfolio-items li.' + filterClass).show(); 
    $('#portfolio-items').CreateTabs(filterClass); 

}); 

CreateTabs脚本:

(function($) { 

$.fn.CreateTabs = function(filterClass) { 

    var CoundNumberOfDivs = $('#portfolio-items li:visible').length; 
    $('.pagination li a').hide(); 
    if (CoundNumberOfDivs <= 4) { 
     return false; 
    } 
    else { 
     var num = Math.ceil(CoundNumberOfDivs/4); 
     $('.pagination li a:lt(' + num + ')').show(); 
     $('#portfolio-items li').hide(); 
     if (filterClass === undefined) { 
      $('#portfolio-items li:lt(4)').show(); 
     } else { 
      $('#portfolio-items li.' + filterClass + ':lt(4)').show(); 
     } 
    } 

}; 
})(jQuery); 

的Onload脚本CONTROLES TABS

$('ul.pagination li a').click(function(event) { 
    $('ul.pagination li .active').removeClass('active'); 
    $(this).addClass('active'); 

    var PI = $('#portfolio-items li' + (filterClass !== undefined) ? '.' + filterClass : ''); 
    $('#portfolio-items li').hide(); 


    if ($(this).hasClass('href-1')) { 
     PI.slice(0, 4).show(); 
    } 
    else if ($(this).hasClass('href-2')) { 

     PI.slice(4, 8).show(); 
    } 
    else if ($(this).hasClass('href-3')) { 
     PI.slice(8, 12).show(); 
    } 
    else if ($(this).hasClass('href-4')) { 
     PI.slice(12, 16).show(); 
    } 
    else if ($(this).hasClass('href-5')) { 
     PI.slice(16, 20).show(); 
    } 
    else if ($(this).hasClass('href-6')) { 
     PI.slice(20, 24).show(); 
    } 
    else if ($(this).hasClass('href-7')) { 
     PI.slice(24, 28).show(); 
    } 
    else if ($(this).hasClass('href-8')) { 
     PI.slice(28, 32).show(); 
    } 
    else if ($(this).hasClass('href-9')) { 
     PI.slice(32, 36).show(); 
    } 
    event.preventDefault(); 
}).filter(':first').click(); 
+3

直播链接是一个伟大的*辅助*一个问题,但总是张贴有关代码*也在问题*中。两个原因。 1.人们不应该遵循链接来帮助你。 2. StackOverflow不仅适用于您,而且适用于将来也有类似问题的其他人。外部链接可以被移动,修改,删除等。通过确保相关代码在问题中,我们确保问题(及其答案)在合理的时间段内保持有用。 –

+0

如果您转到徽标页面2,然后单击“全部”而不返回到页面1,则会返回此行为。 –

回答

1

看着 the jQuery .slice() documentation

指数再次从零开始;范围扩展到 ,但不包括指定的索引。

因此,举例来说:

if ($(this).hasClass('href-1')) { 
    PI.slice(0, 4).show(); 
} 

should be

if ($(this).hasClass('href-1')) { 
    PI.slice(0, 5).show(); 
} 

编辑

丹尼斯绝对正确,我不能算。你被切片上错误的事情,因为不是与你的括号的使用不够明确到:

$('#portfolio-items li' + (filterClass !== undefined) ? '.' + filterClass : ''); 
// vs 
$('#portfolio-items li' + ((filterClass !== undefined) ? '.' + filterClass : '')); 

This solves a number of bugs in a number of places,其中大部分存在,因为有你如何渲染“页”断续的选择时一个类别,以及选择一个页码时。

  • 当页码点击(并在页面加载,由于你的.filter(':first').click()),这个bug会表现。

  • 但是,点击某个类别时,一个不同逻辑调用— $('#portfolio-items li:lt(4)').show() —它不会出现此问题。

我会考虑一个更强有力的高层次的设计,在界面的“状态” 一个地方跟踪和重新呈现在必要时。

+0

这不是正确的答案。您正在使用切片从选择中获取5个项目,因为第一个项目是选项卡本身。这是因为选择器由于括号/操作顺序而被覆盖:请参阅我的答案。 – Dennis

+0

@丹尼斯:你说得对。我关于设计问题的观点。 –

+0

@新用户:为了公平,你应该接受丹尼斯的回答! –

1

你有括号的问题,这应该为你工作:

var PI = $('#portfolio-items li' + ((filterClass !== undefined) ? ('.' + filterClass) : '')); 

您在前面已经获得选择.all这是选择,即使你的标签,搞乱你的数组索引,可以在这里显示:

var filterClass = "all"; 
var selector = '#portfolio-items li' + (filterClass !== undefined) ? '.' + filterClass : '' 
console.log(selector); //prints ".all", which is clearly not the selector you are going for 

的jsfiddle的好措施:http://jsfiddle.net/DmFmM/60/