Цитата:
|
вообще-то от что получилось :)
<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>
|
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;
}
Агоритм не рабочий |
Slawaq, зачем каждый раз body получать через getElementsByTagName?
nikita.mmf, не думаю, что через .nextSibling будет эффективно. Скорее наоборот. |
Sweet, сложно сказать, это все зависит структуры, мне так кажется, это как бы поиск в глубину и поиск в ширину. Навскидку трудоемкость вашего алгоритма О(n^2), а у моего O(n*m), где n - число родителей до body, а m - макимальное число детей у одного родителя.
|
nikita.mmf, у меня ваш скрипт не работает, только всё лагать начинает...
|
Народ, вы чего. У нас же тут не математические вычисления с длинными числами. Средняя вложенность элемента на странице - 15-20 родителей. Соответственно, не более 400 операций сравнения при худшем раскладе. С таким даже алгоритм Slawaq'а быстро справится.
UPD: мне даже кажется, что про 15-20 - я загнул. |
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
}
|
Aetae, у вас ошибка. Грубо говоря, если обзывать предков числами, то при сравнении элемента с таким массивом предков: [0, 1, 2] и элемента с вот таким: [1, 2, 3] - ф-ция вернёт null.
Но идея с набиванием предков в массив - отличная. Благодарю. |
Пример пжалста, ибо не могу представить такой ситуации. У всех в 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>
|
| Часовой пояс GMT +3, время: 01:16. |