огромное спасибо вам!
а я поленился прочитать документацию к 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, время: 12:37. |