Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите найти подредактировать скрипт открытия\закрытия (https://javascript.ru/forum/misc/19214-pomogite-najjti-podredaktirovat-skript-otkrytiya%5Czakrytiya.html)

makar3000 28.07.2011 23:00

Помогите найти подредактировать скрипт открытия\закрытия
 
В общем есть скрипт, который открывает блок и закрывает+сохраняет на куки:

$(function () {
    plus = './images/plus.png';
    minus = './images/minus.png';

    function Switchable(classname) {
        function getElementsByClassName(imgclass) {
            if (document.getElementsByClassName) {
                return document.getElementsByClassName(imgclass);
            } else {
                var nodes = document.getElementsByTagName('*'),
                    tmp = [];
                for (var i = 0; i < nodes.length; i++) {
                    if (new RegExp('\\b' + imgclass + '\\b').test(nodes[i].className)) {
                        tmp.push(nodes[i]);
                    }
                }
                return tmp;
            }
        }

        function Next(element) {
            var next = element;
            while (next = next.nextSibling)
            if ("innerHTML" in next) return next;
            return element;
        }

        function getCookie(a) {
            var b = document.cookie.match(new RegExp("(?:^|; )" + a.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, "\\$1") + "=([^;]*)"));
            return b ? decodeURIComponent(b[1]) : undefined
        }
        function setCookie(b, f, c) {
            c = c || {};
            var i = c.expires;
            if (typeof i == "number" && i) {
                var h = new Date();
                h.setTime(h.getTime() + i * 1000);
                i = c.expires = h
            }
            if (i && i.toUTCString) {
                c.expires = i.toUTCString()
            }
            f = encodeURIComponent(f);
            var a = b + "=" + f;
            for (var e in c) {
                a += "; " + e;
                var g = c[e];
                if (g !== true) {
                    a += "=" + g
                }
            }
            document.cookie = a
        }
        var nodes = getElementsByClassName(classname);
        for (var i = 0; i < nodes.length; i++) {
            var toggler = document.createElement("A");
            toggler.href = "javascript://";
            toggler.id = "toggler" + i;
            toggler.innerHTML = getCookie("toggler" + i) == "hide" ? "<img src='" + plus + "' alt='' />" : "<img src='" + minus + "' alt='' />";
            toggler.onclick = function () {
                Next(this.parentNode).style.display = getCookie(this.id) == "hide" ? "" : "none";
                setCookie(this.id, getCookie(this.id) == "hide" ? "show" : "hide", {
                    expires: new Date("01 Jan 2020")
                });
                this.innerHTML = getCookie(this.id) == "hide" ? "<img src='" + plus + "' alt='' />" : "<img src='" + minus + "' alt='' />";
            };
            Next(nodes[i]).style.display = getCookie("toggler" + i) == "hide" ? "none" : "";
            nodes[i].appendChild(toggler);
        }
    }

    Switchable("h_block");
});


<div class="h_block">Тут будет + или -</div> 
<div>содержимое блока, которое будет открыватся\закрыватся</div>


Вот как переделать <div> в

<div class="cont">содержимое блока, которое будет открыватся\закрыватся</div>

Именно с классом!?!? :help:

makar3000 28.07.2011 23:48

Гуру вы где!?

NoResponse 29.07.2011 00:36

да все тут, вот только вопрос никто понять не может

makar3000 29.07.2011 00:40

Нужно
<div>содержимое блока, которое будет открыватся\закрыватся</div>
задать класс, и что бы только через этот класс работало! а не чисто через <div>

monolithed 29.07.2011 01:14

makar3000, разбираться в этом кошмаре никто кроме вас не будет.
добавить атрибут класса можно с помощью метода setAttribute(), обратиться, через свойство className или универсальную функцию

makar3000 29.07.2011 02:07

Я просто не могу понять где задается команда что бы выводил в <div> без класса

kobezzza 29.07.2011 02:29

О Боже, я ослеп! Сделайте pretty print вашему коду чтоли... http://jsbeautifier.org/

makar3000 29.07.2011 02:33

готово

kobezzza 29.07.2011 02:41

Гораздо лучше. Любите свой код, и тогда он полюбит вас)

То, что вам нужно, здесь:
Next(this.parentNode).style.display = getCookie(this.id) == "hide" ? "" : "none";


Функция Next - это следующий элемент, после элемента с классом h_block, т.е. ваш простой div.

makar3000 29.07.2011 02:43

Я не очень хорошо понимаю в JS скажите как сделать это под определенный класс? <div class="***">

kobezzza 29.07.2011 02:49

Замените указанную строчку на:
var next = Next(this.parentNode);
if (next.getAttribute("class") && next.getAttribute("class") === "cont") {
	next.style.display = getCookie(this.id) == "hide" ? "" : "none";
}

Теперь, элемент скроется только в том случае, если у него есть класс "cont"

makar3000 29.07.2011 14:54

Не работает!

kobezzza 29.07.2011 19:28

Значит вы не правильно сформулировали задачу или я не понял, что вам нужно. Я сказал где копать и показал как копать.

А просто кричать "Не работает!" нет смысла.

makar3000 29.07.2011 21:50

Вы правильно поняли, но там еще в конце кода есть что поправить. Напишите прямо в коде если вас не затруднит

Kolyaj 30.07.2011 12:01

Цитата:

Сообщение от makar3000
но там еще в конце кода есть что поправить

Так поправьте.

makar3000 30.07.2011 12:58

Да емае поправил и не работает!!!! Добавьте вы в код пожалуйста!!!

melky 30.07.2011 14:49

плохо поправили. попросите человека за деньги поправить код

?

makar3000 30.07.2011 15:14

