 
			
				16.07.2015, 20:21
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.02.2015 
					
					
					
						Сообщений: 24
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Ассоциативные массивы, не работает
			 
			
		
		
		
		Доброго времени суток, уважаемые форумчане! 
есть функция валидации полей вида: 
 
RikkiValidInput(this, /(^(\d+-)*\d+$)/, '', 'input-group has-success', 'input-group', '', '', '');
function RikkiValidInput(element, reg, aler, sClass, eClass, clr, idSpan, num) {
    if (reg.test(element.value)) {
        if (idSpan) {
            var count = num - element.value.length;
            $(idSpan).html(count);
            if (element.value.length <= num) {
                element.parentNode.className = sClass;
            } else {
                element.parentNode.className = eClass;
            }
        } else {
            element.parentNode.className = sClass;
        }
    } else if (element.value) {
        if (clr) {
            element.parentNode.className = clr;
            element.value = "";
            if (idSpan) {
                $(idSpan).hide();
            }
        } else {
            element.parentNode.className = eClass;
        }
        if (aler) {
            alert(aler);
        }
    }
    return false;
}
хочу привести к цивилизованному виду:
 
var numberSet {
	reg: /(^(\d+-)*\d+$)/,
	aler: '',
	sClass: 'input-group has-success',
	eClass: 'input-group',
	clr: '',
	idSpan: '',
	num: ''
}
RikkiValidation(this, numberSet);
function RikkiValidation(element, valSet) {
    if (reg.test(element.value)) {
        if (valSet.idSpan) {
            var count = valSet.num - element.value.length;
            $(valSet.idSpan).html(count);
            if (element.value.length <= valSet.num) {
                element.parentNode.className = valSet.sClass;
            } else {
                element.parentNode.className = valSet.eClass;
            }
        } else {
            element.parentNode.className = valSet.sClass;
        }
    } else if (element.value) {
        if (valSet.clr) {
            element.parentNode.className = valSet.clr;
            element.value = '';
            if (valSet.idSpan) {
                $(valSet.idSpan).hide();
            }
        } else {
            element.parentNode.className = valSet.eClass;
        }
        if (valSet.aler) {
            alert(valSet.aler);
        }
    }
    return false;
}
ну в общем, во втором исполнении не валидирует, где ошибка? 
и насколько безопасно применять ассоциативные массивы?  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.07.2015, 22:06
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от ru_rikki
			
		
	 | 
 
	| 
		где ошибка?
	 | 
 
	
 
 12 строка  , консоль смотрите  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.07.2015, 00:06
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 31.01.2015 
					
					
					
						Сообщений: 576
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 В самой первой строке еще ошибка. После объявления переменной должен идти оператор присвоения. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.07.2015, 06:31
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 23.10.2010 
					
					
					
						Сообщений: 2,718
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от ru_rikki
			
		
	 | 
 
	| 
		numberSet
	 | 
 
	
 
 Цивилизованный вид потребует изменить рендер полей. Реги прописываются в атрибут pattern, контекстные сообщения об ошибках в какой-нибудь data-err, с которым можно конкатенировать placeholder. Рендер ошибок - просто метод или функция с опциями куда чего пихать. Например
 
<input type="tel" pattern="([0-9][ ()+-]*){10,11}$" placeholder="+7 (123) 456-78-90" data-err="Введите номер телефона в федеральном формате 10-11 цифр" value="" name="some"/>
<!-- пример с реальной формы -->
<input data-index="2" maxlength="100" name="comeback[2]" pattern="^[^\s@]+@[^\s@]+\.[^\s@]+$" errmsg="oшибка в адресе, образец: " placeholder="email@example.com" required="5" type="email">
Дальше все вроде понятно. Скрипт пробегает по полям, берет значение, паттерн, проверяет, если косяк - вызывает рендер ошибки, та берет из переданного инпута дата-ерр+плейсхолдер и выводит куда-то, и объявляет инвалидом этот инпут и не дает кнопке нажиматья.
 
Это модель для текстов. Номера, диапазоны, чекбоксы, радио и списки потребуют своей модели. Но самая жирная модель будет у файлового поля. Тем не менее схема передачи условий та же самая - все необходимое лежит в инпуте.
 
Выбор модели определяется типом поля.  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось kostyanet, 17.07.2015 в 06:36.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.07.2015, 06:55
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 23.10.2010 
					
					
					
						Сообщений: 2,718
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Разрешите задать свой вопрос, тоже касательно цивилизованных методов. Как сделать чтобы рулезы не размножались с каждым объектом, а существовали как общий для всех объектов метод, то есть прототипом?  
О чем я выше писал, сейчас сделано вот так:
 
