Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 23.06.2011, 22:48
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от Aetae
потом покажу как
Когда звёзды выстроятся в правильном порядке?
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #12 (permalink)  
Старый 23.06.2011, 22:51
Аватар для Slawaq
Профессор
Отправить личное сообщение для Slawaq Посмотреть профиль Найти все сообщения от Slawaq
 
Регистрация: 19.05.2010
Сообщений: 187

вообще-то от что получилось
<body>
<div>
    <div id="multi-parent">
        <div>
            <div id="firstChild"></div>
        </div>
        <div>
            <div>
                <div id="secondChild"></div>
            </div>
        </div>
    </div>
</div>
<script type="text/javascript">
var $ = function(n){return document.getElementById(n);}
var getParent = function(fe,se){
    var parentF = fe.parentNode;
    while(true)
        if(parentTest(se,parentF)) return parentF;
        else parentF=parentF.parentNode;    
    return document.body;
}
function  parentTest(child,parent){
    while(true){
        if(child.parentNode==parent) return true;
        else
            if(child.parentNode!=document.body) child=child.parentNode;
            else break;
    }
    return false;
}
alert(getParent($("firstChild"),$("secondChild")).id);
</script>
</body>
__________________
java.Uprise.*

Последний раз редактировалось Slawaq, 23.06.2011 в 23:28.
Ответить с цитированием
  #13 (permalink)  
Старый 23.06.2011, 23:07
Профессор
Отправить личное сообщение для nikita.mmf Посмотреть профиль Найти все сообщения от nikita.mmf
 
Регистрация: 01.02.2010
Сообщений: 364

function getParent ( firstElem, secondElem ) {
	var parent;
	while ( parent != document.body ) {
		parent = firstElem.parentNode, child = parent.firstChild; 
		while ( child ) {
			if ( child == secondElem ) { 
				return parent; 
			}
			child = child.nextSibling;
		}
		parent = parent.parentNode;
	}
	return parent;
}


Агоритм не рабочий

Последний раз редактировалось nikita.mmf, 24.06.2011 в 10:16.
Ответить с цитированием
  #14 (permalink)  
Старый 23.06.2011, 23:10
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Slawaq, зачем каждый раз body получать через getElementsByTagName?
nikita.mmf, не думаю, что через .nextSibling будет эффективно. Скорее наоборот.

Последний раз редактировалось Sweet, 23.06.2011 в 23:16.
Ответить с цитированием
  #15 (permalink)  
Старый 23.06.2011, 23:23
Профессор
Отправить личное сообщение для nikita.mmf Посмотреть профиль Найти все сообщения от nikita.mmf
 
Регистрация: 01.02.2010
Сообщений: 364

Sweet, сложно сказать, это все зависит структуры, мне так кажется, это как бы поиск в глубину и поиск в ширину. Навскидку трудоемкость вашего алгоритма О(n^2), а у моего O(n*m), где n - число родителей до body, а m - макимальное число детей у одного родителя.
Ответить с цитированием
  #16 (permalink)  
Старый 23.06.2011, 23:38
Аватар для Slawaq
Профессор
Отправить личное сообщение для Slawaq Посмотреть профиль Найти все сообщения от Slawaq
 
Регистрация: 19.05.2010
Сообщений: 187

nikita.mmf, у меня ваш скрипт не работает, только всё лагать начинает...
__________________
java.Uprise.*
Ответить с цитированием
  #17 (permalink)  
Старый 23.06.2011, 23:39
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Народ, вы чего. У нас же тут не математические вычисления с длинными числами. Средняя вложенность элемента на странице - 15-20 родителей. Соответственно, не более 400 операций сравнения при худшем раскладе. С таким даже алгоритм Slawaq'а быстро справится.

UPD: мне даже кажется, что про 15-20 - я загнул.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #18 (permalink)  
Старый 24.06.2011, 00:55
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,469

function unitedParent(first,second){
  var parents=function(e){var a=[];while(e=e.parentNode)a.push(e);return a}
  var f=parents(first), s=parents(second), fl=f.length, sl=s.length;
  while(f[--fl]&&f[fl]===s[--sl]);
  return f[fl+1]||null
}
__________________
29375, 35
Ответить с цитированием
  #19 (permalink)  
Старый 24.06.2011, 23:15
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Aetae, у вас ошибка. Грубо говоря, если обзывать предков числами, то при сравнении элемента с таким массивом предков: [0, 1, 2] и элемента с вот таким: [1, 2, 3] - ф-ция вернёт null.

Но идея с набиванием предков в массив - отличная. Благодарю.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #20 (permalink)  
Старый 25.06.2011, 01:07
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,469

Пример пжалста, ибо не могу представить такой ситуации. У всех в DOM'е один главный предок.)
Пример:
<html>
<body>   
<style>div{padding:5px;margin:5px;border:2px dotted #000}
#first{border-color:#f00}
#second{border-color:#0f0}
#parent{border-color:#00f}
</style>
 
<div>
  <div>
    <div></div>
    <div id="second"></div>
  </div>
  <div id="first"></div>
</div>
 
<script>
function unitedParent(first,second){
  var parents=function(e){var a=[];while(e=e.parentNode)a.push(e);return a};
  var f=parents(first), s=parents(second), fl=f.length, sl=s.length;
  while(f[--fl]&&f[fl]===s[--sl]);
  return f[fl+1]||null
}
unitedParent(document.getElementById('first'),document.getElementById('second')).id="parent";
</script>
</body>
</html>
__________________
29375, 35

Последний раз редактировалось Aetae, 06.07.2011 в 19:58.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Общий обработчик ошибок на весь документ. Casufi jQuery 3 10.02.2010 16:08