Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Минимальное ограничение на количество символов (https://javascript.ru/forum/dom-window/64472-minimalnoe-ogranichenie-na-kolichestvo-simvolov.html)

zhemkan 13.08.2016 22:24

Минимальное ограничение на количество символов
 
Всем привет!
Бьюсь уже который час, а задачу решить не могу. Установлен CKeditor (пробовал и другие wysiwyg-редакторы). Необходимо сделать проверку на минимальное количество символов в поле.
Код:
function validateform()
	{
		var errors=0;
		var dlina = 0; 
		dlina = document.getElementById('n_text').value.length;
		if (dlina<200)
			errors=2;
		
		
		if (errors==2)
		{
			alert ("Слишком мало символов!");	
			return false;
		}
		else
		{
			return true;
		}
	}


<form method="POST" action="<?php echo $_SERVER['REQUEST_URI']; ?>" onsubmit="return validateform()">
<div class="reg_tr">
		<textarea cols="45" rows="5" name="n_text" class="reg_textarea" id="n_text">Текст...</textarea>
	</div>	
<input type="submit" value="Отправить">	
	<script type="text/javascript">
		CKEDITOR.replace( 'n_text');
	</script>	
	</form>


Так вот после загрузки страницы при вводе необходимого количества символов в редакторе и после нажатия на кнопку "Отправить" я получаю сообщение об ошибке. После повторного нажатия на кнопку "Отправить" - успешный результат.

Приблизительный принцип работы wysiwyg-редакторов я понимаю, знаю, что мой textarea подменяется другим. Как мне сделать так, чтобы после нажатия на кнопку "Отправить" система сразу получала актуальное количество символов в textarea? Согласен даже на грабли (имитация двойного нажатия или что-то еще), но мне очень необходимо избавиться от двойного нажатия для отправки сообщения.

zhemkan 14.08.2016 01:12

Цитата:

Сообщение от Rise (Сообщение 425357)
Очень информативно... сообщением не желаешь поделиться... помогай себе сам тогда...

Все указано, достаточно лишь прочесть код внимательно. Под ошибкой понимается алерт:
alert ("Слишком мало символов!");

warren buffet 14.08.2016 06:55

Rise, в смысле он сам ее генерит и сам же получает. )))

ТС, тебе надо запустить валидацию полей формы перед отправкой.

var MAXNTEXTLENGTH = 200;

form.addEventlistener('submit',function(e){

    if(form.n_text.value.trim().length<MAXNTEXTLENGTH) {
        e.preventDefault();
        alert('Text must be longer than '+ MAXNTEXTLENGTH +' characters');
        return false;
    }

});


Или типа того. Только придумай что-нибудь другое вместо алерта. Какой-нить элемент показывай с текстиком. Я уж не говорю о нормальной валидации тут с инвалидами и подсказками, но алерт - это серпом по яйкам юзера.

warren buffet 14.08.2016 07:10

Если у тебя много проверок, типа я заметил номер в errors, то раздели

var MAXNTEXTLENGTH = 200,

abuse='fuck,suck,dick,pussy',

msgs={
    2:'Text must be longer than '+ MAXNTEXTLENGTH +' characters',
    3:'Text should not contains words like '+abuse,
},

validate=function(){

    var txt = form.n_text.value.trim();

    if(txt.length<MAXNTEXTLENGTH) throw 2;

};

form.addEventlistener('submit',function(e){

    try{
        validate();
    }
    catch(msgn){
        e.preventDefault();
        alert(msgs[msgn]);
        return false;
    };

});

zhemkan 14.08.2016 14:24

<script>
function validateform()
	{
		var MAXNTEXTLENGTH = 200,

abuse='fuck,suck,dick,pussy',

msgs={
    2:'Text must be longer than '+ MAXNTEXTLENGTH +' characters',
    3:'Text should not contains words like '+abuse,
},

validate=function(){

    var txt = form.n_text.value.trim();

    if(txt.length<MAXNTEXTLENGTH) throw 2;

};

form.addEventlistener('submit',function(e){

    try{
        validate();
    }
    catch(msgn){
        e.preventDefault();
        alert(msgs[msgn]);
        return false;
    };

});
}
</script>


