2014-10-10 60 views
2

我有一個功能可以在標籤包裝時縮短某些詞(以適應各種分辨率)。我的功能正在工作,但我認爲它可以簡化...只是我不知道如何。隨着我在這裏添加更多的詞語,重複可以很快失控。我可以將長單詞/短單詞放在一個數組中,並且一次性提供所有內容嗎?我無法讓小提琴工作(儘管它在我的項目中工作),但是在這裏你走了。 http://jsfiddle.net/wucd1mws/1/在此先感謝!簡化替換特定單詞的工作函數?

if ($('label').height() > 20) { 
    alert('Text wrapped'); 

    var numtext = $('label:contains("Number")') 
    if (numtext) { 
     numtext.each(function() { 
      $(this).html($(this).text().replace('Number', '#')); 
     }); 
    } 

    var pertext = $('label:contains("Percent")') 
    if (pertext) { 
     pertext.each(function() { 
      $(this).html($(this).text().replace('Percent', '%')); 
     }); 
    } 

    var invtext = $('label:contains("Invoice")') 
    if (invtext) { 
     invtext.each(function() { 
      $(this).html($(this).text().replace('Invoice', 'Inv')); 
     }); 
    } 

    // etc... 
} 

我在想這很可能是縮短功能的第一步......現在餵養長/短的單詞對。

if ($('label').height() > 32) { 
    var long = "Number"; 
    var short = "#"; 

    var labelwrap = $('label:contains('+ long +')') 
    if (labelwrap) { 
     labelwrap.each(function() { 
      $(this).html($(this).text().replace(long, short)); 
     }); 
    } 
} 
+1

你剛纔說「*重複*」嗎?我聽到「循環」... – Bergi 2014-10-10 12:45:35

+0

例如,請嗎? – triplethreat77 2014-10-10 12:46:56

+0

嗯,你剛剛編輯了這個循環的主體到你的問題。現在你只需要遍歷'long''short'對的結構(不管它是一個數組的數組還是一個簡單的鍵值對象) – Bergi 2014-10-10 12:49:34

回答

1

這是更加優化的w AY以任何方式:

var short_trans = { 
    'Percent': '%', 
    'Number': '#', 
    'Invoice': 'Inv', 
    'Amount': 'Amt', 
    'Shipping': 'Ship', 
    'Production': 'Prod', 
    'Allocated': 'Alloc', 
    'Complete': 'Comp', 
    'Manager': 'Mgr' 
} 

$('label').each(function(){ 
    if ($(this).height() > 20) 
    { 
     var words = $(this).text().split(' '); 
     for (var i in words) 
     { 
      if (short_trans[words[i]]) 
      { 
       words[i] = short_trans[words[i]]; 
      } 
     } 

     $(this).text(words.join(' ')); 
    } 
});  

我們一次循環任何label標籤,檢查是否height > 20,然後split文成字循環的每個單詞,並檢查是否縮短版本的存在,如果是更換

http://jsfiddle.net/wucd1mws/2/

3
//objects can be used for hash lookups in javascript 
var replaceValues = { 
    'percent': '%', 
    'number': '#' 
    //etc. 
} 

var html = $('label').html(); //get the html of your element 
for (var index in replaceValues) { 
    if (html.indexOf(index) != -1) { //check if substring is present 
     html.replace(index, replaceValues[index]); //if so replace with alt value 
    } 
} 

您的初始條件檢查內部將這個。

編輯:舊版瀏覽器沒有String.prototype.indexOf,我寫的替換過程區分大小寫。

+0

你能編輯你的上面的例子喂多個對嗎?這些對不會混淆在一起?百分比不應該是# – triplethreat77 2014-10-10 12:52:12

+0

它們不會混淆,因爲他構建的內容像Dictionary對象一樣工作。它是鍵('%')和值('%')之間的1:1關係 – guildsbounty 2014-10-10 12:53:41

+0

您可以在該對象中填充任意數量的逗號分隔的名稱/值對,該循環將替換任何發生的第一個第二,所以'百分比'變成'%','數字'變成'#'等。因此,循環查看所有對象的索引('''''','數'等),並用'index'處的對象'replaceValues'替換字符串出現。Google dictionary/hashtable/associative array to get a feel對於概念 – 2014-10-10 12:58:57

2

下面的代碼:

<script type="text/javascript"> 
$(document).ready(function(){ 
    truncateLabels("label"); 
}); 

function truncateLabels(element){ 
    var element_max_height = 20; 
    var arr = []; 
    arr[0] = ["Number", "#"]; 
    arr[1] = ["Percent", "%"]; 
    arr[2] = ["Invoice", "Inv"]; 

    if($(element).length){ 
     if($(element).height() > element_max_height){ 
      for(var i=0; i<arr.length; i++){ 
       $(element + ':contains("' + arr[i][0] + '")').each(function(){ 
        $(this).html($(this).text().replace(arr[i][0], arr[i][1], "gi")); 
       }); 
      } 
     } 
    } 
} 
</script> 

這將在所有的瀏覽器。

此外,我不明白你爲什麼依靠元素的高度。

如果要截斷的標籤,你可以使用下面的庫:trunk8

$(".truncate").trunk8({lines:1}); 
$(".truncate2").trunk8({lines:2}); 
$(".truncate3").trunk8({lines:3}); 
+0

我依靠高度,因爲我只想截斷,如果它包裝(所以高度擴大)。謝謝你的解決方案,很好地工作 – triplethreat77 2014-10-10 13:01:35

+0

使用「Array()」在JavaScript中創建一個新的數組很好,我更新了代碼。 「不會被」#ing「取代,我使用RegExp只過濾需要替換的文本,我還添加了一個標誌來刪除區分大小寫。 – 2014-10-10 13:41:47

+0

@JaredSmith using'new Array( )'或'[]'在這個特定的代碼中並不重要,因爲變量完全一樣在這個腳本中不會被覆蓋。我清理/優化了OP的代碼,這是重要的。你真的不必從頭編碼整個事情,並推動OP來修改他自己的腳本文件。簡單的問題需要一個簡單的答案。 – 2014-10-10 13:48:18

2

簡短而親切的版本使用jQuery和文本元素的數組

var labelTextArr=[ 
    ['Number', '#'], 
    ['Percent', '%'], 
    ['Invoice', 'Inv']   
    ]; 
var maxHt = 20 

$.each(labelTextArr, function(i, arr){  
    $('label:contains('+arr[0]+')').html(function(_, html){  
     return $(this).height() > maxHt ? html.replace(arr[0], arr[1]) : html; 
    });   
}); 

DEMO

+0

如果標籤包裝,你可以修改它嗎?我只想在文本不再適合正常高度時進行替換。 – triplethreat77 2014-10-10 13:06:07

+0

我剛剛做了,看到更新的代碼和ddemo – charlietfl 2014-10-10 13:07:44

+0

我真的很喜歡你的簡短而甜蜜的例子,但我仍然遇到一些問題。查看已更新。 http://jsfiddle.net/hnx6bgag/4/ – triplethreat77 2014-10-10 13:13:57