Сократить простой текст Div

Я использую сервис под названием "embedly", который показывает мои каналы. Я пытаюсь сократить текст этого канала, поэтому я попытался:

$('.description').html(
     function(){
         return $.trim($(this).html())
                .substring(0, 100)
                .split(" ").slice(0, -1)
                .join(" ") + "...";}
);

Я поместил это в готовый документ, а также в "window.load", но, похоже, ничего не работает. Вот пример: http://jsfiddle.net/2VBSX/1/

3 ответа

Решение

Это заняло у меня очень много времени, чтобы выяснить, но я думаю, что лучшее, что вы можете сделать, это дать элементам секунду для загрузки в DOM, а затем запустить вашу функцию: http://jsfiddle.net/2VBSX/5/

$('div.newscontainer').embedly({
    key:':e0a98aba95ef11e09dcd4040d3dc5c07'
}).hide();

setTimeout(function() {
    $('div.newscontainer').show().find('.description').html(
        function(){
            return $.trim($(this).html())
            .substring(0, 100)
            .split(" ").slice(0, -1)
            .join(" ") + "...";
        }
    );
}, 1000);

HTML-код Jquery не принимает функцию в качестве аргумента, а только простой HTML-код (строка). Чтобы сделать то, что вы хотите сделать, используйте .each():)

Исправление: как указано в комментарии ниже, мой код правилен, но.html() действительно принимает функцию в качестве аргумента в форме $(...).html(function(index, oldhtml));, что позволяет получить доступ непосредственно к части HTML. (Спасибо @Raminson за указание на это)

До наблюдения @ Raminson мой код был:

$('.description').each(
     function(i,e){
         $(e).html(reduce($(e).html()));}
);

function reduce(s)
{
         return s.substring(0, 100)
                .split(" ").slice(0, -1)
                .join(" ") + "...";
}

С исправлением первая часть становится (все еще используя reduce() функция):

$(".description").html(function(i,s) { return reduce(s); });

Итак, мой другой ответ недействителен, потому что ОП не упомянул, что все элементы были созданы на лету, поэтому они не могут быть сопоставлены классическим способом.

Если изменения прикреплены к подходящему событию (например, нажмите), то было бы легко использовать делегатов с .on(), поскольку они действительны и для новых элементов, вставленных в DOM. Но, увы, это не тот случай, мы должны воздействовать на создание элемента.

Одним из решений будет @ChrisClower (таймер, регулярно опрашивающий страницу на предмет новых элементов).

Другое решение - использовать плагин LiveQuery: http://docs.jquery.com/Plugins/livequery

Тогда все было бы просто:

$(".description").livequery(function() {  $(e).html(reduce($(e).html())); });

 function reduce(s)
{
     return s.substring(0, 100)
            .split(" ").slice(0, -1)
            .join(" ") + "..."; 
}
Другие вопросы по тегам