getElementsByClassName
Здравствуйте, помогите пожалуйста разобраться с getElementsByClassName.
Пол дня уже читаю мануалы и в конец запутался, как сделать рефреш перед началом функции? :blink: Пробывал добавить в функцию location.reload(), но работает не так, как надо.
<html>
<head>
<style>
p {margin:0px;}
</style>
<script type="text/javascript">
function find_c1() {
var f1 = document.getElementById('layer').getElementsByClassName('c1')
for (var i=0; i<f1.length; i++)
f1[i].style.visibility = "hidden";
}
function find_c2() {
var f2 = document.getElementById('layer').getElementsByClassName('c2')
for (var i=0; i<f2.length; i++)
f2[i].style.visibility = "hidden";
}
function find_c3() {
var f3 = document.getElementById('layer').getElementsByClassName('c3')
for (var i=0; i<f3.length; i++)
f3[i].style.visibility = "hidden";
}
function find_c4() {
var f4 = document.getElementById('layer').getElementsByClassName('c4')
for (var i=0; i<f4.length; i++)
f4[i].style.visibility = "hidden";
}
</script>
</head>
<body>
<input id="but1" type="button" value="Убрать 1" onclick="find_c1()" />
<input id="but2" type="button" value="Убрать 2" onclick="find_c2()" />
<input id="but3" type="button" value="Убрать 3" onclick="find_c3()" />
<input id="but4" type="button" value="Убрать 4" onclick="find_c4()" />
<div id="layer" style="padding-top: 20px; padding-left: 40px;">
<p class="c1">100</p>
<p class="c2">110</p>
<p class="c3">120</p>
<p class="c4">130</p>
<p class="c1">140</p>
<p class="c2">150</p>
<p class="c3">160</p>
<p class="c4">170</p>
</div>
</body>
</html>
|
такого метода нету
во всяком случае он некросбраузерен, поэтому для этой цели есть эмуляция http://javascript.ru/unsorted/top-10...lementsbyclass |
Цитата:
http://www.w3.org/TR/html5/dom.html#...ntsbyclassname Да, некроссбраузерен и декларирован в черновике спецификации HTML5, но тем не менее реализован более чем год (два?) тому назад в основных прогрессивных браузерах (IE, само собой, туда не входит, Opera 9.5+, FF3+). Кстати, по той же спецификации видно, что метод принимает один аргумент. А у Вас, denisok82, что передается вторым аргументом, да еще и необъявленной переменной? |
Вот так вроде работает, как думаете, правильно?
<script type="text/javascript">
function find_c1() {
var f1 = document.getElementById('layer').getElementsByClassName('c1')
for (var i=0; i<f1.length; i++)
alert(i);
}
</script>
|
Правильно, но, как отметил Gvozd, некроссбраузерно. Поэтому, если нужна поддержка IE, то придется использовать решение по ссылке выше.
|
По ссылке Гвоздя я посмотрел. Пока тяжела она еще для меня. Слишком там всё запутано. Пока впитываю знания, упражняюсь на ФФ.
|
Там нет ничего сложного.
if(document.getElementsByClassName) { // есть есть родная фукнция, используем ее
getElementsByClass = function(classList, node) {
return (node || document).getElementsByClassName(classList) // вызываем метод getElementsByClassName нужного узла.
// если указан node, то будет произведен поиск в нем, иначе во всем документе
}
} else { // если родной функции нет, то будем обходить DOM
getElementsByClass = function(classList, node) {
var node = node || document, // узел, в котором ищем
list = node.getElementsByTagName('*'), // выбираем все дочерние узлы
length = list.length, // количество дочерних узлов
classArray = classList.split(/\s+/), // разбиваем список классов
classes = classArray.length, // длина списка классов
result = [], i,j
for(i = 0; i < length; i++) { // перебираем все дочерние узлы
for(j = 0; j < classes; j++) { //перебираем все классы
if(list[i].className.search('\\b' + classArray[j] + '\\b') != -1) { // если текущий узел имеет текущий класс
result.push(list[i]) // запоминаем его
break // прекращаем перебор классов
}
}
}
return result // возвращаем набор элементов
}
}
|
B@rmaley.e><e,
Спасибо большое! Обязательно поковыряю этот кроссбраузерный вариант. [hr] А подскажите, я вот в первом посте обновил код и вопрос. Не найду никак нужного метода. Пытался вот так, но этот код не работает как было задумано:
function find_c1() {
window.location.reload(); // вот после этого не выполняются нижеследующие инструкции почему-то
var f1 = document.getElementById('layer').getElementsByClassName('c1')
for (var i=0; i<f1.length; i++)
f1[i].style.visibility = "hidden";
}
|
А с чего бы им выполняться, если после выполнения
location.reload()начнет ся переход на другую страницу (пусть и с таким же адресом)? |
У меня не хватает знаний. Укажите направление, куда копать? :write:
|
В 8 IE можно использовать querySelectorAlll. Функцию нужно переписывать.
|
Так как же сделать обновление перед выбором другой функции?
|
Ваш вопрос на форуме по C++ звучал бы примерно так: "Как перезапустить программу перед выбором другой функции?". Нелепость понятна?
|
Kolyaj,
Не нужно цепляться к неверно сформулированному вопросу. Ведь суть вопроса понятна. |
Нет, не понятна.
|
Kolyaj,
а вы код из первого поста в нотпад скопируйте, сразу будет всё наглядно видно, если хотите помочь, а не позлословить. |
Ладно, в итоге получилось привинтить визибилити, но код очень громоздкий, можно ли его как-нибудь укомпактить?
<script type="text/javascript">
function find_c1() {
var f1 = document.getElementById('layer').getElementsByClassName('c1')
for (var i=0; i<f1.length; i++)
f1[i].style.visibility = "hidden";
var f2 = document.getElementById('layer').getElementsByClassName('c2')
for (var i=0; i<f2.length; i++)
f2[i].style.visibility = "visible";
var f3 = document.getElementById('layer').getElementsByClassName('c3')
for (var i=0; i<f3.length; i++)
f3[i].style.visibility = "visible";
var f4 = document.getElementById('layer').getElementsByClassName('c4')
for (var i=0; i<f4.length; i++)
f4[i].style.visibility = "visible";
}
function find_c2() {
var f1 = document.getElementById('layer').getElementsByClassName('c1')
for (var i=0; i<f1.length; i++)
f1[i].style.visibility = "visible";
var f2 = document.getElementById('layer').getElementsByClassName('c2')
for (var i=0; i<f2.length; i++)
f2[i].style.visibility = "hidden";
var f3 = document.getElementById('layer').getElementsByClassName('c3')
for (var i=0; i<f3.length; i++)
f3[i].style.visibility = "visible";
var f4 = document.getElementById('layer').getElementsByClassName('c4')
for (var i=0; i<f4.length; i++)
f4[i].style.visibility = "visible";
}
function find_c3() {
var f1 = document.getElementById('layer').getElementsByClassName('c1')
for (var i=0; i<f1.length; i++)
f1[i].style.visibility = "visible";
var f2 = document.getElementById('layer').getElementsByClassName('c2')
for (var i=0; i<f2.length; i++)
f2[i].style.visibility = "visible";
var f3 = document.getElementById('layer').getElementsByClassName('c3')
for (var i=0; i<f3.length; i++)
f3[i].style.visibility = "hidden";
var f4 = document.getElementById('layer').getElementsByClassName('c4')
for (var i=0; i<f4.length; i++)
f4[i].style.visibility = "visible";
}
function find_c4() {
var f1 = document.getElementById('layer').getElementsByClassName('c1')
for (var i=0; i<f1.length; i++)
f1[i].style.visibility = "visible";
var f2 = document.getElementById('layer').getElementsByClassName('c2')
for (var i=0; i<f2.length; i++)
f2[i].style.visibility = "visible";
var f3 = document.getElementById('layer').getElementsByClassName('c3')
for (var i=0; i<f3.length; i++)
f3[i].style.visibility = "visible";
var f4 = document.getElementById('layer').getElementsByClassName('c4')
for (var i=0; i<f4.length; i++)
f4[i].style.visibility = "hidden";
}
</script>
|
denisok82,
Ч, ч, ч, чё это?!:blink: этот код не можно, а нужно "укомпактить". |
Gozar,
Ну главное - работает! Подскажите - как ужать код. Попытался вынести в глобальные переменные, почему-то не работает.
<script type="text/javascript">
var f1 = document.getElementById('layer').getElementsByClassName('c1');
var f2 = document.getElementById('layer').getElementsByClassName('c2');
var f3 = document.getElementById('layer').getElementsByClassName('c3');
var f4 = document.getElementById('layer').getElementsByClassName('c4');
function find_c1() {
for (var i=0; i<f1.length; i++)
f1[i].style.visibility = "hidden";
for (var i=0; i<f2.length; i++)
f2[i].style.visibility = "visible";
for (var i=0; i<f3.length; i++)
f3[i].style.visibility = "visible";
for (var i=0; i<f4.length; i++)
f4[i].style.visibility = "visible";
}
</script>
|
denisok82,
Вы когда-нибудь слышали или читали о том, что в функцию могут передаваться аргументы? например:
function find(hidden_id){}
|
Gozar,
нет, еще не слышал. я же только учусь. Точнее слышал, но не пробовал еще использовать. |
<html>
<head>
<script type="text/javascript">
function find(hidden_id) {
var f = document.getElementById('layer').childNodes;
for (var i=0; i<f.length; i++){
if(f[i].className == hidden_id){
f[i].style.visibility = "hidden";
}
else{
f[i].style.visibility = "visible";
}
}
}
</script>
</head>
<body>
<input id="but1" type="button" value="Убрать 1" onclick="find('c1')" />
<input id="but2" type="button" value="Убрать 2" onclick="find('c2')" />
<input id="but3" type="button" value="Убрать 3" onclick="find('c3')" />
<input id="but4" type="button" value="Убрать 4" onclick="find('c4')" />
<div id="layer" style="padding-top: 20px; padding-left: 40px;"><p class="c1">100</p><p class="c2">110</p><p class="c3">120</p><p class="c4">130</p><p class="c1">140</p><p class="c2">150</p><p class="c3">160</p><p class="c4">170</p></div>
</body>
</html>
Мне честно говоря очень лень разбираться, но если я правильно понял что должно делаться, то так это делать намного проще. Этот способ будет работать только если между </p><p class= не будет пробелов или других символов иначе childNodes (f[i]) нужно проверять на <p> |
Gozar,
Да, вы всё правильно поняли. Спасибо большое за помощь! |
Цитата:
Будем искать. |
Цитата:
|
Цитата:
|
Gozar,
B~Vladi, Спасибо :) Буду постигать. |
Подскажите пожалуйста, как сделать, чтобы оба свойства изменялись, а не только одно первое?
for (var i=0; i<f1.length; i++) f1[i].style.fontWeight = "bolder"; f1[i].style.color = "#ff0000"; Получается только вводя цикл со второй переменной. А сразу как-то можно оба свойства изменить? |
Фигурные скобки забыли.
|
спасибо :thanks:
И я всё еще не понял, можно ли создавать такие глобальные переменные или нет?
<script type="text/javascript">
var f1 = document.getElementById('layer').getElementsByClassName('c1');
var f2 = document.getElementById('layer').getElementsByClassName('c2');
var f3 = document.getElementById('layer').getElementsByClassName('c3');
var f4 = document.getElementById('layer').getElementsByClassName('c4');
function find_c1() {
for (var i=0; i<f1.length; i++)
f1[i].style.visibility = "hidden";
for (var i=0; i<f2.length; i++)
f2[i].style.visibility = "visible";
for (var i=0; i<f3.length; i++)
f3[i].style.visibility = "visible";
for (var i=0; i<f4.length; i++)
f4[i].style.visibility = "visible";
}
</script>
|
Цитата:
|
Kolyaj,
Потому что почему-то не работает, если их объявить глобально. Объясните пожалуйста, если не сложно, что не так. |
Потому что на момент объявления переменных этих узлов ещё нет в DOM-дереве.
|
еще один вариант
if ( typeof( document.getElementsByClassName ) != "function" ) document.getElementsByClassName = function( classname, tagname ) { var tags = tagname ? document.getElementsByTagName( tagname ) : ( document.all ? document.all : document.getElementsByTagName( "*" ) ); console.log( classname, tagname, typeof( tags ) ); var e; var r = []; for ( var i = 0; i < tags.length; i++ ) { e = tags[i].className; var s = e.split( ' ' ).some( function( el, ind, ar ) { return (el == classname); } ); if ( typeof( e ) == 'string' && e && s ) r.push( tags[i] ); } return r; }; |
пожалуйста, разъясните начинающему конструкцию result = [], i,j в коде. Это определение пустого массива? А что такое i,j здесь?
|
Цитата:
var result = [], i,jОпределяет переменные внутри текущего scope |
Манипуляция стилями div'ов через JS
Подскажите, пожалуйста, как я могу изменять стили определенных классов, через обращение к другим по JS скрипту?
с участием 2х элементов можно было бы ограничится тривиальным псевдоклассом :hover, но суть такая: Допустим у нас на сайте 3 элемента и, соответственно, 3 класса к ним: <div class="icon"></div> <div class="hint1"></div> <div class="hint2"></div> в стиле .hint2 {display:none;} При наведении на div "icon" к "hint1" должно присваиваться display:none, а у "hint2" это значение обнулять display:inherit например. Другими словами, при наведении на красный кубик в окошке появляется надпись "это красный кубик", а при наведении на зелёный кубик - "это зелёный кубик". т.к. в js я не силён, а знаю только html|css3 (на хорошем уровне) Своими силами пытался найти ответ, наткнулся на getElementsByClassName но толком не могу разобраться как манипулировать стилями.. |
<style>
.icon{
width:50px;
height:50px;
background:red;
}
.hint1{
display:none;
}
.icon:hover ~ .hint1{
display:block;
}
.icon:hover ~ .hint2{
display:none;
}
</style>
<div class="icon"></div>
<div class="hint1">hint1</div>
<div class="hint2">hint2</div>
Так чтоли? |
|
<div class='featured-view'></div> <div class='latest-view'></div> <div class='topten-view'></div> <script type="text/javascript"> function switchDIV() { var Elements1 = document.getElementsByClassName('featured-view').innerHTML; Elements2 = document.getElementsByClassName('topten-view').innerHTML; Elements3 = ''; Elements1 = Elements3; Elements2 = Elements1; Elements3 = Elements2; } </script> Подскажите пожалуйста в чем проблема!!! Нужно поменять местами 1 и 3й элементы |
| Часовой пояс GMT +3, время: 14:02. |