Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 03.08.2014, 16:17
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

http://jsbin.com/juqenojo/1

оно?

твои варианты чутка другие :

http://jsbin.com/ledexusa/1

$('h2').each(function (i) {
  
  $(this).
    css('color', 'red').
    text('h2: ' + i).
  
      parents(':first').andSelf().
  
      prev('h1, *:has(h1)').
  
          text('h1: ' + i).
          css('color', 'blue');
  
});

Последний раз редактировалось melky, 03.08.2014 в 16:30.
Ответить с цитированием
  #12 (permalink)  
Старый 03.08.2014, 19:05
Интересующийся
Отправить личное сообщение для sergej_savelev Посмотреть профиль Найти все сообщения от sergej_savelev
 
Регистрация: 20.09.2013
Сообщений: 18

Странно, вроде бы как работает, но я не могу понять как. Что делает andSelf()? Вроде бы кода раз два и обчёлся а в голове хаос, неразбериха... Ещё не могу понять как :has() работает, даже догадаться не получается.
Ответить с цитированием
  #13 (permalink)  
Старый 03.08.2014, 19:06
Интересующийся
Отправить личное сообщение для sergej_savelev Посмотреть профиль Найти все сообщения от sergej_savelev
 
Регистрация: 20.09.2013
Сообщений: 18

Дома жара, весь мокрый, не могу думать.
Ответить с цитированием
  #14 (permalink)  
Старый 03.08.2014, 19:14
Интересующийся
Отправить личное сообщение для sergej_savelev Посмотреть профиль Найти все сообщения от sergej_savelev
 
Регистрация: 20.09.2013
Сообщений: 18

Поеду прокачусь на доске лучше. Спасибо!
Ответить с цитированием
  #15 (permalink)  
Старый 03.08.2014, 19:17
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от sergej_savelev Посмотреть сообщение
Странно, вроде бы как работает, но я не могу понять как. Что делает andSelf()? Вроде бы кода раз два и обчёлся а в голове хаос, неразбериха... Ещё не могу понять как :has() работает, даже догадаться не получается.
точнее, даже так:
$('h2').each(function (i) {
  
  $(this).
    css('color', 'red').
    text('h2: ' + i).
  
      parents('div:last').andSelf().
  
        prev('h1, div:has(h1)').
  
          text('h1: ' + i).
          css('color', 'blue');
  
});




теперь поясню:

$('h2').each(function (i) {
  
  $(this).
    css('color', 'red').
    text('h2: ' + i).
  
*!*
      parents('div:last').andSelf().
*/!*
  
        prev('h1, div:has(h1)').
  
          text('h1: ' + i).
          css('color', 'blue');
  
});


Эта строчка найдёт DIV на самом верхнем уровне вложенности, считая от h2... (это не всё)

выделен жёлтым:

вот:

ещё:


и поместит в список к найденному элементу и сам элемент h2 (andSelf).

....
Далее,


$('h2').each(function (i) {
  
  $(this).
    css('color', 'red').
    text('h2: ' + i).
  

      parents('div:last').andSelf().

 *!* 
        prev('h1, div:has(h1)').
 */!*
 
          text('h1: ' + i).
          css('color', 'blue');
  
});


Пройдётся по элементам предыдущей выборки (div на верхнем уровне, или сам h2) и найдёт предыдущий h1, или div, внутри которого есть h1

в инете есть документация по селектору has, и по всем методам ...
Ответить с цитированием
  #16 (permalink)  
Старый 03.08.2014, 21:02
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,501

Нафиг это ваше jquery.
<div>
    <h1>title</h1>
</div>
<h2>title</h2>
<script>
var nodes = document.getElementsByTagName('*'), i = nodes.length;
var el = document.querySelector('h2'), findTag = 'H1';
while(i--) if(nodes[i] === el) break;
while(i--) if(nodes[i].tagName === findTag) break; 
if(nodes[i]) nodes[i].style.color='#f00';
</script>
<div>
    <h1>title</h1>
</div>
<div>
    <h2>title</h2>
</div>
<script>
var nodes = document.getElementsByTagName('*'), i = nodes.length;
var el = document.querySelector('h2'), findTag = 'H1';
while(i--) if(nodes[i] === el) break;
while(i--) if(nodes[i].tagName === findTag) break; 
if(nodes[i]) nodes[i].style.color='#f00';
</script>
<h1>title</h1>
<div>
    <h2>title</h2>
</div>
<script>
var nodes = document.getElementsByTagName('*'), i = nodes.length;
var el = document.querySelector('h2'), findTag = 'H1';
while(i--) if(nodes[i] === el) break;
while(i--) if(nodes[i].tagName === findTag) break; 
if(nodes[i]) nodes[i].style.color='#f00';
</script>
<h1>title</h1>
<h2>title</h2>
<script>
var nodes = document.getElementsByTagName('*'), i = nodes.length;
var el = document.querySelector('h2'), findTag = 'H1';
while(i--) if(nodes[i] === el) break;
while(i--) if(nodes[i].tagName === findTag) break; 
if(nodes[i]) nodes[i].style.color='#f00';
</script>
<div>
    <h1>title</h1>
