Как менять текст ссылки если блоки работают как «аккордеон»?

153
23 ноября 2018, 16:20

Есть форма с данными. При клике на ссылку, раскрывается дополнительный блок под ним. Таких полей несколько, у каждого свой блок должен открываться. При клике в любом месте, кроме раскрытого поля, это поле сворачивается. Фишка в том, что текст ссылки (которая раскрывает нужный блок) должна меняться в зависимости от видимости этого блока (с текста на крестик и обратно). Если кликать именно по этим ссылкам, то всё ок, но если поле сворачивается при клике в любом другом месте, то остается крестик. Не могу соеденить вместе эти две функции. Вот мой код https://jsfiddle.net/aq9Laaew/177752/

$(document).ready(function() {

/* Изменение текста ссылки для раскрывающихся блоков */
$(function() {
    var changeLink = $("[data-toggle=collapse]");
    $(changeLink).on("click", function (e){ 
        $(this).closest(".accordeon").toggleClass("show");
        var changeToggle = $(this).attr("aria-expanded");
        var nameLink1 =  $(this).data("show");
        var nameLink2 =  $(this).data("close");
        if (changeToggle === 'true') {
            $(this).children().html(nameLink1).removeClass('close')
        } else {
            $(this).children().html(nameLink2).addClass('close')
        };
    });               
}) /* Изменение текста ссылки для раскрывающихся блоков END */
/* Аккордеон для блоков */
$(document).mouseup(function (e){ 
    var accordeon = $(".accordeon.show"); 
    var changeToggle = $("[data-toggle=collapse]").attr("aria-expanded");
    console.log(changeToggle);
    if (!accordeon.is(e.target) 
        && accordeon.has(e.target).length === 0) { 
      $(".collapse.show").collapse('hide');
    }
}); /* Аккордеон для блоков END */  

});
Answer 1

Решила сама. Если кому надо, то вот: https://jsfiddle.net/Lpqnejw8/

/* Аккордеон для блоков */
$(document).mouseup(function (e){ 
    var accordeon = $(".accordeon.show"); 
    var changeToggle = $("[data-toggle=collapse]").attr("aria-expanded");
    if (!accordeon.is(e.target) 
        && accordeon.has(e.target).length === 0) { 
      $(".collapse.show").collapse('hide');
    }
}); /* Аккордеон для блоков END */  
$("[data-toggle=collapse]").click(changeLinkName);
});
/* Изменение текста ссылки для раскрывающихся блоков */
function changeLinkName(e) {
    var nameLink1 =  $(this).data("show");
    var nameLink2 =  $(this).data("close");
    var changeToggle = $("[data-toggle=collapse]"); /*.attr("aria-expanded","false");*/
    $('.collapse').on('show.bs.collapse', function (e) {        
        $(this).closest(".accordeon").addClass("show");
        $(this).parent().find(changeToggle).children().html(nameLink2).addClass('close')
    })
    $('.collapse').on('hide.bs.collapse', function () {
        $(this).closest(".accordeon").removeClass("show");
        $(this).parent().find(changeToggle).children().html(nameLink1).removeClass('close')
    })
}/* Изменение текста ссылки для раскрывающихся блоков END */
Answer 2

По хорошему код переписать, а так вот решение: https://jsfiddle.net/Rusic/wkvxa7b6/

var links = $("[data-toggle=collapse]");
    $.each(links, function() {
        let obj = $(this),
            tActive = obj.attr("aria-expanded"),
                tText = obj.data('show');
          obj.children()
            .text(tText)
            .removeClass('close');
    });
READ ALSO
setState не обновляет состояние

setState не обновляет состояние

Вот два компонента, при нажатии на MainWord появляется MainWordStand - окошкоНо при нажатии на крестик на этом окошке для его закрытия, не происходит...

185
анимация не работает в хроме

анимация не работает в хроме

есть такая конструкция

151
Контент поверх полноэкранного видео в ios

Контент поверх полноэкранного видео в ios

2 день мучаюсь с проблемойЕсть проект - видео-квест

136
Views выбор формата отображения

Views выбор формата отображения

Существует, страница Index в которой вызывается частичное представление

176