|
Выбор нужного элемента дом дерева
Доброго времени суток, вот по чуть учу Js и столкнулся с задачей, которую не получается решить. Может вы подскажите в чем моя ошибка.
Задача: Вот так выглядит страница. В каждом вложенном диве есть еще элементы. Задача поменять местами второй и третий див. У них есть классы но нет Id. Обязательно делать именно жс и кроссбраузерно. <div id="content-wrap"> <div></div> <div></div> <div></div> </div> Вот я написал такое дело
var main = document.getElementById('content-wrap')
var divall = main.getElementsByTagName('div')
main.appendChild(divall[1])
Логика моя: Выбрали див с ид content-wrap. Пробежались по нему и выбрали все div. Див который второй взяли и перекинули в конец родителя. При таком коде мне Лисичка пишет TypeError: main is null var divall= main.getElementsByTagName('div') |
<!DOCTYPE HTML>
<html>
<head> </head>
<body>
<div id='wrapper'>
<div>1 </div>
<div> 2</div>
<div>3 </div>
<div> 4</div>
</div>
<script>
var wrapper_ = document.getElementById('wrapper');
var elem = wrapper_.children[1];
wrapper_.insertBefore(elem, wrapper_.children[3])
</script>
</body>
</html>
|
Спасибо большое, как же все просто было...
|
main is null
Т.е. нет элемента с таким id. С вероятностью 100% вы запускаете скрипт раньше чем в коде появляется данный элемент. Javscript выполняется по мере загрузки, а не после.(если вы специально того не обозначите) ...
<div id="content-wrap">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
<script type="text/javascript">
var main = document.getElementById('content-wrap')
var divall = main.getElementsByTagName('div')
main.appendChild(divall[1])
</script>
|
И да, решение от cyber, не будет работать если элементов 3, надо так:
var wrapper_ = document.getElementById('wrapper');
var elem = wrapper_.children[1];
wrapper_.insertBefore(elem, wrapper_.children[3] || null) //ксли вторым параметром null - работает как appeendChild, а если undefined - кидает ошибку
|
А вот у меня возник еще один вопрос, задача стояла куда более обширно нежели тут описал в итоге поучил вот такой код
<script>
var wrapper_ = document.getElementById('content-wrap');
var elem = wrapper_.children[4];
var after_main = wrapper_.children[2];
after_main.style.width = "900px";
var after_main_stage1 = after_main.children[0];
var after_main_stage2 = after_main.children[1];
after_main_stage1.style.cssText = "float:left;\ ";
after_main_stage1.rule.style.cssText = "float:left;\ ";
after_main_stage2.style.cssText = "float:left;\ ";
var after_main_stage3 = after_main_stage2.children[1];
after_main_stage3.style.cssText = "float:left;\
width:300px;\ " ;
wrapper_.insertBefore(elem, wrapper_.children[2])
wrapper_.children[2].style.width = "940px";
var cat_ch3 = elem.children[0];
var cat_ch4 = cat_ch3.children[1];
var light = elem.children[1];
var light2 = elem.children[2];
cat_ch4.parentNode.insertBefore(light2, cat_ch4.nextSibling);
cat_ch4.parentNode.insertBefore(light, cat_ch4.nextSibling);
elem.children[0].style.cssText = "position:relative ; \ ";
light.style.cssText="position:absolute;\
bottom:45px; \ ";
light2.style.cssText="position:absolute;\
bottom:25px; \ ";
var float_l = document.getElementsByTagName('td');
var text_float = float_l[0];
var text_float_stage1 = text_float.children[0];
var dd_st = text_float_stage1.getElementsByTagName('dd');
for (var i=0; i < dd_st.length; i++)
{
dd_st[i].style.cssText="float:left !important; \
width:160px;\ ";
}
var dt_st = text_float_stage1.getElementsByTagName('dt');
for (var i=0; i < dt_st.length; i++)
{
dt_st[i].style.cssText="float:left !important; \
width:120px;\ ";
}/**/
var td_1 = document.getElementsByTagName('td');
td_1[0].style.cssText = "width:300px;\
padding-top:21px;\
float:left;\ ";
td_1[1].style.cssText = "float:left; \ ";
var float_l_stage1 = float_l[1];
var float_l_stage2 = float_l_stage1.children[0];
var float_l_stage3 = float_l_stage2.children[1];
var float_l_stage4 = float_l_stage3.children[0];
float_l_stage4.children[0].style.width = "570px";
float_l_stage4.children[0].style.height = "125px";
var btn = document.getElementById('btn_holder');
var btn_prev = btn.previousElementSibling ;
btn.style.cssText="float:left !important; \
";
btn_prev.style.cssText="float:left !important; \
margin-left:250px;\ ";
var width_line = document.getElementById('updates');
width_line.children[0].style.cssText = "width:200px;\ ";
</script>
И все бы хорошо, все работает так как надо КРОМЕ IE ниже 9... Я так понял нельзя использовать cssText , но на что заменить и как? |
Нет, cssText работал всегда. Дело в previousElementSibling, ie<9 не знают такого.
Сразу напишу функцию, но на самом деле лучше вообще не использовать:
function prev( el ){
while(el=el.previousSibling) if(el.nodeType === 1) break;
return el
}
|
after_main_stage1.style.cssText = "float:left;\ ";
мне отладчик ИЕ ругается на это и пишет SCRIPT5007: Не удалось получить значение свойства "style": значением объекта является NULL или он не определен Contact Us.htm, строка 229 символ 2 А что с этой функцией написанной вами делать? В смысле где ее вызывать и с какой целью |
Очевидно, что проблема с after_main_stage1, в котором вообще нет style;
Сделайте alert(after_main_stage1)и посмотрите, что он вам напишет. Цитата:
|
Спасибо Aetae за помощь, но вопрос актуален... Получается, что ИЕ видит Коментарии в коде и принимает их как часть кода... Как бы это обойти, может кто подскажет?
|
| Часовой пояс GMT +3, время: 08:54. |
|