Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Запретить ввод пустого сообщения (https://javascript.ru/forum/misc/78303-zapretit-vvod-pustogo-soobshheniya.html)

teplov 23.08.2019 10:07

Запретить ввод пустого сообщения
 
Всем привет!Есть чат,по кнопке send в чат отправляется пустое сообщение как от этого избавиться?Вот код формы
<div class="input-group" >
<form target="myIFR" action="" name="order">
<input id="text" type="text" class="form-control message_input" onclick ="var self = this; setTimeout(function(){self.value=''}, 50)" placeholder="введите текст" name="goodss" autocomplete="off" >
<iframe name="myIFR" style="display: none"></iframe>
</form>   
<span class="input-group-btn" >
<button  class="btn btn-secondary send_message" type="button"><i class="fa fa-send"></i><span class="glyphicon glyphicon-send"></span></button>
</span>
</div>

Malleys 23.08.2019 11:33

Цитата:

Сообщение от teplov
Есть чат,по кнопке send в чат отправляется пустое сообщение как от этого избавиться?

Добавьте к полю ввода атрибут required

Цитата:

Сообщение от teplov
<button  class="btn btn-secondary send_message" type="button">

Должно быть значение submit у атрибута type
<button  class="btn btn-secondary send_message" type="submit">
которое по-умолчанию можно пропустить. Кнопка должна находиться внутри формы. Таймер можно удалить.

Также вместо <i class="fa fa-send"></i><span class="glyphicon glyphicon-send"></span> можно указать просто текст. Тип текст можно не указывать.

<div class="input-group">
	<form target="myIFR" action="" name="order">
		<input id="text" class="form-control message_input" onclick="this.value='';" placeholder="введите текст" name="goodss" autocomplete="off" required>
		<iframe name="myIFR" style="display: none"></iframe>
		<span class="input-group-btn">
			<button class="btn btn-secondary send_message">Send</button>
		</span>
	</form>
</div>

laimas 23.08.2019 11:58

Цитата:

Сообщение от Malleys
Кнопка должна находиться внутри формы

Не обязательно, ее, и как любые поля формы, можно размещать вне тега form. С тегом формы поля связываются просто, посредством атрибута form.

teplov 23.08.2019 12:02

Немного не так видимо изложил свою проблему ,у меня в чате появляется сообщение даже если проверку ввода в поле включить,то есть оставить одну кнопку сенд и по ней можно чат заспамить пустыми сообщениями...

рони 23.08.2019 12:06

teplov,
а на сервере фильтровать пустые сообщения?

Malleys 23.08.2019 12:09

laimas, 👌 👍

В примере атрибут form не использовался (и на самой форме нет атрибута id), поэтому я решил, что там неправильно закрыт элемент.

laimas 23.08.2019 12:10

Цитата:

Сообщение от рони
на сервере фильтровать пустые сообщения?

Даже без вопросов, без этого никакая проверка на клиенте не поможет. )

Malleys 23.08.2019 12:11

Цитата:

Сообщение от teplov
Немного не так видимо изложил свою проблему ,у меня в чате появляется сообщение даже если проверку ввода в поле включить,то есть оставить одну кнопку сенд и по ней можно чат заспамить пустыми сообщениями...

Код, который обрабатывает отправку... там посмотрите, чтобы пустые сообщения не вставлялись.

Обычно то, что вы отправили вам не нужно сразу вставлять в чат. Нужно чтобы сервер всем прислал текст, включая вас. (Только у вас он будет отображаться как будто вы отправитель) Тогда вы точно будете уверены, что текст был отправлен, и соответственно только тогда можно очистить поле ввода (Поскольку вы получили ответ от сервера). А если сообщение не было отправлено, то и текстовое поле не нужно очищать (Поскольку его придётся вводить заново и ещё это создаёт ложное впечатление, будто бы текст был отправлен!)

Цитата:

Сообщение от рони
а на сервере фильтровать пустые сообщения?

А зачем вообще пустые сообщения отправлять?

teplov 23.08.2019 12:15