var FormField=function(el){
	var	type=		el.type,
		value=		el.value.trim(),
		pat=		el.getAttribute('pattern'),
		req=		el.getAttribute('required'),
		err=		el.getAttribute('errmsg')+"\n"+el.getAttribute('placeholder'),
		rules={
			'text':function(){
				var len=value.length;
				if(req && len<req)
					throw 'Минимальное количество знаков: '+req;
				else if(len && pat && !new RegExp(pat).test(value))
					throw err;
			},
			'select-one':function(){
				if(el.selectedIndex<0 && req)
					throw 'Необходимо выбрать из списка';
			},
			'select-multiple':function(){
				var mul=el.getAttribute('multiple'),
				for(var count=0, i=0; i<el.length; i++)
					if(el[i].selected)
						count++;
				if(req && count<req)
					throw 'Необходимо выбрать не меньше чем '+req;
				else if(mul && count>mul)
					throw 'Можно выбрать не больше чем '+mul;
			}
		};
	return {
		el:el,
		error:null,
		title:el.title,
		validate:function() {
			if(type in rules)
				rules[type]();
			else
				rules.text();
		}
	};
};
В блоке инициализации каждому полю сопоставляется этот объект и все объекты сохраняются в объект-массив по именам полей. 
 
Как я понимаю приватный объект rules размножается, то есть копируется, а хотелось бы понять как его вынести в прототип. Спасибо.  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.07.2015, 08:14
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 07.11.2013 
					
					
					
						Сообщений: 214
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		kostyanet, а если так:
 
validate: (type in rules) ? rules[type] : rules.text
  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.07.2015, 08:42
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.02.2015 
					
					
					
						Сообщений: 24
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Decode, спасибо 
	
 
	
		
			Сообщение от рони
			 
		
	 | 
 
	| 
		12 строка  , консоль смотрите
	 | 
 
	
 
  в 12й строке все без изменений if (reg.test(element.value)) { как и в случае с работающим вариантом. Возможно синтаксис неверный, я плохо понимаю в js 
kostyanet, попробую осилить, но сначала надо с элементарными вещами разобраться 
area элементы уже местами использую благодаря bootstrap) 
вот с исправлениями и все равно не валидирует:
 
echo "<script type='text/javascript'>
var numberSet = {
	reg: /(^(\d+-)*\d+$)/,
	aler: '',
	sClass: 'input-group has-success',
	eClass: 'input-group',
	clr: '',
	idSpan: '',
	num: ''
}
</script>";
$RIA_number = array(
	'simpleInGr' => '1', 
	'pTxt' => $locale['search103'],
	'pClass' => 'text-muted',
	'inputName' => 'on_number', 
	'divClass' => 'input-group',
	'spanTitle' => $locale['search104'],
	'inputClass' => 'form-control text-center', 
	'value' => '',
	'maxlength' => '20', 
	'placeholder' => $locale['search105'], 
	'js' => "onClick=\"clearInput(this, 'input-group', '');\" onKeyup=\"RikkiValidation(this, numberSet);\"", 
	'readonly' => ''
);
echo $RikkiInput->RikkiTxt($RIA_number);
function RikkiValidation(element, valSet) {
    if (reg.test(element.value)) {
        if (valSet.idSpan) {
            var count = valSet.num - element.value.length;
            $(valSet.idSpan).html(count);
            if (element.value.length <= valSet.num) {
                element.parentNode.className = valSet.sClass;
            } else {
                element.parentNode.className = valSet.eClass;
            }
        } else {
            element.parentNode.className = valSet.sClass;
        }
    } else if (element.value) {
        if (valSet.clr) {
            element.parentNode.className = valSet.clr;
            element.value = '';
            if (valSet.idSpan) {
                $(valSet.idSpan).hide();
            }
        } else {
            element.parentNode.className = valSet.eClass;
        }
        if (valSet.aler) {
            alert(valSet.aler);
        }
    }
    return false;
}
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось ru_rikki, 17.07.2015 в 08:48.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.07.2015, 09:07
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 23.10.2010 
					
					
					
						Сообщений: 2,718
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от ru_rikki
			
		
	 | 
 
	| 
		if (reg.test(element.value)) {
	 | 
 
	
 
 Откуда у вас reg берется? Ну был бы глобальным объектом, но все равно туда надо регу-то засунуть сперва.
 
ЗЫ Такое впечатление что вы дописываете что-то свое в какой-то фреймворк.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.07.2015, 09:19
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.02.2015 
					
					
					
						Сообщений: 24
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		нет это мое и не самый лучший вариант прототипа как я поняла. Первую функцию вместе с  Rise вывели) теперь хочу сделать по типу php с хранением данных в ассоциативных массивах. Убрала reg все равно не валидирует 
это не фреймворк, это код для быстрой записи html
 
