2010-03-31 11 views
2

im пытается сделать небольшое имя в зависимости от размера контейнера элементов, вот что у меня есть;javascript summary function

function shorten_text(str, size){ 
    size = size.match(/[0-9]*/); 
    var endValue = Math.floor(Number(size)/10); 
    var number; 
    var newStr; 
    for (number = 0; number <= endValue; number++) { 
     if(str[number].length != 0) { 
      newStr += str[number]; 
     } 
    } 
    return newStr + '...'; 

} 
shorten_text('Phil Jackson', '94px'); 
// output should be 'Phil Jack...' 

То, что я, кажется, получаю undefinedundef ... может кто-нибудь увидеть, где я неправильно?

EDIT:

пересмотренный код, основанный на комментарии ниже для тех, кто погуглить для такой функции:

function shorten_text(str, size){ 
    size = parseInt(size); 
    var endValue = Math.floor(size/10); 
    if(str.length > endValue) { 
     return str.substring(0, endValue) + '...'; 
    }else{ 
     return str; 
    } 
} 

SCREEN SHOT:

screenshot http://www.freeimagehosting.net/uploads/4639663b52.gif

+0

Вы предполагаете, что каждый символ имеет ширину в один пиксель? Как это работает? – Nir

+0

Я добавил скриншот, чтобы показать. –

+0

Спасибо. Я до сих пор не понимаю, как добавить 1 символ для каждого пикселя ширины для вас, так как каждый символ имеет переменную ширину, которая, безусловно, более 1 пикселя. – Nir

ответ

3

Вы должны инициализировать newStr переменная с пустой строкой, иначе эта переменная будет содержать значение undefined, wh ич будет преобразован в строку, когда вы конкатенации, например:

var test; // at this moment the variable contains the undefined value 
test += 'foo'; 
// now test contains "undefinedfoo" 

В функции:

function shorten_text(str, size){ 
    size = size.match(/[0-9]*/); 
    var endValue = Math.floor(Number(size)/10); 
    var number; 
    var newStr = ''; 
    for (number = 0; number <= endValue; number++) { 
     if(str[number].length != 0) { 
      newStr += str[number]; 
     } 
    } 
    return newStr + '...'; 
} 

shorten_text('Phil Jackson', '94px'); // outputs "Phil Jacks..." 

Несколько комментариев:

  • Вам не нужно звонить Number(size), так как оператор деления делает принуждение типа. неявно
  • Вы можете использовать метод substring, чтобы получить часть вашей исходной строки.
  • Доступ символы строки с квадратным аксессором скобки собственности могут не поддерживаться некоторыми реализациями, вы можете использовать стандартный charAt метод (str.charAt(i))

Другого подхода, чтобы сделать то же самое:

function shorten_text(str, size){ 
    var endValue = Math.floor(parseInt(size)/10); 
    return str.substring(0, endValue) + '...'; 
} 

shorten_text('Phil Jackson', '94px'); // outputs "Phil Jack..." as expected 
+0

Большое спасибо, очень информативный. Я здесь, чтобы учиться! (и работает как шарм) –

+0

tuche, это экономит время и пространство! –

+0

Короткий shorten_text выводит немного другой ответ («Джек» вместо «Jacks») - требуется «+1», если вы хотите того же. Я собираюсь удалить свой собственный теперь лишний ответ. –

Смежные вопросы