2012-09-12 53 views
0

下面的腳本能很好地兩截斷的鏈接,並添加一個圖標類,但是, 這是太慢:使用的document.ready舉行代碼從執行UNTIL加載頁面上的所有元素。運行jQuery來更快地應用到每一個元素沒有冗餘

我刪除它,和它的作品,但它不會最後一個元素

<script> 

     jQuery.noConflict(); 

     jQuery(".resultAction").each(function(){ 

    var fileName = jQuery(this).find('a').html() 
    var fileExtension = fileName.substring(fileName.lastIndexOf('.')); 
    var nameChars= fileName.length; 
    var shorter=fileName.substring(0,10)+"..."; 
      //apply style to relative to file extension 
     if(fileExtension=="jpg"||"pdf"||"mov"){ 
     jQuery(this).find("#indicator").addClass("is" + fileExtension.slice(1)); 
     } 
      //no file extension hide the icon div "indicator" 
     if((fileExtension.indexOf('.') == -1)){ 
     jQuery(this).find("#indicator").addClass("not"); 
     } 
      //truncate text 
     if(nameChars>10){ 
      jQuery(this).find('a').text(shorter); 
     } 
     }); 


    </script> 

所以我擺脫以上。就緒的工作和重新加入這個:

<script> 
jQuery(document).ready(function(){ 
jQuery.noConflict(); 
jQuery(".resultAction:last").each(function(){ 
//-SAME CODE ABOVE-.... 
</script> 

- 注意:最後 - 當然工作 - 但它是多餘的,我想知道是否有一個更有效的方式來使這個代碼運行立即(作爲頁面加載每個元素)和完全代替運行兩個相同的腳本一個運行速度快,另一個運用到最後一個項目上。

+0

請向我們展示相關的HTML。 – jfriend00

+0

我不認爲這會導致它運行緩慢;但是,您似乎在使用類resultAction在每個元素中搜索具有指示符id的元素。這不應該是這樣,因爲id應該是獨一無二的。您很可能需要將其更改爲一個班級。 –

回答

1

通用代碼可以放在一個函數中,並在您使用它的兩個地方調用,因此只有一個代碼副本,但是從多個地方調用。

jQuery(".resultAction:last").each(processResult); 

jQuery(".resultAction").each(processResult); 

對於加快jQuery(".resultAction:last"),也有一些選項:

  1. 給最後一個ID和直接使用id獲取它。
  2. 不是在domReady上運行它,而是從<body>末尾的腳本標記中運行它。這將比domReady執行一點,並且同樣安全。
  3. 只需要對jQuery(".resultAction")進行一次查詢並保存結果。然後,您可以隨時使用整個列表或最後一個列表,而無需進一步查找DOM。
  4. 如果速度確實是一個問題,jQuery通常不是最快的方法來做事(雖然速度差異通常不會被察覺)。例如,document.getElementById("item")jQuery("#item")快10倍以上。

而且,那麼可能是與此代碼:

jQuery(this).find("#indicator") 

應該只有一個#indicator ID整個文檔中,所以你不應該需要把它限制在this上下文。所以,要麼你可以使用$("#indicator")來獲得這樣的一個對象,或者你需要使用一個類而不是一個id,因爲頁面中有多個這樣的對象。

+0

謝謝,我忘了我可以寫一個函數,並按需求調用 - 更快! – namretiolnave

相關問題