Существует отличный пример чата по css-трюкам, который, я думаю, отлично подходит для начинающих в PHP. (https://css -tricks.com / jquery-php-chat / ) Когда я смотрю на это, я замечаю, что кнопки отправки нет. Это очень важно для хорошего пользовательского интерфейса. Поэтому я думаю: «Это не может быть слишком сложно, верно?»и я написал JQuery, чтобы сделать кнопку отправки. Я не получаю никаких ошибок в консоли, но это не отправка. Вы можете посмотреть мою живую демонстрацию внизу. Но я не могу заставить эту кнопку отправки работать. Нажатие Enter посылает данные, так почему бы не нажать кнопку? Там может быть совершенно другой подход, чем то, что я пытаюсь. Например, имитация нажатия клавиши при нажатии кнопки. Но я тоже попробовал, и это не работает правильно. По умолчанию чат постоянно ожидает нажатия клавиши ввода. Это делается с помощью кода ниже.
$('#sendie').keyup(function(e) {
if (e.keyCode == 13) {
//send message
});
И это здорово, но мне нужна кнопка для отправки сообщения. Поэтому я изменил код так:
$('#sendbutton').click(function(e) {
if (e.keyCode == 13) {
//send message
});
Должно ли работать правильно? Нет. Поэтому я попробую еще раз, с другим подходом. Но время от времени jQuery бьет меня в спину. Снова и снова. После моих исследований я думаю, что проблема может заключаться в том, что этот фрагмент находится внутри другой функции, которая выглядит следующим образом:
$(function() {
//more code stuffs
$('#sendie').keyup(function(e) {
if (e.keyCode == 13) {
//send message
});
});
Так что, каким-то образом, он не может найти мою кнопку. И я думаю, что это связано с функцией сдерживания. Может быть, это еще одна проблема. Вся функция состоит из:
// watch textarea for release of key press
$('#sendie').keyup(function myFunction(e) {
if (e.keyCode == 13) {
var text = $(this).val();
var maxLength = $(this).attr("maxlength");
var length = text.length;
// send
if (length <= maxLength + 1) {
chat.send(text, name);
console.log('message was sent by hitting enter. Message: ' + text + "Length: " + length + ".");
$(this).val("");
} else {
$(this).val(text.substring(0, maxLength));
}
}
});
Вот демонстрация того, что я пытаюсь (без php):
// ask user for name with popup prompt
// it's annoyting for the demo so I got rid of it
//var name = prompt("Enter your chat name:", "GuestCow");
// default name is 'Guest-Cow'
if (!name || name === ' ') {
name = "GuestCow";
}
// strip tags
name = name.replace(/(<([^>]+)>)/ig,"");
// display name on page
$("#name-area").html("You are: <span>" + name + "</span>");
console.log("username is " + name);
function newName() {
// ask user for name with popup prompt
var name = prompt("Enter your new chat name:", "GuestCow");
// default name is 'Guest-Cow'
if (!name || name === ' ') {
name = "GuestCow";
}
// strip tags
name = name.replace(/(<([^>]+)>)/ig,"");
// display name on page
$("#name-area").html("You are: <span>" + name + "</span>");
console.log("username was changed to " + name);
}
// kick off chat
var chat = new Chat();
$(function() {
chat.getState();
// watch textarea for key presses
$("#sendie").keydown(function(event) {
var key = event.which;
//all keys including return.
if (key >= 33) {
var maxLength = $(this).attr("maxlength");
var length = this.value.length;
console.log("key was pressed");
// don't allow new content if length is maxed out
if (length >= maxLength) {
event.preventDefault();
}
}
});
// watch textarea for release of key press
$('#sendie').keyup(function myFunction(e) {
if (e.keyCode == 13) {
var text = $(this).val();
var maxLength = $(this).attr("maxlength");
var length = text.length;
// send
if (length <= maxLength + 1) {
chat.send(text, name);
console.log('message was sent by hitting enter. Message: ' + text + "Length: " + length + ".");
$(this).val("");
} else {
$(this).val(text.substring(0, maxLength));
}
}
});
// watch button for click
/*$('#sendbutton').click(function(e) {
var text = $(this).val();
var maxLength = $(this).attr("maxlength");
var length = text.length;
// send
if (length <= maxLength + 1) {
chat.send(text, name);
console.log('messgae was sent by pressing button');
$(this).val("");
} else {
$(this).val(text.substring(0, maxLength));
}
});*/
});
function doOnBlur() {
document.getElementById("sendie").style.borderBottom = "2px solid rgb(169, 169, 169)";
document.getElementById('progressinner').style.width = "0px";
}
function doOnFocus() {
document.getElementById("sendie").style.borderBottom = "none";
document.getElementById('progressinner').style.width = "360px";
}
//ajax
/*
Created by: Kenrick Beckett
Name: Chat Engine
*/
var instanse = false;
var state;
var mes;
var file;
function Chat () {
this.update = updateChat;
this.send = sendChat;
this.getState = getStateOfChat;
}
//gets the state of the chat
function getStateOfChat(){
if(!instanse){
instanse = true;
$.ajax({
type: "POST",
url: "process.php",
data: {
'function': 'getState',
'file': file
},
dataType: "json",
success: function(data){
state = data.state;
instanse = false;
},
});
}
}
//Updates the chat
function updateChat(){
if(!instanse){
instanse = true;
$.ajax({
type: "POST",
url: "process.php",
data: {
'function': 'update',
'state': state,
'file': file
},
dataType: "json",
success: function(data){
if(data.text){
for (var i = 0; i < data.text.length; i++) {
$('#chat-area').append($("<p>"+ data.text[i] +"</p>"));
document.title = "Chat - 1 new message";
}
}
document.getElementById('chat-area').scrollTop = document.getElementById('chat-area').scrollHeight;
instanse = false;
state = data.state;
},
});
}
else {
setTimeout(updateChat, 1500);
}
}
//send the message
function sendChat(message, nickname)
{
updateChat();
$.ajax({
type: "POST",
url: "process.php",
data: {
'function': 'send',
'message': message,
'nickname': nickname,
'file': file
},
dataType: "json",
success: function(data){
updateChat();
},
});
}
* { margin: 0; padding: 0; outline: 0px !important; }
body { font: 12px "Lucida Grande", Sans-Serif; background: #333; }
#page-wrap { width: 500px; margin: 5px auto; position: relative; border-radius: 10px; }
.darkMode { width: 500px; margin: 5px auto; position: relative; }
#chat-wrap { margin: 0 0 15px 0; }
#chat-area { height: 300px; overflow-y: auto; overflow-wrap: break-word; border: 1px solid #666; border-radius: 10px; padding: 20px; background: white; }
#chat-area span { color: white; background: #333; padding: 4px 8px; -moz-border-radius: 5px; -webkit-border-radius: 8px; margin: 0 5px 0 0; }
#chat-area p { padding: 8px 0; border-bottom: 1px solid #ccc; line-height: 1.5;}
/*#name-area { position: absolute; top: 5px; right: 0; color: white; font: bold 12px "Lucida Grande", Sans-Serif; text-align: right; }
#name-area span { color: #fa9f00; }*/
#modbox { background-color: red !important; color: white; background: #333; padding: 4px 8px; -moz-border-radius: 5px; -webkit-border-radius: 8px; margin: 0 5px 0 0; }
#send-message-area p { float: left; color: white; font-size: 14px; }
#sendie { z-index: 1000000; outline: 0 !important; resize: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; -o-user-select: none; user-select: none;color: white; background-color: #333; width: 360px; padding: 5px; font: 13px "Lucida Grande", Sans-Serif; box-sizing: border-box; border-bottom: 2px solid rgb(169, 169, 169); float: right; }
/*New Css----Turns out it's broken... :( */
#chat-area::-webkit-scrollbar {
width: 1em;
}
#chat-area::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
border-left: 2px solid #3a3a3a;
}
#chat-area::-webkit-scrollbar-thumb {
background-color: #333;
outline: 1px solid slategrey;
}
#chat-area::-webkit-scrollbar-thumb:hover {
background-color: #3a3a3a;
}
/* The switch - the box around the slider */
.switch {
position: relative;
display: inline-block;
width: 30px;
height: 17px;
float: left;
top: 0px;
}
/* Hide default HTML checkbox */
.switch input {
opacity: 0;
width: 0;
height: 0;
}
/* The slider */
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 13px;
width: 13px;
left: 2px;
bottom: 2px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
input:checked + .slider {
background-color: #2196F3;
}
input:focus + .slider {
box-shadow: 0 0 1px #2196F3;
}
input:checked + .slider:before {
-webkit-transform: translateX(13px);
-ms-transform: translateX(13px);
transform: translateX(13px);
}
/* Rounded sliders */
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
#menu { display: none; }
.sendbuttoncontainer {
width: 100px;
text-align: center;
margin: 0px;
padding: 0px;
}
.textareacontain {
margin: 0px;
padding: 0px;
border: none;
overflow: hidden;
text-align: center;
float: right;
}
.progressinner {
width: 0px;
height: 2px;
/*nice google blue color*/
background-color: #4885ed;
position: absolute;
margin-top: 44px;
-webkit-transition-duration: 0.4s;
-o-transition-duration: 0.4s;
transition-duration: 0.4s;
}
/*#sendie:focus + .progressinner {
width: 100%;
}*/
#sendbutton {
border: 2px solid lightgrey;
background-color: #333;
border-radius: 30px;
width: 60px;
color: lightgrey;
margin-top: 5px;
outline: 0px !important;
-webkit-transition-duration: 0.4s;
-o-transition-duration: 0.4s;
transition-duration: 0.4s;
}
#sendbutton:active {
outline: 0px !important;
}
#sendbutton:hover {
background-color: #f22a02;
width: 75px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body onload="setInterval('chat.update()', 1000)" onclick="document.getElementById('menu').style.display = 'none';">
<div class="darkMode" style="
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;">
<label class="switch">
<input class="checker" onclick="javascript: (
function () {
var css = 'html {-webkit-filter: invert(100%);' +
'-moz-filter: invert(100%);' +
'-o-filter: invert(100%);' +
'-ms-filter: invert(100%); }' +
'#modbox {background-color: #00FFFF;}',
head = document.getElementsByTagName('head')[0],
style = document.createElement('style');
if (!window.counter) { window.counter = 1;} else { window.counter ++;
console.log('darkmode activated');
if (window.counter % 2 == 0) { var css ='html {-webkit-filter: invert(0%); -moz-filter: invert(0%); -o-filter: invert(0%); -ms-filter: invert(0%); } #modbox {background-color: red;}'}
};
style.type = 'text/css';
if (style.styleSheet){
style.styleSheet.cssText = css;
} else {
style.appendChild(document.createTextNode(css));
}
head.appendChild(style);
}());
" type="checkbox" title="Dark Mode">
<span class="slider round"></span>
</label>
<p style="
float: left; color: white;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;" id="noInvertTwo"> Dark Mode On/Off</p><p style="float: right;"><a href="javascript:newName();" style="color: lightgrey;">Change Username</a> <a href="javascript:window.close();" style="color: lightgrey;">Close Chat</a></p>
</div>
<br style="
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;">
<div id="page-wrap">
<div id="chat-wrap"><div id="chat-area" class="chat-area">
<p style=""><span2 id="modbox">Chat-Mod</span2>Basically, pressing the send button, while it's supposed to send somthing, is doing nothing. Please note that this demo does not work because it does not have the php nessacarry for it to.</p>
<p style=""><span>Details</span>Ignore the DOM styleing errors in the console. Mainly, I think that my problem is with some global variables not really being so global after all. I'm having a hard time identifying this error. But I will even accept another solution to submit the content to that chat that uses a button press.</p><!--<p id="name-area"></p>-->
</div></div>
<form id="send-message-area">
<p id="noInvert">Your message: </p><!--<br><button onclick="sendText()">send</button>-->
<div class="textareacontain">
<textarea tabindex="2" id="sendie" onfocus="doOnFocus()" onblur="doOnBlur()" maxlength="200" placeholder="Say Something... (Press Enter to Send)"></textarea>
<div class="progressinner" id="progressinner"></div>
</div><br>
</form>
<div class="sendbuttoncontainer">
<button id="sendbutton" onclick="sendthetext();">Send◹</button>
</div>
</div>
</body>
В любом случае, простите за длинное объяснение. И я уверен, что просто скучаю по чему-то очень простому для всех остальныхТак что, если бы у меня был еще один взгляд на мой код, я был бы признателен. Заранее спасибо.