</div>
<div>
    <h1>title</h1>
</div>
<div>
    <h2>title</h2>
</div>
<script>
var nodes = document.getElementsByTagName('*'), i = nodes.length;
var el = document.querySelector('h2'), findTag = 'H1';
while(i--) if(nodes[i] === el) break;
while(i--) if(nodes[i].tagName === findTag) break; 
if(nodes[i]) nodes[i].style.color='#f00';
</script>
<div>
    <h1>title</h1>
    <h1>title</h1>
</div>
<div>
    <h1>title</h1>
    <h1>title</h1>
</div>
<div>
    <h1>title</h1>
</div>
<div>
    <h2>title</h2>
</div>
<script>
var nodes = document.getElementsByTagName('*'), i = nodes.length;
var el = document.querySelector('h2'), findTag = 'H1';
while(i--) if(nodes[i] === el) break;
while(i--) if(nodes[i].tagName === findTag) break; 
if(nodes[i]) nodes[i].style.color='#f00';
</script>
__________________
29375, 35

Последний раз редактировалось Aetae, 03.08.2014 в 21:06.
Ответить с цитированием
  #17 (permalink)  
Старый 04.08.2014, 12:19
Интересующийся
Отправить личное сообщение для sergej_savelev Посмотреть профиль Найти все сообщения от sergej_savelev
 
Регистрация: 20.09.2013
Сообщений: 18

Сообщение от Aetae
Нафиг это ваше jquery.
Думаю, с ним было бы быстрей и приятней для глаз, нет? Или ты скажешь, что может быть приятней чистого кода и что быстрей написать свою функцию чем искать плагин (не буду упомянать чего). Вообще я с тобой согласен, очень рад что есть такие грамотные люди как ты. А как звучит-то
Сообщение от Aetae
Нафиг это ваше jquery.
Ведь MELKY не плох, но фраза зачёт
Ответить с цитированием
  #18 (permalink)  
Старый 04.08.2014, 12:41
Интересующийся
Отправить личное сообщение для sergej_savelev Посмотреть профиль Найти все сообщения от sergej_savelev
 
Регистрация: 20.09.2013
Сообщений: 18

Жаль что я не могу внедрить ни первый ни второй пример в свой код. И так и эдак пытаюсь, но не получается.
Ответить с цитированием
  #19 (permalink)  
Старый 04.08.2014, 12:46
Интересующийся
Отправить личное сообщение для sergej_savelev Посмотреть профиль Найти все сообщения от sergej_savelev
 
Регистрация: 20.09.2013
Сообщений: 18

var lengthH2 = $('#contentInner h2').length;
    
    if(lengthH2>0){
        
        $('<ul></ul>').appendTo('#indexMenu>ul>li');
        
        for(i=0;i<lengthH2;i++){
            
            var nodes = document.getElementsByTagName('*'), i = nodes.length;
            var el = document.querySelector('h2'), findTag = 'H1';
            while(i--) if(nodes[i] === el) break;
            while(i--) if(nodes[i].tagName === findTag) break;
            if(nodes[i]) var parentClass = nodes[i].className;
            
            //var parentClass = $('#contentInner h2').eq(i).parents().prev('h1, :has(h1):first').attr('class');
                
            if($('#contentInner h2:not(#pagetitle)').eq(i).text().length>50){
                
                var text = '<li class="h2-'+i+'"><a href="[[~[[*id]]]]#h2-'+i+'" title="'+$('#contentInner h2:not(#pagetitle)').eq(i).text().replace(/^\s*|\s+$/g, '').replace(/\t|\n/g, ' ')+'">'+$.trim($('#contentInner h2:not(#pagetitle)').eq(i).text().slice( 0, 50 )) + '…'+'</a></li>'
                
            }else{
                
                var text = '<li class="h2-'+i+'"><a href="[[~[[*id]]]]#h2-'+i+'">'+$('#contentInner h2:not(#pagetitle)').eq(i).text().replace(/^\s*|\s+$/g, '').replace(/\t|\n/g, ' ')+'</a></li>'
                
            }
            
            $('#contentInner h2').eq(i).addClass('h2-'+i) // .append('<a name="h2-'+i+'"></a>');
            
            $(text).appendTo('#indexMenu>ul>li.'+parentClass+'>ul');
            
        }
        
    }

Почему-то в if(nodes[i]) var parentClass = nodes[i].className; всего один раз получает класс.
Ответить с цитированием
  #20 (permalink)  
Старый 04.08.2014, 14:08
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

sergej_savelev, ты либо jQuery JS используй, либо Vanilla JS, не мешай одно с другим.

Последний раз редактировалось Rise, 04.08.2014 в 14:10.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск