2016-01-29 6 views
0

Я использую фрагмент для загрузки внешних divs в элементы аккордеона Bootstrap. Первоначально div были загружены при загрузке страницы, но затем я изменил код так, чтобы они загружались при нажатии кнопки.Bootstrap аккордеон прыгает при расширении

Я использовал два разных фрагмента, чтобы это произошло, и они оба приводят к довольно резкому переходу элементов аккордеона при расширении. Однако этого не произошло, когда divs, загруженные на загрузку страницы.

Я искал решение этой проблемы, я пробовал много вещей, которые работали для других людей (например, нулевой запас и отступы или охватывающие как кнопку, так и панель-кузов внутри div), но ни один из них работал в этом случае.

Если у вас есть предложения, сообщите мне. Спасибо заранее

HTML

<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> 
    <div class="panel panel-default"> 
     <div class="panel-heading" role="tab" id="headingOne"> 
     <h4 class="panel-title"> 
      <a data-href="/path/to.html #firstdiv" class="ajax-link" data-ajaxtarget="#first" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne"> 
      Read more 
      </a> 
     </h4> 
     </div> 
     <div id="collapseOne" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne"> 
     <div class="panel-body" id="first"></div> 
     </div> 
     </div> 
    </div> 

JS/JQuery

(function($){ 
$(document).ready(function(){ 
ajaxLink(); 
linkPreventDefault(); 
}); 

function ajaxLink(){ 
$("a.ajax-link").on('click', function(event){  
    var thisLink = $(this); 
    var targetUrl = thisLink.attr("data-href"); 
    var target = thisLink.data('ajaxtarget'); 
    console.log("loading via ajax: "+ targetUrl + ",in div: "+ target); 

    $(target).load(targetUrl, function(response, status, xhr) { 
     if (status == "error") { 
     var msg = "Sorry but there was an error: "; 
     console.error (msg + xhr.status + " " + xhr.statusText); 
     }else if(status="success"){ 
     console.log("successfully loaded"); 
     //OPTIONAL: unbind the links click event and bind a new one 
     noMoreAjax(thisLink);   
    } 
    }); 
    event.preventDefault(); 
}); 
} 

function linkPreventDefault(){ 
$('a.link-prevent').click(function(event){ 
    console.log 
    event.preventDefault(); 
}); 
} 

function noMoreAjax(item){  
var linkItem = $(item); 
console.log("No more Ajax for this link"); 
linkItem.removeClass('ajax-link'); 
linkItem.addClass('link-prevent'); 
linkItem.unbind('click'); 
$(linkItem).click(function(event){ 
    console.log("Preventing after ajax"); 
    event.preventDefault(); 
}); 
} 

})(jQuery); 

(OLD JS:

$(document).ready(function(){ 
$('#accordion').click(function(){ 
    $('#first').load('/path/to.html #firstdiv'); 
}); 
}) 

)

+0

По http://stackoverflow.com/questions/28977499/bootstrap-accordion-how-to-avoid-page-scroll-when-collapse-or-expand-elements try data-href = "" –

+0

@SimonH Для по какой-то причине, как href = "", так и href = "#", прокрутите страницу вверх. Он работает только тогда, когда я вообще полностью удаляю атрибут href, хотя он дает те же результаты, что и до внесения любых этих изменений. Спасибо за ваш комментарий, хотя, конечно, было интересно узнать об этом. –

ответ

0

Вы должны расширить элемент аккордеона после получения ответа на вызов ajax. Так удалить data-toggle="collapse" href="#collapseOne" атрибутов из вашей ссылки и вызвать $('#collapseOne').collapse() в функции обратного вызова, например:

$(target).load(targetUrl, function(response, status, xhr) { 
     if (status == "error") { 
     var msg = "Sorry but there was an error: "; 
     console.error (msg + xhr.status + " " + xhr.statusText); 
     }else if(status="success"){ 
     $('#collapseOne').collapse(); 
     console.log("successfully loaded"); 
     //OPTIONAL: unbind the links click event and bind a new one 
     noMoreAjax(thisLink);   
    } 
    }); 
+0

Прежде всего, спасибо за ваш ответ. И да, это было довольно впечатляюще. Однако, когда я удаляю эти два атрибута, пользователям больше не удается заставить элементы свернуть, нажимая снова соответствующие кнопки. Есть ли что-то еще, что я могу сделать по этому поводу? Кроме того, я использую много разных аккордеонов на страницу, но кажется, что я не могу заменить #collapseOne именем класса в фрагменте. Можете ли вы сказать мне, есть ли какая-то альтернатива этому? –

+0

@ctl Я не уверен, почему вы ищете альтернативу, просто добавьте пропущенные фрагменты здесь. Я помог вам разобраться, почему он прыгает; теперь вам нужно добавить логику, которая решит, должны ли данные аккордеона быть загружены с помощью ajax или он уже сидит там (если пользователь открывает его во второй раз), и если аккордеон должен быть свернут или развернут –

+0

Аккордеон должен быть свернут без что делает невозможным для пользователей, чтобы он снова рушился после его расширения. Что касается того, когда данные должны быть загружены, ваше предложение, похоже, является хорошим способом справиться с этим. Проблема в том, что кто-то вроде меня, который мало знает о JS/Javascript, как правило, может решить, что им нужно делать, но они не всегда знают, как это сделать.Поэтому для меня это не просто вопрос логики. –

0

См рабочего образец here

я использовал setTimeout() поддельный вызов AJAX, так что вам нужно обновить эта часть, но кроме этого, все есть.

+0

Большое спасибо за ваш ответ. Я попытался реализовать его сам, но кажется, что я делаю что-то неправильно, поскольку это работает только время от времени. Не следует ли включать весь мой фрагмент JS внутри него, следует ли использовать только часть его? –

+0

1. Проверьте различия в HTML или используйте мои. 2. Используйте свой javascript, но возьмите мой обработчик событий для аккордеона. 3. Замените setTimeout() в моем коде с реальным вызовом ajax, который у вас есть. 4. Отметьте ответ, если он вам будет полезен :) –

+0

Конечно, я помету его, как только мне удастся заставить его работать, используя информацию, которую вы мне дали, я действительно с нетерпением жду этого .. :) Это просто что я все еще не могу заставить его работать, я пытаюсь настроить HTML-код, который у меня есть, чтобы оба фрагмента могли работать, но это просто кажется невозможным. На всякий случай вы хотели бы посмотреть: https://plnkr.co/edit/qoIGu1ScPjfn1nK7Lgbr?p=preview –

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