2016-05-27 1 views
0

Итак, я пытаюсь выполнить итерацию по классу объектов jQuery аккордеона, проверить, какие из них открыты, добавить их в массив, затем (после сброса аккордеонов) снова открыть аккордеоны, которые были открыты раньше. Это кажется очень простым вопросом, и я извиняюсь, но в моих поисках кажется, что вопросы касались только итерации с использованием jquery вообще, а не для итерации по массивам объектов jquery. Я просто не мог найти ответ.Динамическое открытие массива jQuery-аккордеонов

Это то, что у меня есть, что по какой-то причине не работает. Сначала создается массив уже открытых аккордеонов.

 $(".accordionClass").each(
      function(){ 
       if($(this).accordion("option", "active") !== false) { 
        activeArray.push($(this)); 
       } 
      } 
     ); 

Это похоже на работу. По крайней мере, activeArray.length дает правильное количество объектов.

Затем я попытаюсь открыть все аккордеоны в этом массиве позже, после того как они были повторно инициализированы.

$.each(activeArray, 
     function(){ 
      $(this).accordion({ active: 0 }); 
     } 
    ); 

И не кубики. Они не открываются. Есть идеи?

+1

как активный массив уже содержит объект jquery .. вы можете это сделать .accordian ({active: 0}). но лучшие решения позволят, как было предложено, сохранить объект DOM в массив вместо объекта jQuery. Надеюсь, вы не воссоздаете объекты DOM? – Ankit

ответ

0

Решение Вопрос

В вопросе, как написано, вы подталкивают объекты JQuery ($(this)) в массиве, читая их, а затем оборачивать объекты в другой селектор JQuery.

Вместо этого вы должны просто нажать на свой собственный объект DOM, this.


Решение проблемы

Конкретная проблема здесь (содержится в комментариях по этому ответу, а не сам вопрос) в том, что объект разрушается, а затем аналогичный объект является (из той же разметки). Это, как правило, плохая практика, но это также приводит к проблеме в вопросе: Объект, на который ссылается this, введенный в массив, больше не существует к моменту его считывания.

Вместо этого вы должны нажать this.id, а затем использовать jQuery для повторного выбора копии с помощью $('#'+this).

+0

Еще ничего. Я также попробовал пару других способов открытия, таких как '$ (this) .accordion (« option »,« active », 0);' без результата, поэтому я действительно не уверен, что проблема является. –

+0

Извините, я больше не могу помочь; Я аф. Попробуйте изучить содержимое объекта с помощью JSON.stringify. И попробуйте открыть все аккордеоны (или только один конкретный), чтобы найти правильный способ их открытия. – Kittsil

+0

Хмм-а-а. Итак, 'JSON.stringify (activeArray);' дает '[{}, {}, {}]' когда сделано в массиве, который был заполнен только с помощью этого 'this'. Когда вместо этого заполняется '$ (this)', stringify дает '[{" 0 ": {}," context ": {}," length ": 1}, {" 0 ": {}," context ": { }, "длина": 1}, { "0": {}, "контекст": {}, "длина": 1}] '. Должен признаться, я не знаю достаточно о JSON или jquery, чтобы знать, насколько они ожидаются или полностью сломаны. Между тем, получить все аккордеоны для открытия было довольно просто, используя '$ (". AccordionClass ").каждый ( \t \t \t функция() { \t \t \t \t $ (это) .accordion ({активен: 0}); \t \t \t} \t \t); 'Таким образом, кажется, что проблема заключается в массиве. –