Вот я и не знаю как на сервере отфильтровать...чат на сокетах вот код скрипта чата
var getMessageText, sendMessage, Message;
Message = function (arg) {
    this.text = arg.text, this.message_side = arg.message_side;
    this.draw = function (_this) {
        return function () {
            var $message;
            var json = JSON.parse(_this.text);
            alertChat();
            return createMessage(json.text, json.name, json.photo, _this.message_side);
        };
    }(this);
    return this;
};
getMessageText = function () {
    var $message_input;
    $message_input = $('.message_input');
    return $message_input.val();
};
sendMessage = function (text, message_side) {
    var $messages, message;
    if (text.trim() === '') {
        return;
    }
    $messages = $('.messages');
    message = new Message({
        text: text,
        message_side: message_side
    });
    message.draw();
    return $messages.animate({scrollTop: $messages.prop('scrollHeight')}, 300);
};

function createMessage(text, name, photo, message_side){    
    $message = $($('.message_template').clone().html());    
    if(message_side==="left"){
        $message.find('.text_wrapper').removeClass("pull-left").addClass("pull-right");
        $message.find('.text_wrapper').removeClass("alert-info").addClass("alert-warning");
        $message.find('.name').removeClass("label-info").addClass("label-warning");
        $message.find('.avatar').removeClass("pull-right").addClass("pull-left");
    }
    $message.find('.text').html(text);
    $message.find('.name').html(name);
    $message.find('.photo').attr('src', photo);
    $('.messages').append($message);
    $message.addClass('appeared');
}

teplov 23.08.2019 12:27

Вот именно что пустые сообщения не нужны,получается пользователь жмет Enter и в чат летят пустышки,а где и что зафильтровать я не пойму,все перепробовал,но видимо не хватает у меня на старости лет ума (((

Malleys 23.08.2019 12:38

Цитата:

Сообщение от teplov
Вот именно что пустые сообщения не нужны,получается пользователь жмет Enter и в чат летят пустышки,а где и что зафильтровать я не пойму,все перепробовал,но видимо не хватает у меня на старости лет ума (((

У вас где-то должен быть обработчик события submit или click или в худшем случае keydown... там нужно смотреть

laimas 23.08.2019 12:40

Представленный код, это клиентская часть, а не серверная. Кроме проверки сообщения на пустоту также необходимо блокировать кнопку отправления на время запроса и снимать блокировку после его окончания. У вас форма отправляется естественным образом, а значит сервер должен быть защищен от такой напасти как F5.

teplov 23.08.2019 15:11

вот обработчик
<?php
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;


require_once dirname(__FILE__) . '/../../configuration.php';
require_once dirname(__FILE__) . '/Objects/ChatObj.php';

class Chat implements MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new \SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) {
        // Store the new connection to send messages to later
        $this->clients->attach($conn);
        echo "New connection! ({$conn->resourceId})\n";
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        $p = \Plugin::loadPlugin("Chat");
        $object = json_decode($msg);
        $canSendMessage = $p->canSendMessage($object->userId);
        if(empty($canSendMessage)){
            echo "Cant Send message\n";
            return false;
        }
        //var_dump($msg);
        echo "Saving message\n";
        $lc = new \ChatObj(0);
        $lc->setStatus('a');
        $lc->setText($object->text);
        $lc->setUsers_id($object->userId);
        $lc->save();
        
        $numRecv = count($this->clients) - 1;
        echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n"
            , $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's');

        foreach ($this->clients as $client) {
            if ($from !== $client) {
                $client->send($msg);
            }
        }
    }

    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);

        echo "Connection {$conn->resourceId} has disconnected\n";
    }

    public function onError(ConnectionInterface $conn, \Exception $e) {
        echo "An error has occurred: {$e->getMessage()}\n";

        $conn->close();
    }    
    
    public function getTags() {
        return array('free', 'chat');
    }
}

laimas 23.08.2019 15:47

Если метод canSendMessage(), это и есть полная проверка принятого сообщения, то пустота не запишется на сервере. А вот дубликаты вполне может принять, то есть обновление страницы по F5 или повторная отправка формы (нет блокировки).

А проблема отправления пустых сообщений клиентом, это в нем разбираться надо.

teplov 23.08.2019 15:56

получается нужно искать проблему тут
var getMessageText, sendMessage, Message;
Message = function (arg) {
    this.text = arg.text, this.message_side = arg.message_side;
    this.draw = function (_this) {
        return function () {
            var $message;
            var json = JSON.parse(_this.text);
            alertChat();
            return createMessage(json.text, json.name, json.photo, _this.message_side);
        };
    }(this);
    return this;
};
getMessageText = function () {
    var $message_input;
    $message_input = $('.message_input');
    return $message_input.val();
};
sendMessage = function (text, message_side) {
    var $messages, message;
    if (text.trim() === '') {
        return;
    }
    $messages = $('.messages');
    message = new Message({
        text: text,
        message_side: message_side
    });
    message.draw();
    return $messages.animate({scrollTop: $messages.prop('scrollHeight')}, 300);
};

function createMessage(text, name, photo, message_side){    
    $message = $($('.message_template').clone().html());    
    if(message_side==="left"){
        $message.find('.text_wrapper').removeClass("pull-left").addClass("pull-right");
        $message.find('.text_wrapper').removeClass("alert-info").addClass("alert-warning");
        $message.find('.name').removeClass("label-info").addClass("label-warning");
        $message.find('.avatar').removeClass("pull-right").addClass("pull-left");
    }
    $message.find('.text').html(text);
    $message.find('.name').html(name);
    $message.find('.photo').attr('src', photo);
    $('.messages').append($message);
    $message.addClass('appeared');
}

teplov 23.08.2019 16:00

Всем спасибо за подсказки,буду дальше читать литературу может разберусь,а нет снова обращусь )))

