2014-02-02 4 views
1

Я прислушался, чтобы добавить расширение и свернуть к моему следующему коду JavaScript. Мне нужно + (плюс) изображение при сведении и - (минус) изображение при расширении. Пожалуйста, помогите мне с кодом, чтобы сделать это. Пожалуйста, см. DataSource, если я нажму на часы, они будут расширяться, и часы будут отображаться, и когда я снова нажму на часы, титан исчезнет.Развернуть и свернуть JavaScript

Fiddle

var dataSource = ({ 
      "Watch": ({ 
       "Titan": ({}), 
      }) 
     }), 
    traverseObject = function (obj) { 
     var ul = document.createElement("ul"), 
      li; 

     for (var prop in obj) { 
      li = document.createElement("li"); 
      li.appendChild(document.createTextNode(prop)); 
      li.onclick = function(){alert("Hello")} 

      if (typeof obj[prop] == "object" && Object.keys(obj[prop]).length) { 
       li.appendChild(traverseObject(obj[prop])); 

      } 
      ul.appendChild(li); 
      console.log(ul); 
     } 
     return ul; 
    }; 


window.onload = function() { 
    document.getElementById("dvList1").appendChild(traverseObject(dataSource)); 
} 
+0

Можете ли вы предоставить скрипку для этого? – Foreever

+0

Удалите все '(' и ')' из этого в начале: 'var dataSource = ({" Watch ": ({" Titan ": ({}),})})' – Deryck

+0

@ user3237973 проверить мой обновленный ответ, что должно работать и для IE, а также –

ответ

1

Live jsFiddle

Я удалил ненужные скобки из вашего DataSource и добавил третий уровень для целей тестирования.

Кроме того, что я изменил был ваш onclick к

li.onclick = function(e) { 
       e.currentTarget.classList.toggle("hidden"); 
       e.stopPropagation(); 
      } 

и поместил else утверждение, что добавляет класс leaf для листовых узлов (мы не хотим видеть, минус и плюс знаки на этих узлах) ,

if (typeof obj[prop] == "object" && Object.keys(obj[prop]).length) { 
    li.appendChild(traverseObject(obj[prop])); 
} else { 
    li.classList.add("leaf"); 
} 

, а также добавлен некоторые CSS, который отображает знаки в псевдо элементах:

ul { 
    list-style: none; 
} 

li.hidden ul { 
    display: none; 
} 

li:before { 
    content: '-'; 
    width: 10px; 
    display: inline-block; 
} 

li.hidden:before { 
    content: '+'; 
} 

li.leaf:before { 
    content: ''; 
} 

li { 
    cursor: pointer; 
} 

li.leaf { 
    cursor: default; 
} 

EDIT:

IE не поддерживает classList, поэтому заменил его className. Этот solution должен работать для всех браузеров.

+0

Большое спасибо – user3237973

+0

, пожалуйста, помогите мне отсортировать этот список по алфавиту. – user3237973

+0

Я предполагаю, что вы получаете этот источник данных в результате обратного запроса? Если это так, то вам следует сортировать их на сервере. Но если вам нужно сортировать в браузере, вы можете использовать [Array.prototype.sort()] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) для сортировки источника данных на основе массивов объектов json –

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