Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не разобрался с применением js и куки для нескольких select (https://javascript.ru/forum/misc/48392-ne-razobralsya-s-primeneniem-js-i-kuki-dlya-neskolkikh-select.html)

tart 02.07.2014 07:43

Не разобрался с применением js и куки для нескольких select
 
Здравствуйте!
Нужен совет.

Есть select с option

<select name="select" onchange="fn()">
              <option>1</option>
              <option>2</option>
              <option>3</option>
	</select>

И js

function getCookie(name) {
    var matches = document.cookie.match(new RegExp(
      "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
    ))
    return matches ? decodeURIComponent(matches[1]) : undefined
}       
            function setCookie(name, value, props) {
    props = props || {}
    var exp = props.expires
    if (typeof exp == "number" && exp) {
        var d = new Date()
        d.setTime(d.getTime() + exp*3153600000)
        exp = props.expires = d
    }
    if(exp && exp.toUTCString) { props.expires = exp.toUTCString() }
 
    value = encodeURIComponent(value)
    var updatedCookie = name + "=" + value
    for(var propName in props){
        updatedCookie += "; " + propName
        var propValue = props[propName]
        if(propValue !== true){ updatedCookie += "=" + propValue }
    }
    document.cookie = updatedCookie
 
}
            
            function fn(){
               var elem= document.getElementsByName('select')[0]
               var currentOptionIndex= elem.selectedIndex;
                setCookie('OptionIndex', currentOptionIndex);
            }
            
            
            window.onload=function(){
                var elem= document.getElementsByName('select')[0];
                elem.selectedIndex=getCookie('OptionIndex') || 1;
            }


Не понял как мне применить еще для одного select и option, js выше.

рони 03.07.2014 01:08

tart,
:write:
<!DOCTYPE HTML>

<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <script>
        function getCookie(name) {
            var matches = document.cookie.match(new RegExp(
                "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
            ))
            return matches ? decodeURIComponent(matches[1]) : undefined
        }

        function setCookie(name, value, props) {
            props = props || {}
            var exp = props.expires
            if (typeof exp == "number" && exp) {
                var d = new Date()
                d.setTime(d.getTime() + exp * 3153600000)
                exp = props.expires = d
            }
            if (exp && exp.toUTCString) {
                props.expires = exp.toUTCString()
            }

            value = encodeURIComponent(value)
            var updatedCookie = name + "=" + value
            for (var propName in props) {
                updatedCookie += "; " + propName
                var propValue = props[propName]
                if (propValue !== true) {
                    updatedCookie += "=" + propValue
                }
            }
            document.cookie = updatedCookie

        }

        function fn(elem) {
            setCookie(elem.name, elem.selectedIndex);

        }


        window.onload = function () {
            var elems = document.getElementsByTagName('select');
            for (var i = 0; i < elems.length; i++) {
                var elem = elems[i],
                    c = getCookie(elem.name);

                elem.selectedIndex = c !== undefined ? c : 1;
            }

        }
    </script>
</head>

<body>
    <select name="select" onchange="fn(this)">
        <option>1</option>
        <option>2</option>
        <option>3</option>
    </select>
    <select name="select2" onchange="fn(this)">
        <option>1</option>
        <option>2</option>
        <option>3</option>
    </select>

</body>

</html>

Globus 23.07.2014 23:45

рони, а как можно сделать, чтобы всем селектам, содержание которых берется из куков, но не является первым (selectedIndex), присваивался какой-нибудь новый класс?

рони 23.07.2014 23:54

Globus,
попробуйте самостоятельно решить этот вопрос в 52 строке if() {} ; кука есть и она не 1 то мастачим класс.

Globus 24.07.2014 00:48

рони,
Спасибо! Я пробую такую конструкцию

if(elem.selectedIndex > 0) { document.getElementsByTagName('select').AddClass('22')} ;


если индекс выбранного option не равен нулю, то присваивается класс 22

но не уверен, что эта конструкция хотя бы отчасти правильна, вас не затруднит указать на ошибку?

рони 24.07.2014 01:05

Globus,
:cray: когда доки читать начнёте

if(c !== undefined && c !== '1') {elem.className = '22'};

Globus 24.07.2014 01:50

работает! спасибо!

Globus 26.07.2014 21:00

Рони, подскажите, пожалуйста, в этого же скрипта можно ли присваивать "22" класс селекту, у которого индекс option перестал быть равным = '1' ?

Globus 27.07.2014 20:56

А главное - Важный вопрос: можно ли, чтобы куки с каждого селекта записывались не при onchange="fn()" , а при нажатии на одну кнопку, например, <input type="button" name="save" value="saveall"> ?

рони 27.07.2014 21:00

Globus,
можно сделайте циклом обход селектов ... сам сам ... пора уже

Globus 27.07.2014 22:53

Цитата:

Сообщение от рони (Сообщение 322945)
Globus,
можно сделайте циклом обход селектов ... сам сам ... пора уже

Просидел три часа к ряду, переписывал несколько раз код, ничего не удалось сделать....


function savecook(elem) {
	var sele = document.getElementsByTagName('select');
	var i;
	for (i=0; i<sele.length; i++) { 
	setCookie(elem.name, elem.selectedIndex); 
		}
	};
      
        window.onload = function () {
            var elems = document.getElementsByTagName('select');
            for (var i = 0; i < elems.length; i++) {
                var elem = elems[i],
                    c = getCookie(elem.name);

                elem.selectedIndex = c !== undefined ? c : 0;
            }

        }
    </script>
</head>

<body>
    <select name="select">
        <option>0</option>
        <option>1</option>
        <option>2</option>
    </select>
    <select name="select2">
        <option>0</option>
        <option>1</option>
        <option>2</option>
    </select>
  
<input type="button" name="save" onclick="savecook(this)" value="save_all">


:help:

рони 27.07.2014 22:58

Globus,
и где цикл который обходит все select ?

Globus 27.07.2014 23:50

Пардон, не тот кусок кода скинул, отредактировал сообщение выше... посмотрите, пожалуйста

рони 28.07.2014 00:26

Цитата:

Сообщение от Globus
savecook(elem)

Цитата:

Сообщение от Globus
savecook(this)

смотрите на строку 12 и сделайте соотвественно

Globus 28.07.2014 00:37

function savecook() {
	var sele = document.getElementsByTagName('select');
	for (var=0; i < sele.length; i++) { 
	        setCookie(elem.name, elem.selectedIndex); 
		}
	};
      
        window.onload = function () {
            var elems = document.getElementsByTagName('select');
            for (var i = 0; i < elems.length; i++) {
                var elem = elems[i],
                    c = getCookie(elem.name);

                elem.selectedIndex = c !== undefined ? c : 0;
            }

        }
    </script>


.........


<input type="button" name="save" onclick="savecook()" value="save_all">


а теперь как?

рони 28.07.2014 00:40

Globus,
откуда в строке 4 elem ?
Цитата:

Сообщение от рони
смотрите на строку 12 и сделайте соотвественно


Globus 28.07.2014 01:09

В 12-ой строке вижу только var elem = elems[i],


function savecook() {
var sel = document.getElementsByTagName('select');
var i;
            for (var i=0; i < sel.length; i++) {
                var sel = sels[i],
                    b = getCookie(sel.name);
                sel.selectedIndex = b !== undefined ? c : 0;

	};
      
        window.onload = function () {
            var elems = document.getElementsByTagName('select');
            for (var i = 0; i < elems.length; i++) {
                var elem = elems[i],
                    c = getCookie(elem.name);

                elem.selectedIndex = c !== undefined ? c : 0;
            }

        }
    </script>


.........


<input type="button" name="save" onclick="savecook()" value="save_all">

рони 28.07.2014 01:15

:-/

function savecook() {
    var elems = document.getElementsByTagName('select');
    for (var i = 0; i < elems.length; i++) {
         var elem = elems[i];
        setCookie(elem.name, elem.selectedIndex);
    }
};

Globus 28.07.2014 01:42

+ :thanks:

indeec14 31.08.2017 18:33

Цитата:

Сообщение от рони (Сообщение 319253)
tart,
:write:
<!DOCTYPE HTML>

<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <script>
        function getCookie(name) {
            var matches = document.cookie.match(new RegExp(
                "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
            ))
            return matches ? decodeURIComponent(matches[1]) : undefined
        }

        function setCookie(name, value, props) {
            props = props || {}
            var exp = props.expires
            if (typeof exp == "number" && exp) {
                var d = new Date()
                d.setTime(d.getTime() + exp * 3153600000)
                exp = props.expires = d
            }
            if (exp && exp.toUTCString) {
                props.expires = exp.toUTCString()
            }

            value = encodeURIComponent(value)
            var updatedCookie = name + "=" + value
            for (var propName in props) {
                updatedCookie += "; " + propName
                var propValue = props[propName]
                if (propValue !== true) {
                    updatedCookie += "=" + propValue
                }
            }
            document.cookie = updatedCookie

        }

        function fn(elem) {
            setCookie(elem.name, elem.selectedIndex);

        }


        window.onload = function () {
            var elems = document.getElementsByTagName('select');
            for (var i = 0; i < elems.length; i++) {
                var elem = elems[i],
                    c = getCookie(elem.name);

                elem.selectedIndex = c !== undefined ? c : 1;
            }

        }
    </script>
</head>

<body>
    <select name="select" onchange="fn(this)">
        <option>1</option>
        <option>2</option>
        <option>3</option>
    </select>
    <select name="select2" onchange="fn(this)">
        <option>1</option>
        <option>2</option>
        <option>3</option>
    </select>

</body>

</html>

Круто! А как можно провернуть такую же фишку, только с input, radio и др.? На приведенном примере

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

рони 31.08.2017 19:04

indeec14,
https://javascript.ru/forum/jquery/5...tml#post394089
<form action="http://">
//тут ваши элементы
<input name="" type="reset" value="">
</form>

indeec14 31.08.2017 19:38

Спасибо.

<input name="" type="reset" value="">
пробовал, сбрасывает форму, но после перезагрузки страницы опять селекты на своих местах, как записались в куки. Я как раз ищу вариант для того, чтобы аналогичной кнопочкой (если такой вариант существует) созданные куки очищать, сам пример взял из Вашего поста про запись селектов -
function getCookie(name) {
            var matches = document.cookie.match(new RegExp(
                "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
            ))
            return matches ? decodeURIComponent(matches[1]) : undefined
        }

        function setCookie(name, value, props) {
            props = props || {}
            var exp = props.expires
            if (typeof exp == "number" && exp) {
                var d = new Date()
                d.setTime(d.getTime() + exp * 3153600000)
                exp = props.expires = d
            }
            if (exp && exp.toUTCString) {
                props.expires = exp.toUTCString()
            }

            value = encodeURIComponent(value)
            var updatedCookie = name + "=" + value
            for (var propName in props) {
                updatedCookie += "; " + propName
                var propValue = props[propName]
                if (propValue !== true) {
                    updatedCookie += "=" + propValue
                }
            }
            document.cookie = updatedCookie

        }

        function fn(elem) {
            setCookie(elem.name, elem.selectedIndex);

        }


        window.onload = function () {
            var elems = document.getElementsByTagName('select');
            for (var i = 0; i < elems.length; i++) {
                var elem = elems[i],
                    c = getCookie(elem.name);

                elem.selectedIndex = c !== undefined ? c : 1;
            }

        }

рони 31.08.2017 19:54

indeec14,
ищите примеры с localStorage, они лаконичнее чем cookie

indeec14 31.08.2017 22:03

Цитата:

Сообщение от рони (Сообщение 463271)
indeec14,
ищите примеры с localStorage, они лаконичнее чем cookie

Благодарю! Да, действительно крутая штука, оказывается. Опережая свои вопросы, нашел хорошую шпаргалку по localstorage, с минимумом знаний и навыков за час сделал все, что было нужно. А с куками целый день проторчал в гугле и крайне мало понятной для себя информации нашел...

Оставлю это здесь, может кому пригодится: http://shpargalkablog.ru/2013/06/localStorage.html

Nexus 01.09.2017 10:09

Цитата:

Сообщение от indeec14
А с куками целый день проторчал в гугле и крайне мало понятной для себя информации нашел...

Там особо понимать-то и нечего, по сути это обычное хранилище информации на стороне клиента с некоторыми нюансами.
Работать с ними также просто, как и локальным хранилищем.

var c=cookie('CookieName');//Получить значение куки
if(!c)
   cookie('CookieName','CookieValue',1);//Если куки нет, то создать куку на сутки
else
    cookie('CookieName','-deleted-',-1);//Удалить куку


function cookie(name,value,days){
	if(value){
		var expires="";
		if(days){
			var date=new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			expires="; expires="+date.toGMTString();
		}
		document.cookie=name+"="+value+expires+"; path=/";

		return true;
	}else{
		var nameEQ=name+"=";
		var ca=document.cookie.split(';');
		for(var i=0;i<ca.length;i++){
			var c=ca[i];
			while(c.charAt(0)==' ') c=c.substring(1,c.length);
			if(c.indexOf(nameEQ)==0) return c.substring(nameEQ.length,c.length);
		}

		return null;
	}
};


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