laimas 23.08.2019 16:14

Цитата:

Сообщение от teplov
получается нужно искать проблему тут

Тут if (text.trim() === '') {return;}, что в общем можно записать проще if (!text.trim()) return;, ибо trim() удалит пробелы и переводы строк (если есть), а булево значение пустой строки это false. У вас аля ajax, надо смотреть код отправления, то есть все вкупе.

teplov 24.08.2019 09:36

Всем день добрый!вот что нашел по свое проблеме,теперь пустышки в чат не отправляются но и сообщения при f5 не сохранятся ,исходный рабочи код (отправляются пустышки)
var getMessageText, sendMessage, Message;
Message = function (arg) {
    this.text = arg.text, this.message_side = arg.message_side;
    this.draw = function (_this) {
        return function () {
            var $message;
            var json = JSON.parse(_this.text);
            alertChat();
            return createMessage(json.text, json.name, json.photo, _this.message_side);
        };
    }(this);
    return this;
};
getMessageText = function () {
    var $message_input;
    $message_input = $('.message_input');
    return $message_input.val();
};
sendMessage = function (text, message_side) {
    var $messages, message;
    if (text.trim() === '') {
        return;
    }
    $messages = $('.messages');
    message = new Message({
        text: text,
        message_side: message_side
    });
    message.draw();
    return $messages.animate({scrollTop: $messages.prop('scrollHeight')}, 300);
};

