Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Найти в родителе элемент с заданным классом (https://javascript.ru/forum/events/18373-najjti-v-roditele-ehlement-s-zadannym-klassom.html)

tadjik1 28.06.2011 13:52

огромное спасибо вам!

а я поленился прочитать документацию к prev, думал неьлзя в него селектор передавать :(

tadjik1 28.06.2011 17:47

ну вот, дальше — хуже.

код чуть изменил, чтобы слэш не прыгал, добавил простенькое условие:
$('.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 не позволяют додумать код.

nikita.mmf 28.06.2011 18:04

$(".hide-next").each(function(){
  var $self = $(this);
  if ( $.inArray( $self.text(), hashEls ) > -1 ) {
    $self.click();
  }
})

tadjik1 29.06.2011 10:08

а каким образом можно исключить дублирования кликов? дело в том, что значения этих элементов могут совпадать. уникальным является только первый, самый верхний элемент и сам путь.

есть предположение, что можно в самом-самом верхнем диве найти первый хайдер, затем в его чилдрен второй и т.д.

nikita.mmf 29.06.2011 10:36

tadjik1, тогда остается только такой алгоритм

tadjik1 29.06.2011 10:56

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();
  				}	
  			
  			})
		});

tadjik1 29.06.2011 12:04

а, нет, не так. это не его дети, а соседские)

tadjik1 29.06.2011 13:05

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-вой элемент. подскажите, пожалуйста, в каком месте нарушена логика?

nikita.mmf 29.06.2011 13:18

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 );

tadjik1 29.06.2011 15:07

не могу понять, в чем ошибка, но кликает только по первому элементу..
кстати, в document.body filter() не работает, там приходится через файнд() искать, дальше уже через фильтер. но факт остаётся фактом — кликт только по первому элементу. смотрю в консоли хрома переменная объявилась правильно, она глобальная.


Часовой пояс GMT +3, время: 23:43.