jQuery Accordion активен при загрузке документа вместо щелчка, несмотря на наличие активного false

#javascript #jquery #ruby-on-rails #jquery-ui-accordion

#javascript #jquery #ruby-on-rails #jquery-ui-accordion

Вопрос:

Я использую jQuery accordion, который содержит вложенные аккордеоны, которые отлично работали, когда у меня были они исключительно в HTML. Но в моем случае мне приходится загружать вложенные аккордеоны в jQuery, и это предотвращает активацию аккордеона только при нажатии. Аккордеон уже открыт при загрузке страницы. Я также попытался поместить аккордеон последним в JS, и это все равно не сработало. Фрагмент кода:

HTML/ERB:

 <% @year.each do |y| %> 
<div class="accordion" id="years">
  <h3 class="ui-accordion-header year"><a href="#"><%= y.date %></a></h3>
</div>
<% end %>
  

JS:

 var months = [];
var loadURL = "stats/show";

$("div.accordion").accordion({
         collapsible: true,
         active: false,
         autoHeight: true,
         event: "click"
});  


$.getJSON(loadURL, function(data){
  //parse data and place in empty arrays
  for(var key in data.month){
     months.push(data.month[key]);
  }

  //give each year tab an index number
  $('h3.year').each(function(index){
      $(this).attr('id', 'ui-accordion-years-header-'   index);
  })

  for(var i = 0; i < months.length; i  ){
    //create and append month container to each year tab
    $("#ui-accordion-years-header-"   i).after("<div id='months"   i   "' class='months accordion ui-accordion ui-widget ui-helper-reset ui-accordion-content ui-widget-content'></div>");  


    for (var j = 0; j < months[i].length; j  ){
        //parse each month of the year and place month tabs in month container
        var accordion_month = '<h3 class= "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" role="tab" id="months_tab'   j   '" aria-controls="ui-accordion-1-panel-0" aria-selected="false" tabindex="0"><a href="#" name='   months[i][j]   '>'    months[i][j]   '</a></h3>';


        $("#months"   i).append(accordion_month);
    }
  }
}
  

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

1. Вы пробовали помещать accordion внутрь getJSON после всех инструкций в этой функции?

2. Это сработало. Последняя строка внутри инструкции getJSON. Спасибо.

3. Я сделаю это ответом…

Ответ №1:

Поместите аккордеон внутрь $.getJSON() .

То, что вы сделали, добавлено аккордеоном перед получением данных.

Таким образом, аккордеон пуст.

Затем вы пытаетесь получить данные…

Таким образом, accordion не выполняет его без данных.

Таким образом, помещение accordion inside $.getJSON после всех инструкций делает все доступным для accordion.

Ответ №2:

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

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

1. Я пробовал это. Я поместил аккордеон в последнюю строку, и он все равно не сработал.

2. Тогда ваш HTML неверно сформирован. Опубликуйте jsfiddle или его демонстрацию в действии.