function createMessage(text, name, photo, message_side){    
    $message = $($('.message_template').clone().html());    
    if(message_side==="left"){
        $message.find('.text_wrapper').removeClass("pull-left").addClass("pull-right");
        $message.find('.text_wrapper').removeClass("alert-info").addClass("alert-warning");
        $message.find('.name').removeClass("label-info").addClass("label-warning");
        $message.find('.avatar').removeClass("pull-right").addClass("pull-left");
    }
    $message.find('.text').html(text);
    $message.find('.name').html(name);
    $message.find('.photo').attr('src', photo);
    $('.messages').append($message);
    $message.addClass('appeared');
}
а это чем заменил (не проходят пустышки,но и не сохраняются сообщения при перезагрузке)
(function () {
    var Message;
    Message = function (arg) {
        this.text = arg.text, this.message_side = arg.message_side;
        this.draw = function (_this) {
            return function () {
                var $message;
                $message = $($('.message_template').clone().html());
                $message.addClass(_this.message_side).find('.text').html(_this.text);
                $('.messages').append($message);
                return setTimeout(function () {
                    return $message.addClass('appeared');
                }, 0);
            };
        }(this);
        return this;
    };
    $(function () {
        var getMessageText, message_side, sendMessage;
        message_side = 'right';
        getMessageText = function () {
            var $message_input;
            $message_input = $('.message_input');
            return $message_input.val();
        };
        sendMessage = function (text) {
            var $messages, message;
            if (text.trim() === '') {
                return;
            }
            $('.message_input').val('');
            $messages = $('.messages');
            message = new Message({
                text: text,
                message_side: message_side
            });
            message.draw();
            return $messages.animate({ scrollTop: $messages.prop('scrollHeight') }, 300);
        };
        $('.send_message').click(function (e) {
            return sendMessage(getMessageText());
        });
        $('.message_input').keyup(function (e) {
            if (e.which === 13) {
                return sendMessage(getMessageText());
            }
        });
        sendMessage('Hello');
       
    });
}.call(this));
        function createMessage(text, name, photo, message_side){    
    $message = $($('.message_template').clone().html());    
    if(message_side==="left"){
        $message.find('.text_wrapper').removeClass("pull-left").addClass("pull-right");
        $message.find('.text_wrapper').removeClass("alert-info").addClass("alert-warning");
        $message.find('.name').removeClass("label-info").addClass("label-warning");
        $message.find('.avatar').removeClass("pull-right").addClass("pull-left");
    }
    $message.find('.text').html(text);
    $message.find('.name').html(name);
    $message.find('.photo').attr('src', photo);
    $('.messages').append($message);
    $message.addClass('appeared');
}
где что не так сделал

laimas 24.08.2019 10:30

Цитата:

Сообщение от teplov
но и сообщения при f5 не сохранятся

Этого и не должно происходить, это неприятность для сервера, с которой приходится бороться. Эта ситуация возникает только тогда когда форма отправляется естественным образом, и один из методов борьбы заставляющим "сбросить форму" браузером, это перенаправление после приема формы. В случае программной передачи данных на сервер такого уже не происходит. Но вот для чего у вас отправление формы и ifarame как приемник ответа сервера не понятно, да еще при таком коде.

teplov 24.08.2019 11:43

ifarame стоит от перезагрузки страница при отправлении сообщения

laimas 24.08.2019 12:12

Цитата:

Сообщение от teplov
ifarame стоит от перезагрузки

form target="myIFR" означает, что ответ сервера после отправления формы будет помещен сюда iframe name="myIFR". Вы можете вообще отказаться от формы как таковой, от iframe, у вас все равно все программно.

teplov 24.08.2019 15:13

Это не решит мою проблему

teplov 24.08.2019 15:14

Мне нужно сделать чтоб по кнопке send не отправлялись пустые сообщения

teplov 24.08.2019 15:18

вот код где они отправляются
var getMessageText, sendMessage, Message;
Message = function (arg) {
    this.text = arg.text, this.message_side = arg.message_side;
    this.draw = function (_this) {
        return function () {
            var $message;
            var json = JSON.parse(_this.text);
            alertChat();
            return createMessage(json.text, json.name, json.photo, _this.message_side);
        };
    }(this);
    return this;
};
getMessageText = function () {
    var $message_input;
    $message_input = $('.message_input');
    return $message_input.val();
};
sendMessage = function (text, message_side) {
    var $messages, message;
    if (text.trim() === '') {
        return;
    }
    $messages = $('.messages');
    message = new Message({
        text: text,
        message_side: message_side
    });
    message.draw();
    return $messages.animate({scrollTop: $messages.prop('scrollHeight')}, 300);
};

