Решение проблем с jQuery и неупорядоченным списком Загрузка
Я строю очень упрощенное неупорядоченное дерево списков в XHTML с несколькими уровнями глубины. Это работает так, что вы щелкаете по родительскому узлу, и он использует API-интерфейс jQuery.load (), чтобы вызвать AJAX-запрос к серверу, чтобы узнать, есть ли у этого узла дочерние узлы. Если это так, он вставляет эти узлы внутрь. Когда вы снова щелкаете по родительской ссылке, она выполняет.remove(), чтобы удалить потомков.
Все отлично работает в Safari, Chrome и FireFox. Но в IE6, IE7, IE8 и Opera он ломается.
В IE, код работает при расширении родителей, чтобы показать детям. Но когда я щелкаю родителей, чтобы снова спрятать детей с помощью.remove(), он входит в детей и удаляет их детей, а не себя.
В Opera код расширяется, но затем расширяет поля по мере его расширения. Затем при удалении возникает та же проблема, что и в IE.
Что может быть причиной этой странности?
Образец выложен здесь: http://volomike.com/downloads/sample1.tar.gz
1 ответ
ОК, Воломике! Я посмотрел на ваш код и было несколько проблем:
Во-первых, когда вы используете load
, он не заменяет выбранный узел, он заменяет его содержимое.
Итак, вы вызываете нагрузку на li
но и возвращая то же самое li
в вашем результате AJAX. Впоследствии вы получаете это:
<li id="node-7">
<li id="node-7">
...
Кроме того, вы закрывали его с двумя </ul>
теги в вашем ajax.php
линия 38
вместо одного ul
и один li
,
Итак, если вы исправите эти вещи, он должен начать работать. Тем не менее, я бы подошел к тому, что вы делаете, совершенно по-другому. Я надеюсь, что это помогает вам:
HTML
<ul id="tree">
<li id="node-1"><a href="#">Cat 1</a></li>
<li id="node-7"><a href="#">Cat 7</a></li>
</ul>
PHP
// You'll have to write the code, but get it into this format:
// Basically push each row of a `mysql_fetch_array` into a new array
$ret = array(
array('2', 'Cat 2'),
array('3', 'Cat 3')
);
// Then return it to the browser like this:
echo json_encode( $ret );
JS / JQuery
$(function(){
$("ul#tree li a").live('click', function(e){
e.preventDefault();
var $li = $(this).closest('li');
if( $li.find('ul').length ){
// Remove UL if it exists
$li.find('ul').remove();
} else {
// Get the ID
var id = $li[0].id.replace('node-','');
// Get the JSON for that id
$.getJSON('/ajax.php', { id: id }, function( data ){
// If data is not empty and it is an array
if(data && $.isArray( data )){
// Build our UL
var $ul = $("<ul></ul>");
// Loop through our data
$.each(data, function(){
// Build an LI, use `text()` to properly escape text
// then append to the UL
$('<li id="node-' + this[0] + '"><a href="#"></a></li>')
.find('a').text(this[1])
.end().appendTo($ul);
});
// Finally, add the UL to our LI
$ul.appendTo($li);
}
});
}
});
});