огромное спасибо вам!
а я поленился прочитать документацию к prev, думал неьлзя в него селектор передавать :( |
ну вот, дальше — хуже.
код чуть изменил, чтобы слэш не прыгал, добавил простенькое условие: $('.hide-next').click(function() { var parentEls = $(this).parents("div").prev('.hide-next') .map(function () { return $(this).text(); }) .get().join("/"); if(parentEls == "") { parentEls = $(this).text(); } else { parentEls = parentEls+"/"+$(this).text(); } window.location.hash = parentEls; }); но теперь мне нужно по сформировавшейся ссылке открыть все эти элементы. получается что-то вроде var hash = decodeURIComponent(location.hash.substring(1)); var hashEls = hash.split("/"); if($("*").find(".hide-next:contains("+hashEls[0]+")").trigger("click")) { for(var num = 1;num<hashEls.length;num++) { $("*").find(".hide-next:contains("+hashEls[num]+")").trigger("click"); } } но это не совсем то опять что нужно, потому что contains ищет просто совпадение и в итоге разворачивает всё, что только можно. скажите, пожалуйста, как лучше реализовать поиск в этом случае? нужно, чтобы только «те» элементы открывались, т.е. элементы с одинаковым text() могу встречаться на одной странице. я так понимаю, надо как-то связывать с иерархией, ориентироваться на предков и детей. но то ли конец дня, а скорее полная безрамотность в jquery не позволяют додумать код. |
$(".hide-next").each(function(){ var $self = $(this); if ( $.inArray( $self.text(), hashEls ) > -1 ) { $self.click(); } }) |
а каким образом можно исключить дублирования кликов? дело в том, что значения этих элементов могут совпадать. уникальным является только первый, самый верхний элемент и сам путь.
есть предположение, что можно в самом-самом верхнем диве найти первый хайдер, затем в его чилдрен второй и т.д. |
tadjik1, тогда остается только такой алгоритм
|
var hash = decodeURIComponent(location.hash.substring(1)); var hashEls = hash.split("/"); $(".hide-next").each(function(){ var $self = $(this); if ($self.text() == hashEls[0]) { $self.click(); } $self.children('.hide-next').each(function() { var lll = $(this); if ( $.inArray( $lll.text(), hashEls ) > -1 ) { $self.click(); } }) }); |
а, нет, не так. это не его дети, а соседские)
|
function openHider () { var hash = decodeURIComponent(location.hash.substring(1)); var hashEls = hash.split("/"); $(".hide-next").each(function(){ var $self = $(this); if ($self.text() == hashEls[0]) { $self.click(); hashEls = hashEls.splice(0,1); var child = $self.next().children(); openNextHiders(hashEls, child); } }); } function openNextHiders(hashElss, childs) { childs.find('.hide-next').each(function() { var $self = $(this); if ($self.text() == hashElss[0]) { $self.click(); hashElss = hashElss.splice(0,1); childs = $self.next().children(); openNextHiders(hashElss, childs); } }); } проблема в том, что массив стирается полностью в первой функции, не только 0-вой элемент. подскажите, пожалуйста, в каком месте нарушена логика? |
var hashEls = decodeURIComponent( location.hash.replace( /^#/, "" ) ).split("/"); function clickByHideElems( elems, k) { var $children = $(elems).children(); var $hideNext = $children.filter(".hide-next").filter(function(){ return $(this).text() === hashEls[k]; }); if ( $hideNext.length ) { $hideNext.click(); if ( k < hashEls.length - 1 ) { clickByHideElems($hideNext.next("div"), k++); } } else { clickByHideElems( $children, k ); } } clickByHideElems( document.body, 0 ); |
не могу понять, в чем ошибка, но кликает только по первому элементу..
кстати, в document.body filter() не работает, там приходится через файнд() искать, дальше уже через фильтер. но факт остаётся фактом — кликт только по первому элементу. смотрю в консоли хрома переменная объявилась правильно, она глобальная. |
Часовой пояс GMT +3, время: 23:43. |