2012-07-27 74 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

相關問題