function createMessage(text, name, photo, message_side){    
    $message = $($('.message_template').clone().html());    
    if(message_side==="left"){
        $message.find('.text_wrapper').removeClass("pull-left").addClass("pull-right");
        $message.find('.text_wrapper').removeClass("alert-info").addClass("alert-warning");
        $message.find('.name').removeClass("label-info").addClass("label-warning");
        $message.find('.avatar').removeClass("pull-right").addClass("pull-left");
    }
    $message.find('.text').html(text);
    $message.find('.name').html(name);
    $message.find('.photo').attr('src', photo);
    $('.messages').append($message);
    $message.addClass('appeared');
}
а вот где кнопка не активна если в поле ввода нет сообщения
(function () {
    var Message;
    Message = function (arg) {
        this.text = arg.text, this.message_side = arg.message_side;
        this.draw = function (_this) {
            return function () {
                var $message;
                $message = $($('.message_template').clone().html());
                $message.addClass(_this.message_side).find('.text').html(_this.text);
                $('.messages').append($message);
                return setTimeout(function () {
                    return $message.addClass('appeared');
                }, 0);
            };
        }(this);
        return this;
    };
    $(function () {
        var getMessageText, message_side, sendMessage;
        message_side = 'right';
        getMessageText = function () {
            var $message_input;
            $message_input = $('.message_input');
            return $message_input.val();
        };
        sendMessage = function (text) {
            var $messages, message;
            if (text.trim() === '') {
                return;
            }
            $('.message_input').val('');
            $messages = $('.messages');
            message_side = message_side === 'left' ? 'right' : 'left';
            message = new Message({
                text: text,
                message_side: message_side
            });
            message.draw();
            return $messages.animate({ scrollTop: $messages.prop('scrollHeight') }, 300);
        };
        $('.send_message').click(function (e) {
            return sendMessage(getMessageText());
        });
        $('.message_input').keyup(function (e) {
            if (e.which === 13) {
                return sendMessage(getMessageText());
            }
        });
        sendMessage('Hello ! :)');
        
    });
}.call(this));
что мне из одного кода в другой вставить ?

teplov 26.08.2019 06:14

Не пониманию что куда все перепробовал

laimas 26.08.2019 07:39

Не понятно каким образом кнопка становится недоступной, если только не скрывается посредством класса, а вообще для этого достаточно менять ее свойство disabled - true/false.

Сделайте вывод в консоль в контрольных точках, то есть значения аргументов функции, что они возвращают, найдете место конфликтное.

Malleys 26.08.2019 11:47

Цитата:

Сообщение от laimas
Вы можете вообще отказаться от формы как таковой

Вы предлагаете изобретать велосипед? И обрабатывать события keyup и click и может ещё какое-то, когда можно подписаться на событие submit, и вы всегда точно будете уверены, когда будет отправлена форма. (Независимо от того, каким образом она была отправлена!) Зачем бороться с тем, что упрощает?

teplov, у вас в коде никуда ничего не отправляется. Я вам уже писал, чтобы пустое сообщение не отправлялось, используйте атрибут required.

В примере показано, как происходит отправка формы при помощи функции postChatMessage. Это единственный способ отправки. В функции проверяется, что сообщение было не пустым. Затем оно может быть оправлено. Здесь на самом деле возможно много вариантов и вариант, предложенный laimas (и который я закомментировал в коде), в котором блокируется кнопка, пока отправляется сообщение, является менее дружелюбным к пользователю.

<form action="" class="chat" method="post" onsubmit="postChatMessage(event);">
	<img src="https://picsum.photos/id/129/491/325">
	<input name="message" placeholder="Add a public reply..." required autocomplete="off">
	<button>Send</button>
</form>

<script>
	
	function disableForm(form, disabled = true) {
		for(const node of document.querySelectorAll("input, select, button"))
			node.disabled = disabled;
	}

	function postChatMessage(event) {
		event.preventDefault();
		const form = event.target;
		const input = form.querySelector("input[name=message]");
		const message = input.value.trim();
		if(message === "") return;
		alert(`Будет отправлено: ${message}`);
//		disableForm(form);
//		fetch(form.action, {
//			method: form.method,
//			body: `message=${encodeURIComponent(message)}`
//		})
//			.then(response => response.json())
//			.then(data => {
//				if(data.ok) {
//					// только когда действительно сообщение было отправлено,
//					// только тогда очищаем поле ввода
//					input.value = "";
//				} else {
//					throw new Error("Ошибка обработки сообщения на сервере");
//				}
//			})
//			.catch(error => {
//				// произошла ошибка, поле не очищаем
//				// можно вывести диалог, что сообщение не было отправлено
//			})
//			.then(() => disableForm(form, false))
//		;
	}

