Я думаю, что инструменты разработчика Chrome могут помочь вам определить, какой click
слушатель вам нужен, поэтому откройте свою страницу в браузере Google Chrome, затем щелкните правой кнопкой мыши (для Windows) или дважды нажмите на сенсорной панели ( Mac Os), затем:
Inspect
в контекстном меню Sources
Event Listeners Breakpoints
Mouse
и отметьте click
и mousedown
события Вы можете найти больше информации в Google Chrome Developer Tools
Я понял это, вот решение (simplifed):
$iterator = new RecursiveIteratorIterator(
new Site_Node_List(array($root)),
RecursiveIteratorIterator::SELF_FIRST);
$sides = array();
$s = 0;
$i = 0;
$parents = array();
foreach ($iterator as $item) {
$js = array_splice($parents, $depth, count($parents), array($i));
foreach (array_reverse($js) as $j) {
$sides[$j]['right'] = ++$s;
}
$sides[$i]['left'] = ++$s;
$i++;
}
foreach (array_reverse($parents) as $j) {
$sides[$j]['right'] = ++$s;
}
Это, по упрощенной версии моего фактического кода, поскольку это просто хранит значения "стороны" в отдельном массиве, но это демонстрирует принцип.
Основная идея состоит в том, что Вы храните все родительские узлы (прослеженный значением глубины) в массиве и только пишете "левые" значения в Вашем цикле. Затем когда глубина уменьшается, это означает, что Вы возвратились иерархия, таким образом, родительский массив соединен для удаления тех, которые больше не релевантны, и они циклично выполняются, (наоборот) устанавливая "правильные" значения. Наконец, необходимо циклично выполниться по остающимся родителям в конце.
Не возможно решить эту проблему без рекурсии. Вам нужно что-то как следующее:
function tag_recursive($node, &$number) {
$node->left = $number++;
foreach ($node->children as &$child) {
tag_recursive($child, $number);
}
$node->right = $number++;
}
function tag($node) {
$number = 1;
tag_recursive($node, $number);
// $number is now highest id + 1
}