или

<script>
function validateform()
	{
var MAXNTEXTLENGTH = 200;

form.addEventlistener('submit',function(e){

    if(form.n_text.value.trim().length<MAXNTEXTLENGTH) {
        e.preventDefault();
        alert('Text must be longer than '+ MAXNTEXTLENGTH +' characters');
        return false;
    }

});	
}
</script>


не вызывают вообще никаких реакций при выполнении.

Ckeditor создает поверх моего textarea свой Body внутри Iframe. Актуальное количество символов передается в мой textarea только после выполнения функции.
Я добавил alert (dlina);, сразу после загрузки страницы я нажимаю "Отправить", получаю в окошке цифру 8, что соответствует кол-ву символов в строке "Текст...", который по умолчанию загружается в textarea при загрузки страницы. Если я добавлю еще 2 символа после "Текст...", то по нажатию "Отправить" я снова вижу 8, однако, если я ничего не изменяю, и снова нажимаю на "Отправить", то уже получаю актуальное значение - 10. И так всегда - актуальное значение я вижу только после двойного нажатия (двойного запуска функции).
Как избавиться от этого, учитывая такую особенность ckeditor?

warren buffet 15.08.2016 11:25

Цитата:

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

Количество символов передается? Короче, читай мануал на свой едитор. Если он не передает текст в поле из своей лапши после каждого действия в лапше, то значит что-то там настроено/сконфигурировано/нарисовано у тебя неправильно.

zhemkan 15.08.2016 13:58

Цитата:

Сообщение от warren buffet (Сообщение 425433)
Количество символов передается? Короче, читай мануал на свой едитор. Если он не передает текст в поле из своей лапши после каждого действия в лапше, то значит что-то там настроено/сконфигурировано/нарисовано у тебя неправильно.

Настроено и сконфигурировано все "по умолчанию", так, как это предусматривает разработчик эдитора.

warren buffet 15.08.2016 15:11

Значит в textarea лежит в точности тот текст, который в каше едитора, ибо по submit ты имеешь право отгрузить форму со всем что ввел. А с твоих слов выходит, что уходит пустое поле.

zhemkan 15.08.2016 16:44

Я повторяю, что если я делаю
var dlina = 0;
dlina = document.getElementById('n_text').value.length;
alert (dlina);

то значение dlina обновляется до актуального только после второго нажатия на кнопку "Отправить".
Код формы:
<form method="POST" action="<?php echo $_SERVER['REQUEST_URI']; ?>" onsubmit="return validateform()">
<div class="reg_tr">
		<textarea cols="45" rows="5" name="n_text" class="reg_textarea" id="n_text">Текст...</textarea>
	</div>	
<input type="submit" value="Отправить">	
	<script type="text/javascript">
		CKEDITOR.replace( 'n_text');
	</script>	
	</form>

Я уже не знаю, как подробнее описать то свою проблему...

warren buffet 15.08.2016 21:42

Цитата:

action="<?php echo $_SERVER['REQUEST_URI']; ?>"
Можешь оставить пустым action, пойдет на текущий адрес, то есть на риквест ури.

Второе, не надо пихать скрипт в форму, то есть это вообще не обязательно, а создается впечатление, что это важно. Запускай замену после формы, скедитор все равно ищет поле по id

Третье. В каком месте это самое "если я делаю"? Вот как в сообщении - перед формой что ли?

Короче, скедитор ничего не знает про твои форму и субмиты и на все кроме одного текстового поля ему положить. И в этом текстовом поле значение изменяется в точности так же, как если бы юзер вводил прямо в него.

Ну убери скедитор на время и проверь ничего больше не меняя - когда твоя актуальная длина объявится.


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