Развернуть / Свернуть текст в HTML — Javascript

#javascript #jquery #html #twitter-bootstrap

#javascript #jquery #HTML #twitter-bootstrap

Вопрос:

Я пытаюсь заставить работать javascript-код «Видеть больше» (развернуть) и «Видеть меньше» (свернуть). Я буду перебирать и вызывать этот код javascript для каждого экземпляра класса в HTML.

Это действительно работает при первом появлении на странице. Я ввел консоль.регистрирует, чтобы убедиться, что он работает правильно. т.Е. Каждый раз, когда я нажимаю «Подробнее», консоль будет печатать «Развернуть / свернуть» один раз.

Однако при каждом дополнительном экземпляре устройства (в другом фрагменте текста на странице) оно вообще не будет расширяться.

Что происходит, так это то, что во втором экземпляре консоль выводит — «Развернуть, свернуть». Таким образом, он фактически выполняет оба действия мгновенно (что означает, что он вообще не расширяется).

В третьем он печатает — «Развернуть, свернуть, развернуть, свернуть, развернуть, свернуть». Почти как экспоненциальный рост… Есть идеи?

 function showMoreLess(element) {
var showChar = 150;
var ellipsestext = "...";
var moretext = "See More";
var lesstext = "See Less";
var content = $(element).html();
if (content.length > showChar) {
    var show_content = content.substr(0, showChar);
    var hide_content = content.substr(showChar, content.length - showChar);
    var html = show_content 
                  '<span class="moreelipses">' 
                  ellipsestext
                  '</span><span class="remaining-content"><span>' 
                  hide_content   '</span>amp;nbsp;amp;nbsp;<a href="" class="morelink">' 
                  moretext 
                  '</a></span>';
    $(element).html(html);
}

$(".morelink").click(function () {
    if ($(this).hasClass("less")) {
        $(this).removeClass("less");
        $(this).html("See More");
        console.log("Collapse") // "Collapse" appears in console
    } else {
        $(this).addClass("less");
        $(this).html("See Less");
        console.log("Expand") // "Expand" appears in console
    }
    $(this).parent().prev().toggle();
    $(this).prev().toggle();

    return false;
});
 

}

Это код jQuery, который проходит через каждый класс:

 $(function () {
    $.each($(".limitedTextSpace"), function(index, value) {
        showMoreLess(value);
    });
});
 

Редактировать:

Я следовал формату Роберто Линареса и воссоздал функцию следующим образом:

 function showMoreLess(element) {
var showChar = 150;
var ellipsestext = "...";
var moretext = "See More";
var lesstext = "See Less";
var content = $(element).html();
if (content.length > showChar) {
    var show_content = content.substr(0, showChar);
    var hide_content = content.substr(showChar, content.length - showChar);
    var html = '<span class="collapsed">'   show_content 
                  ellipsestext
                  '</span><span class="expanded">'
                  content
                  '</span><a href="javascript:void(0)" class="collapsed">'
                  moretext
                  '</a><a href="javascript:void(0)" class="expanded">' 
                  lesstext
                  '</a>'
    $(element).html(html);
}
 

}

Затем я внес небольшие изменения и в другую функцию цикла:

     $(function () {
    $.each($(".limitedTextSpace"), function(index, value) {
        showMoreLess(value);
    });

    $(".expanded").hide();
    $(".expanded, .collapsed").click(function() {
        $(this).parent().children(".expanded, .collapsed").toggle();
    });
});
 

Однако теперь возникает проблема, связанная с наличием разрывов в тексте. Код интерпретирует каждый абзац одного и того же текста как разные экземпляры expand / collapse, то есть вместо одного expand / collapse для блока текста для каждого абзаца существует несколько.

Комментарии:

1. Вы отметили boostrap? Bootstrap имеет встроенный collapse getbootstrap.com/javascript/#collapse

Ответ №1:

Он вообще не расширяется во второй и последующие разы, потому что вы уже потеряли все содержимое, когда заменили его свернутым содержимым. Это происходит потому, что вы никогда не «сохраняете» временно полное содержимое в другом месте, чтобы вы могли поместить его обратно при нажатии на ссылку развернуть.

Я бы рекомендовал вам изменить свою логику javascript, чтобы поместить в HTML как свернутое расширенное содержимое, так и переключить его видимость по ссылкам.

Пример:

HTML:

 <ul>
    <li>
        <span class="expanded">Expanded HTML content</span>
        <span class="collapsed">Collap...</span>
        <a href="javascript:void(0)" class="collapsed">Expand</a>
        <a href="javascript:void(0)" class="expanded">Collapse</a>
    </li>
     <li>
        <span class="expanded">Expanded HTML content</span>
        <span class="collapsed">Collap...</span>
       <a href="javascript:void(0)" class="collapsed">Expand</a>
        <a href="javascript:void(0)" class="expanded">Collapse</a>
    </li>
     <li>
        <span class="expanded">Expanded HTML content</span>
        <span class="collapsed">Collap...</span>
        <a href="javascript:void(0)" class="collapsed">Expand</a>
        <a href="javascript:void(0)" class="expanded">Collapse</a>
    </li>
     <li>
        <span class="expanded">Expanded HTML content</span>
        <span class="collapsed">Collap...</span>
        <a href="javascript:void(0)" class="collapsed">Expand</a>
        <a href="javascript:void(0)" class="expanded">Collapse</a>
    </li>
</ul>
 

Javascript:

 $(document).ready(function() {
    $(".collapsed").hide();

    $(".expanded, .collapsed").click(function() {
        $(this).parent().children(".expanded, .collapsed").toggle();
    });
});
 

Рабочий JSFiddle: http://jsfiddle.net/susxK /

Комментарии:

1. Спасибо Роберто, который следовал тому же формату и исправил его для меня. Однако существует новая проблема, заключающаяся в том, что при наличии разрывов в блоке текста каждый абзац интерпретируется как отдельный фрагмент текста. Есть идеи?

2. Посмотрите на эту другую скрипку, которую я сделал с вашим точным javascript: http://jsfiddle.net/uQLTU/1 / Похоже, он работает со всеми видами блочных элементов в моем примере HTML. Может быть, если вы опубликуете часть своего HTML-кода, я смогу понять, почему он у вас не работает.

3. Неважно, это сработало! Не знаю, что, черт возьми, произошло. Спасибо, чувак!

4. Я внес пару изменений, так что вы можете развернуть / свернуть только при нажатии «seemore / seeless», а не весь элемент span. Но да, все работает хорошо. Еще раз спасибо.

Ответ №2:

С помощью Роберто Линареса я исправил код, чтобы он работал следующим образом:

 function showMoreLess(element) {
var showChar = 256;
var ellipsestext = "...";
var moretext = "See More";
var lesstext = "See Less";
var content = $(element).html();
if (content.length > showChar) {
    var show_content = content.substr(0, showChar);
    var hide_content = content.substr(showChar, content.length - showChar);
    var html = '<span class="collapsed">'   show_content 
                  ellipsestext
                  '</span><span class="expanded">'
                  content
                  '</span>amp;nbsp;amp;nbsp;<a href="javascript:void(0)" class="collapsed moretext">'
                  moretext
                  '</a><a href="javascript:void(0)" class="expanded lesstext">' 
                  lesstext
                  '</a>'
    $(element).html(html);
}
 

}

И в отдельной функции, когда документ будет готов:

 $(function () { // When page is loaded, run showMoreLess(value) on each instance of limitedTextSpace classes
$.each($(".limitedTextSpace"), function(index, value) {
    showMoreLess(value); 
});
$(".expanded").hide();
$(".moretext, .lesstext").click(function() {
    $(this).parent().children(".expanded, .collapsed").toggle();
});
 

});