</script>

<style>
	@import url('https://fonts.googleapis.com/css?family=Material+Icons');
	
	html {
		background: gainsboro;
	}
	
	body {
		margin: 0;
	}

	.chat {
		background: white;
		display: flex;
		align-items: center;
		padding: 10px;
		transition: 300ms;
	}
	
	.chat:focus-within {
		box-shadow: 0 0 0 100vmax rgba(0, 0, 0, 0.6);
	}
	
	.chat img {
		width: 50px;
		height: 50px;
		object-fit: cover;
		border-radius: 50%;
		margin-right: -55px;
		margin-left: 5px;
		z-index: 1;
		transition: 300ms;
		transform: scale(0.8);
	}
	
	.chat:not(:focus-within) img {
		transform: scale(0.6);
	}
	
	.chat input[name="message"] {
		flex: 1;
		padding: 0px 60px;
		height: 60px;
		border: 0;
		border-radius: 3px;
		box-shadow: 0;
		outline: none;
		transition: 300ms;
	}
	
	.chat:focus-within input[name="message"] {
		box-shadow: 0 3px 8px -2px;
	}
	
	.chat button {
		border: 0;
		background: none;
		width: 50px;
		height: 50px;
		margin-left: -55px;
		margin-right: 5px;
		display: none;
		text-transform: lowercase;
		font: 2em "Material Icons";
		color: #2196F3;
	}
	
	.chat input[name="message"]:valid ~ button {
		display: block;
	}
	
</style>


Вы можете эту идею взять за основу. А насчёт отправки, то не нужно ничего блокировать, как это предлагает laimas, достаточно сразу опубликовать сообщение в чате (а значит его нужно удалить из поля ввода), и уже в дальнейшем на самом сообщении будет указываться статус («Отправка...», «Доставлено», «Прочитано», «Не удалось отправить»), и, например, в случае, когда не удалось отправить сообщение, поскольку у вас была отключена сеть, на самом сообщении будет указан статус («Не удалось отправить»), и предоставлена на сообщении кнопка «Отправить заново».

laimas 26.08.2019 11:54

Цитата:

Сообщение от Malleys
Вы предлагаете изобретать велосипед?

Мопед. У него в форме оно поле, но при этом серверу шлется json с двумя свойствами. Нахрена она вообще нужна отправка формы как таковая? Впрочем мне все равно, я не заставляю его ничего менять.

Цитата:

Сообщение от Malleys
А насчёт отправки, то не нужно ничего блокировать, как это предлагает laimas

Блокируют повторную отправку форму, что не является редкостью со стороны клиента, и причина этой несдержанности клиента понятна. А "дружелюбность" и прочее, это словоблудие в данном случае.

Malleys 26.08.2019 12:21

Цитата:

Сообщение от laimas
Блокируют повторную отправку форму

А зачем её блокировать? Достаточно поместить сообщение в чат и очистить поле ввода! (А пустое поле не отправляется, см. пост выше)

Цитата:

Сообщение от laimas
Нахрена она вообще нужна отправка формы как таковая?

Вы сами себе противоречите: форму нужно отправить, но притом вы говорите, что её не нужно отправлять... Форма для этого и существует, чтобы её отправлять... не говоря уже о том богатом функционале, который она предоставляет, что бы данные формы соответствовали определённому формату, и состояния, которые, имеются у элементов формы.

Цитата:

Сообщение от laimas
"дружелюбность" и прочее, это словоблудие в данном случае.

Это очень важная тема на самом деле... Человек написал сообщение и оно по вашему методу исчезно в никуда... Разве такое позволительно в настоящих приложениях? Ну если возможно, то его будут избегать в пользу приложении, где всё-таки ввод пользователя священен, например, в Viber и пр.

laimas 26.08.2019 12:34

Цитата:

Сообщение от Malleys
А зачем её блокировать? Достаточно поместить сообщение в чат и очистить поле ввода!

