2012-07-27 76 views
0

请考虑以下功能。这将在每次浏览器调整大小时调用,并且每次我想将this.original_ul的相同初始值传递给此函数doLayout()。它在一个初始化函数内只能单独计算一次。现在正在发生的事情是第二次被调用时,对$ul变量的更改也反映在this.original_ul上。我怎样才能防止这种情况?如何初始化一次并将同一个值一次又一次地传递给另一个函数?

doLayout : function() { 
    alert('doLayout'); 
    var size, $ul, $lis, loop, i; 
    size = this.computeElesPerCol(); 
    $ul = this.original_ul; // I wanna preserve this between calls 
    $lis = $ul.children().filter(':gt(' + (size - 1) + ')'); 
    loop = Math.ceil($lis.length/size); 
    i = 0; 

    $ul.css('float', 'left').wrap("<div style='overflow: hidden'></div>"); 

    for (; i < loop; i = i + 1) { 
     $ul = $("<ul />").css('float', 'left').append($lis.slice(i * size, (i * size) + 4)).insertAfter($ul); 
     $ul.css("list-style","none"); 
    } 
    } 

编辑:this是JavaScript对象WebFloatLayout其中基本上没有每次浏览器的尺寸调整时间取决于可用的高度的多列布局的参考。初始输入是一个<lis>的长列表,单个<ul>。下面是它如何被初始化:

 initialize:function() { 
    var webFloatLayout = this; 
    //call super parent initialize which will set the main dom element of component 
    ec.comp.Component.prototype.initialize.call(this); 
    var innerDivId = this.id + "_inner"; 
    innerDivId = innerDivId.replace(new RegExp(ec.config.separator, "g"), "\\" + ec.config.separator); 
    $(document).ready(function() { 
     webFloatLayout.original_ul = $("#" + innerDivId).find(">:first-child"); 
     webFloatLayout.original_ul.css("list-style","none"); 
     webFloatLayout.layout(); 
    }); 
    }, 
+0

没有改变 “original_ul” 属性中的代码。它是如何设置的?它是什么? – Pointy 2012-07-27 12:19:13

+0

也调用“调整大小”事件的代码将导致非常糟糕的性能。浏览器在用户拖动窗口句柄时会非常频繁地触发“调整大小”,并且对每个事件进行DOM操作将非常缓慢。 – Pointy 2012-07-27 12:21:56

+0

@我们通过setTimeout来处理这个问题,以避免始终开火 – Geek 2012-07-27 12:24:58

回答

2

尝试clone方法:

$ul = this.original_ul.clone(); 
+0

这是应用每一个变化克隆和变化没有得到更新到原始的 – Geek 2012-07-27 12:48:41

+1

@Geek:“... $ ul变量的变化也反映在this.original_ul上,我怎么可能阻止这个?” - 这不正是你要求的吗? – sje397 2012-07-27 12:50:26

相关问题