20 рублей!? Вы же профессионалы, вы код за 2 минуты сделаете))

melky 30.07.2011 21:50

или если профессиональный землекоп идет домой, а к нему солдатик подбегает окоп вскопать, что он ему скажет?

makar3000 30.07.2011 22:55

зачем загадки?! я же объяснил что не так)) Если не понятно так и скажите... Попробую перефразировать вопрос

dmitriymar 30.07.2011 23:04

Цитата:

Сообщение от melky
окоп вскопать

:haha:

melky 30.07.2011 23:41

я задетектил у тебя jquery. вот твой же код на твоей же jquery

<script type="application/javascript" src="http://yandex.st/jquery/1.6.2/jquery.min.js"></script>
<script type="application/javascript" src="http://yandex.st/jquery/cookie/1.0/jquery.cookie.min.js"></script>

<div class="h_block">-</div>
<div>содержимое блока, которое будет открыватся\закрыватся</div>


<script type="application/javascript">
// управляющий скрытием\показом
var $this = $(".h_block"),
        // что будем скрывать\показывать.
        $el = $this.next();

// closing ->
// true, если будем закрывать,
// false, если будем открывать
function toggle(closing){
    
    // укоротил,как мог.
    $this.html( closing ? "+" : "-" );
    $el[ closing ? "hide" : "show" ]();
    
    // 0 или 1
    $.cookie('block_hided', closing*1 );
};

$(function(){
    // если сохранено состояние.
    var cookie = $.cookie('block_hided');
    
    // передаем Boolean;
    if( cookie !== null ) toggle( !!cookie );
    
})
    
$(".h_block").click(function(){
    // кликнутый эл
    $this = $(this);
        // эл, с которым будем взаимодействовать
        $el = $this.next();
    

    var closing = $el.is(":visible");
    
    toggle( closing ); 
});
</script>



Цитата:

Сообщение от dmitriymar (Сообщение 116383)
:haha:

ну выкопать, какая разница :)

makar3000 31.07.2011 17:21

Так а можно сделать допустим что бы было не

<div>содержимое блока, которое будет открыватся\закрыватся</div>

а:

<span>содержимое блока, которое будет открыватся\закрыватся</span>

melky 31.07.2011 17:27

просто поменяй html,там нет привязки к имени тега

makar3000 31.07.2011 18:06

вообщем проверьте сами скрипт. Он запоминает только закрытие! А когда нажимаешь открыть и перезапускаешь страницу он закрыт.

melky 31.07.2011 18:38

...

а самому поправить?

<script type="application/javascript" src="http://yandex.st/jquery/1.6.2/jquery.min.js"></script>
<script type="application/javascript" src="http://yandex.st/jquery/cookie/1.0/jquery.cookie.min.js"></script>

<div class="h_block">-</div>
<div>содержимое блока, которое будет открыватся\закрыватся</div>


<script type="application/javascript">
// управляющий скрытием\показом
var $this = $(".h_block"),
        // что будем скрывать\показывать.
        $el = $this.next();

// true, если будем закрывать,
// false, если будем открывать
function toggle(closing){
    
    $this.html( closing ? "+" : "-" );
    $el[ closing ? "hide" : "show" ]();
    
};

$(function(){
    // если сохранено состояние.
    var cookie = $.cookie('block_hided');
    // передаем Boolean;
    if( cookie !== null ) toggle( !!(+cookie) );
    
})
    
$(".h_block").click(function(){
    // кликнутый эл
    $this = $(this);
        // эл, с которым будем взаимодействовать
        $el = $this.next();
    

    var closing = $el.is(":visible");
    
    // 0 или 1
    $.cookie('block_hided', closing*1 );
    
    toggle( closing ); 
});
</script>

makar3000 31.07.2011 18:54

Когда закрываю один блок, при обновлении страницы закрываются все
Код блоков:
<div class="block">
<div class="block_icon"></div>
<div class="title">Наш опрос</div>
<span>
<div class="cont">
lllljhkjhkhk
</div>
</span>
</div>


h_block заменил на block_icon

makar3000 31.07.2011 18:55

Код javascript:

<script type="application/javascript" src="http://yandex.st/jquery/1.6.2/jquery.min.js"></script>
<script type="application/javascript" src="http://yandex.st/jquery/cookie/1.0/jquery.cookie.min.js"></script>

<script type="application/javascript">
    plus = './images/plus.png';
    minus = './images/minus.png';
// управляющий скрытием\показом
var $this = $(".block_icon"),
        // что будем скрывать\показывать.
        $el = $this.next().next('span');

// true, если будем закрывать,
// false, если будем открывать
function toggle(closing){
    
    $this.html( closing ? "<img src='" + plus + "' alt='' />" : "<img src='" + minus + "' alt='' />" );
    $el[ closing ? "hide" : "show" ]();
    
};

$(function(){
    // если сохранено состояние.
    var cookie = $.cookie('block_hided');
    // передаем Boolean;
    if( cookie !== null ) toggle( !!(+cookie) );
    
})
    
$(".block_icon").click(function(){
    // кликнутый эл
    $this = $(this);
        // эл, с которым будем взаимодействовать
        $el = $this.next().next('span');
    

    var closing = $el.is(":visible");
    
    // 0 или 1
    $.cookie('block_hided', closing*1 );
    
    toggle( closing ); 
});
</script>

melky 31.07.2011 19:14

тебе надо, чтобы у нескольких блоков было сохранение ?

это уже за деньги. и не ко мне ( я ухожу сейчас на неделю )

makar3000 31.07.2011 19:16

Конечно!! Я же дал тот код...


Часовой пояс GMT +3, время: 11:42.