public function RikkiTxt($RIA) {
	$RikkiTxt = "";
	if ($RIA['inputClass'] != 'hide') $RikkiTxt .= "<p".(!empty($RIA['pClass']) ? " class='".$RIA['pClass']."'" : "").">".(!empty($RIA['pTxt']) ? "<br>".$RIA['pTxt'] : "")."</p>".PHP_EOL;
	if (isset($RIA['simpleInGr']) || isset($RIA['countInGr']) || isset($RIA['rightInGr']) || isset($RIA['dblInGr'])) $RikkiTxt .= "<div id='idDi".$RIA['inputName']."' class='".$RIA['divClass']."'>".PHP_EOL;
	if (isset($RIA['simpleInGr']) || isset($RIA['dblInGr'])) {
		$RikkiTxt .= "<span class='input-group-addon'>".(!empty($RIA['spanTitle']) ? $RIA['spanTitle'] : "")."</span>".PHP_EOL;
	} elseif (isset($RIA['countInGr'])) {
		$RikkiTxt .= "<span class='input-group-addon'>".(!empty($RIA['spanTitle']) ? $RIA['spanTitle'] : "")."<span id='idSp".$RIA['inputName']."' class='".$RIA['countSpanClass']."'>".($RIA['maxlength']-2)."</span></span>".PHP_EOL;
	}
	$RikkiTxt .= "<input type='text' id='id".$RIA['inputName']."' name='".$RIA['inputName']."' class='".$RIA['inputClass']."' value='".$RIA['value']."'".(!empty($RIA['maxlength']) ? " maxlength='".$RIA['maxlength']."'" : "").(!empty($RIA['placeholder']) ? " placeholder='".$RIA['placeholder']."'" : "").(!empty($RIA['js']) ? " ".$RIA['js'] : "").(!empty($RIA['readonly']) ? " readonly" : "").">".PHP_EOL;
	if (isset($RIA['rightInGr']) || isset($RIA['dblInGr'])) {
		$RikkiTxt .= "<span class='input-group-addon'>".(!empty($RIA['eSpanTitle']) ? $RIA['eSpanTitle'] : "")."</span>".PHP_EOL;
	}
	if (isset($RIA['simpleInGr']) || isset($RIA['countInGr']) || isset($RIA['rightInGr']) || isset($RIA['dblInGr'])) $RikkiTxt .= "</div>".PHP_EOL; 
	return $RikkiTxt;
  }
но в JS я 0++ )  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось ru_rikki, 17.07.2015 в 09:26.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.07.2015, 09:29
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 23.10.2010 
					
					
					
						Сообщений: 2,718
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от ru_rikki
			
		
	 | 
 
	| 
		нет это мое
	 | 
 
	
 
 Это какая-то каша. Мое не мое, тут играть тут не играть, тут рыбу заворачивали...
 
Что вы называете валидацией - какой-то колхозный рендер ошибок. Он вообще тут не нужен в контексте обсуждения как сделать валидацию. Никого не колышет как эти ошибки рендерятся, как убираются, как все остальное. 
 
	
 
	| 
		
			Сообщение от ru_rikki
			
		
	 | 
 
	| 
		еперь хочу сделать по типу php с хранением данных в ассоциативных массивах
	 | 
 
	
 
 
У вас рендер формы (полей) на сервере или в браузере? Ну, применительно к рубрике - поля уже есть в хтмле, или жаба их рисует по полученным откуда-то данным?
 
Дело в том что нет никакого смысла передавать одновременно и поля и эти массивы для контроля за полями, ибо можно на сервере раскидать все по хтмлю, а в браузере собрать все обратно. Это имеет смысл, ибо часть атрибутов работает и без скриптов, например maxlength и вообще в перспективе можно будет заюзать встроенную в браузеры валидацию когда она наконец там закрепится.
 
Ну вот, пример такого рода я привел - когда из массива в пхп мы делаем инпуты, а потом с инпутов собираем обратно в массив объектов со своими встроенными методами проверки в браузере.  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось kostyanet, 17.07.2015 в 09:32.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |