Проверьте массив на наличие повторяющихся значений, если куки не установлены, не проверяйте, установлены ли куки - PullRequest
0 голосов
/ 28 ноября 2018

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

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

эта функция устанавливает исходное имя пользователя:

//index.html
function setUsername() {
    var textbox = document.getElementById("name");
    var txtboxval = textbox.value;
    if(textbox.value.length <= 20 && textbox.value.length >= 4){
      socket.emit('setUsername', document.getElementById('name').value);
      setCookie("username", txtboxval, 30);
      socket.on('userExists', function(data) {

      });
    }
    else{
        alert("The name has to be at least 4 characters long");
        return false;
      }
    };

, и эти два устанавливают его при загрузке cookie:

  //index.html
  function setUsername2() {
    var nimi = getCookie('username');
    socket.emit('setUsername', nimi);
  }

  function checkCookie() {
      var user = getCookie("username");
      if (user != "") {
          alert("Welcome again " + user);
          setUsername2();
          document.body.innerHTML = '<div class="wrapper"><div class="messagebox"><input type = "text" id = "message" placeholder = "Write your message here">\
          <button type = "button" id="sending" name = "button" onclick = "sendMessage()">Send</button></div>\
          <div id = "message-container"></div></div>';
      }
    }

теперь это фактически устанавливает имя пользователя в массив, в который оно его копаетна странице index.html:

  //app.js
  users = [];
  io.on('connection', function(socket){
    console.log('an user connected');
    console.log(users);
    socket.on('setUsername', function(data) {
      console.log(data);

        users.push(data);
        socket.emit('userSet', {username: data});
        console.log(users);
  });

Мне бы хотелось, чтобы этот фрагмент кода запускался при первой установке имени пользователя, а не при загрузке из файлов cookie:

//app.js
if(users.indexOf(data) > -1) {
          socket.emit('userExists', data + ' Username is already taken.');
        } else {
          users.push(data);
          socket.emit('userSet', {username: data});
          console.log(users);
        }

Isесть что-то, чего мне не хватает, почему я не могу заставить его работать так, как мне бы этого хотелось?Если что-то неясно, пожалуйста, спросите.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Если я правильно понял, и вы хотите различить два действия - установка имени пользователя из cookie и установка имени пользователя из input # name - так что вам просто нужно выдать userExists с некоторыми дополнительными данными, с некоторымифлаг, например cookie (что будет означать, что вы устанавливаете значение из cookie) или user_input (что будет означать, что вы устанавливаете значение из поля ввода), напримерэто:

socket.emit('userSet', {username: data.name, user_input: true});
0 голосов
/ 30 ноября 2018

Вы можете сделать это, запустив 'setUsername', используя объект {name: string, cookie: boolean} вместо только имени пользователя, как я сделал здесь:

function setUsername() {
  var textbox = document.getElementById("name");
  var txtboxval = textbox.value;
  if(textbox.value.length <= 20 && textbox.value.length >= 4){
    socket.emit('setUsername', {name: document.getElementById('name').value, cookie: false});
    setCookie("username", txtboxval, 30);
    socket.on('userExists', function(data) {
      // ########## you could add your 'already taken'-message here. :) ##########
      console.log(data);
      document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; 
      // this 'deletes' the cookie.
    });
  } else {
    alert("The name has to be at least 4 characters long");
    return false;
  }
}

function setUsername2() {
  var nimi = getCookie('username');
  socket.emit('setUsername', {name: nimi, cookie: true});
}

function checkCookie() {
  var user = getCookie("username");
  if (user != "") {
    alert("Welcome again " + user);
    setUsername2();
    document.body.innerHTML = '<div class="wrapper"><div class="messagebox"><input type = "text" id = "message" placeholder = "Write your message here">\
    <button type = "button" id="sending" name = "button" onclick = "sendMessage()">Send</button></div>\
    <div id = "message-container"></div></div>';
  }
}

users = [];
io.on('connection', function(socket){
  console.log('an user connected');
  console.log(users);
  socket.on('setUsername', function(data) {
    console.log(data);

    if(!data.cookie && users.indexOf(data.name) > -1) {
      socket.emit('userExists', data.name + ' Username is already taken.');
    } else {
      users.push(data.name);
      socket.emit('userSet', {username: data.name});
      console.log(users);
    }
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...