Офигеть. Вы вообще занимались практически полным приложением сервер<->клиент или только стороной клиента занимались? А коли была практика, то должны знать о проблема повторной отправки формы, примеры такого бардака, кстати, встречаются не раз и на страницах данного форума.

Если на это наплевать и заняться только "красивой стороной" вопроса, то грош цена всей вашей красоте. А вообще же активную/неактивную кнопку можно разукрасить как угодно, для этого есть :enabled/:disabled.

laimas 26.08.2019 13:15

Цитата:

Сообщение от Malleys
Вы сами себе противоречите: форму нужно отправить, но притом вы говорите, что её не нужно отправлять...

Где? Я всего лишь говорил об этом: в коде формы вижу одно поле, в коде сервера вижу прием json с двумя ключами, форма непосредственно не отправляет json, помещение json в форму перед отправкой не наблюдается, зачем тогда форма.

Malleys 26.08.2019 14:22

Цитата:

Сообщение от laimas
повторная отправка формы

Мы наверное о разных вещах думаем, поскольку я не занимаюсь jQuery-программированием, в котором, значит, возникают такие проблемы.

Например, самодополняющийся текст (список товаров, городов, и пр.) в поле ввода как раз таки требует повторной отправки формы, чтобы получить варианты дополнения, и не пару раз, а много раз. (Обычно делается ограничение, например, 500мс, т. е. не более 2 раз в секунду)

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

Цитата:

Сообщение от laimas
проблема как повторная отправка формы

если вы про массовые запросы через curl или подобное, то это как раз таки на сервере решается (более предпочтительно при помощи токена, менее предпочтителен ip-адрес, или какой-либо другой критерии, позволяющий принять решение обработки запроса)

Цитата:

Сообщение от laimas
повторная отправка формы

Отправляется форма, устанавливается флаг isSended, открывается новый вид типа «Спасибо за регистрацию»... Как вы можете отправить форму два раза с одинаковыми данными? На сервере должна быть проверка наличия пользователя с определённой э-почтой, или номером от соц. сети... А если так получилось, что такой пользователь уже есть (опередили, пока вводил), то совершенно нормально, что флаг isSended будет снят и форму опять можно редактировать и отправить. Так что повторная отправка формы возможна и при POST-запросе. Хотя такая вероятность может быть понижена, если уже при вводе проверять наличие, например, имени пользователя и э-майл, через API.

Кстати, валидация поля ввода означает не только соответствие его значения определённому шаблону, но и то, что такое значение может быть принято на сервере (а значит нужен отдельный запрос на то, что такое значение возможно, и невозможно скачать заранее все такие значения, поскольку они представляют личную информацию), которое опять же будет проверено при окончательном запросе (т. е. отправке формы)

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

Если этот чат, то я не вижу где тут может быть проблема, ведь имеется условие, что пустое сообщение нельзя отправлять.

laimas 26.08.2019 14:26

Причем тут jQuery, cURL? Просто форма, а делать кнопку неактивной или выпендриваться с флагами, это уж как вам нравится.

Malleys 26.08.2019 14:37

Цитата:

Сообщение от laimas
Причем тут... cURL?

Так же сказали про массовое отправление форм... А оно как раз таки позволяет такое автоматизировать!

Цитата:

Сообщение от laimas
а делать кнопку неактивной... это уж как вам нравится.

В примере было указано! Хотя для чата такое не очень подходит... И поэтому такая блокировка не используется в реальных проектах, например, в Viber

laimas 26.08.2019 14:46

Цитата:

Сообщение от Malleys
Так же сказали про массовое отправление форм... А оно как раз таки позволяет такое автоматизировать!

Какое массовое? Просто жмет юзер кнопку потому как думает, что браузер закис, отправляя ее еще раз, еще раз ... и никакие крутилки/предупреждения не помогают, если, к примеру, такая крутилка не перекрывает доступ к форме. А CURL, это не автоматизация.

И вообще, прежде чем "а нафига, взяли сразу и поместили сообщение в ...", не плохо бы удостовериться, что сервер принял его, и не просто принял, а "норма", тем более, что вот такое:

if(empty($canSendMessage)){
            echo "Cant Send message\n";

это загадка.


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