Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Блокировка определённых option у select (https://javascript.ru/forum/jquery/33832-blokirovka-opredeljonnykh-option-u-select.html)

mi.rafaylik 10.12.2012 18:41

.keyup или .change
 
С помощью .keyup я реализовал проверку количества введённых символов, отличный атрибут.
В данном же случае я решил задачу таким образом:

$('#myinput').change(function(){
	if($(this).val() != ''){
		if($(this).val().search('Ключевое слово') == 0){
			Выполнение следующих функций
		}else{
			Не выполнять следующие функции
		}
	}
});


Спасибо всем. Познакомили меня с keyup поближе, который я тут же применил, и подтолкнули в решению :)

Serg_pnz 10.12.2012 19:37

Тогда и $.trim() до кучи надо юзать

mi.rafaylik 11.12.2012 11:58

Вопрос в продолжение.
1. В myinput вводится кодовое слово.
2. Если совпадение найдено, выполняется действие - в myselect выбирается option 3 (добавляется атрибут selected), а option 2 и 4 блокирует (добавляется атрибут disabled). Всё отлично.
3. Но (! отступление) оба эти элемента находятся в форме myform которая отправляется методом $_POST, и здесь через PHP сервер проверяет правильно ли заполнены поля, и, если неправильно, сервер возвращает форму с сообщением о незаполненных полях.

В случае с input или textarea я просто могу вернуть value с помощью PHP вот так:
<input name="myinput" id="myinput" value='<?php if($_POST["myinput"]) { echo $_POST["myinput"]; } ?>'>

Но с элементом select такое не проходит..
Записать состояние myselect конечно можно и с помощью jQuery cookies:
$(document).ready(function(){
	$('#myselect').change(function(){$.cookie('myselect', $(this).attr('value'));});
});

Но в в этом случае состояние записывается, только если произошёл именно выбор .change (нажатие на этом элементе myselect).
То есть я не могу применить этот метод, если состояние myselect изменено с помощью ввода ключевого слова в myinput, т.к. здесь не было фактического нажатия (выбора) на элементе myselect.
Возможно я что-то упустил, и вместо .change для записи куки нужно использовать что-то другое.. :(

Конечно, как вариант решения - валидировать форму на правильность заполненных полей можно и через jQuery, но в самой форме есть captcha, и тогда получается проблема с сессиями, т.к. без перезагрузки страницы не открывается новая сессия..

Вопрос: Как сохранить состояние myselect (какие option выбраны, а какие блокированы), если состояние этого элемента было изменено без нажатия на него (с помощью другого элемента), после проверки формы и перезагрузки страницы?
Есть мысли по этому поводу?

Напомню структуру формы:
<form name="myform" id="myform">
    <input name="myinput" id="myinput">
    <select name="myselect" id="myselect">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
    </select>
</form>

ОлегА 11.12.2012 13:30

1. Можно просто отправлять форму ajax'ом и тогда myselect у тебя останется таким каким он был перед отправкой формы.
2. запоминать value у option's в куки, те что нашлись в куках, те значит не disabled, а остальные disabled или наоборот

mi.rafaylik 11.12.2012 13:42

ОлегА, Спасибо, попробую вторым способом, правда пока не знаю как записывать куки именно для option.
Здесь похожую задачу обсуждают, постараюсь разобраться.

Не хочется на ajax форму валидировать, т.к. для капчи не будет открываться новая сессия, т.е. сама капча будет обновляться, но в текущей сессии, что не есть феншуй как мне кажется.

ОлегА 11.12.2012 14:37

Ну сессию можно обновлять через тот же аякс, как вариант.

а насчет как сохранять просто все

$('#myselect option').each(function(i){
    if(! $(this).attr('disabled')){
         options = { path: "/", expires: 10 };

         $.cookie('myselect_value['+i+']', $(this).value(), options);
    } 
});


сам не проверял данный код, но как то так вроде

mi.rafaylik 11.12.2012 19:06

Цитата:

Сообщение от ОлегА (Сообщение 220775)
а насчет как сохранять просто все
$('#myselect option').each(function(i){
    if(! $(this).attr('disabled')){
         options = { path: "/", expires: 10 };

         $.cookie('myselect_value['+i+']', $(this).value(), options);
    } 
});

сам не проверял данный код, но как то так вроде

Попробовал, ВСЕ option становятся заблокированными после перезагрузки страницы..

ОлегА 11.12.2012 23:37

ну если бы я протестил, добил конечно, ну да ладно, рад помочь)

mi.rafaylik 12.12.2012 01:18

ОлегА буду рад если поможете ))
Попробовал реализовать запись состояния блокированного option вот так:
$(document).ready(function(){
	//записываем куки для конкретного option
	$('#myselect').change(function(){$.cookie('myselect-option1', $('#myselect option').eq(1).attr('disabled'));}); 
	//читаем куки для этого option
	$('#myselect option').eq(1).attr('disabled', $.cookie('myselect-option'));
});

То есть если option 1 блокируется, это состояние записывается в куки и после перезагрузки страницы он остаётся блокированным.
Но (!) если после этого снять блокировку фактически, то разблокированное состояние в куки не записывается, и этот option и дальше остаётся заблокированным..
Думаю, происходит это потому, что если элемент разблокирован, то у него пропадает атрибут disabled="disabled", а значит в куки новое состоние разблокированное не записывается. Как быть?

ОлегА 12.12.2012 08:27

дело в том что вы
$('#myselect option').eq(1).attr('disabled', $.cookie('myselect-option'));
тут и включаете блокировку option, т.к атрибуту без разницы будет он disabled=true или disabled=false - это все равно означает блокировку делайте что то типа этого -

if($.cookie('myselect-option') === true){
$('#myselect option').eq(1).attr('disabled','disabled');
}


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