- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的服务器和客户端在不同的项目上。
当我在 vsCode 上使用 Live Server 时,一切正常。但如果我尝试访问本地主机,则不会收到 404。
怎么会?
服务器.js
const logger = require('./logger');
const PORT = 3000;
const io = require('socket.io')(PORT);
const express = require('express');
const app = express();
const socketListeners = require('./sockets/socketListeners');
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
io.on('connection', socket => socketListeners(socket, io, logger));
index.js(客户端)
const socket = io('http://localhost:3000');
window.addEventListener('DOMContentLoaded', appendForm());
使用客户端上的调试器,我得到“io is not defined”。当我在第 1 行使用“从“socket.io-client”导入 io”时,我得到了意外的标识符。
编辑
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Chat</title>
<link rel="stylesheet" href="style.css" />
<script src="http://localhost:3000/socket.io/socket.io.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.5/socket.io.min.js"></script>
<script src="name.js"></script>
<script src="index.js"></script>
<script src="chat.js"></script>
</head>
<body>
<section class="container"></section>
</body>
</html>
索引.js
//const socket = io('http://localhost:3000');
const socket = io(':3000');
window.addEventListener('DOMContentLoaded', appendForm());
名称.js
const container = document.querySelector('.container');
const nameContainer = document.createElement('section');
const title = document.createElement('h1');
const form = document.createElement('form');
const nameInput = document.createElement('input');
const submitName = document.createElement('button');
title.innerText = 'Enter Your Name';
submitName.innerText = 'Connect';
const getName = () => {
form.addEventListener('submit', e => {
e.preventDefault();
const name = nameInput.value;
socket.emit('new-user', name);
nameInput.value = '';
socket.off('invalid-name');
socket.on('invalid-name', () => {
feedbackBox(
"Make sure you don't have space or other funky characters in your name \n \n Must be between 3-13 characters"
);
});
socket.off('name-taken');
socket.on('name-taken', () => {
feedbackBox('Nickname already taken');
});
socket.off('user-accepted');
socket.on('user-accepted', () => {
title.classList.add('hide');
nameContainer.classList.add('hide');
addMessageForm();
});
});
};
const appendForm = () => {
nameInput.classList.add('name_input');
form.appendChild(nameInput);
submitName.classList.add('submit_name');
form.appendChild(submitName);
nameContainer.appendChild(form);
nameContainer.classList.add('name_container');
nameContainer.classList.remove('hide');
title.classList.remove('hide');
title.classList.add('name_title');
container.appendChild(title);
container.appendChild(nameContainer);
getName();
};
聊天.js
//const socket = io('http://localhost:3000');
const showFeedback = document.createElement('section');
const messageContainer = document.createElement('section');
const messageForm = document.createElement('form');
const messageInput = document.createElement('input');
const submitMessage = document.createElement('button');
const disconnectButton = document.createElement('button');
submitMessage.innerText = 'Send';
disconnectButton.innerText = 'X';
messageContainer.classList.add('message-container');
messageForm.classList.add('send-container');
messageInput.classList.add('message-input');
submitMessage.classList.add('send-button');
disconnectButton.classList.add('disconnect-button');
const addMessageForm = () => {
showFeedback.classList.add('hide');
messageContainer.classList.remove('hide');
messageForm.classList.remove('hide');
disconnectButton.classList.remove('hide');
messageForm.appendChild(messageInput);
messageForm.appendChild(submitMessage);
container.appendChild(disconnectButton);
container.appendChild(messageContainer);
container.appendChild(messageForm);
appendMessage('You joined');
};
socket.on('chat-message', data => {
appendMessage(`${data.name}: ${data.message}`);
});
socket.on('user-connected', name => {
appendMessage(`${name} connected`);
});
socket.on('user-disconnected', name => {
appendMessage(`${name} left the chat`);
});
socket.on('user-inactivity-disconnected', name => {
appendMessage(`${name} was disconnected due to inactivity`);
});
messageForm.addEventListener('submit', e => {
e.preventDefault();
const message = messageInput.value;
socket.emit('send-chat-message', message);
if (message !== '') {
appendMyMessage(`You: ${message}`);
}
messageInput.value = '';
});
function appendMessage(message) {
const messageElement = document.createElement('section');
messageElement.innerText = message;
messageElement.classList.add('messages');
messageContainer.append(messageElement);
}
function appendMyMessage(message) {
const myMessageElement = document.createElement('section');
myMessageElement.innerText = message;
myMessageElement.classList.add('myMessage');
messageContainer.append(myMessageElement);
}
const feedbackBox = message => {
showFeedback.innerText = message;
showFeedback.classList.add('feedback-I-disconnect');
showFeedback.classList.remove('hide');
container.appendChild(showFeedback);
};
disconnectButton.addEventListener('click', event => {
if (event.target.classList.contains('disconnect-button')) {
socket.disconnect();
messageContainer.classList.add('hide');
messageForm.classList.add('hide');
disconnectButton.classList.add('hide');
appendForm();
feedbackBox('You disconnected from the chat');
socket.connect();
}
});
socket.on('inactive', () => {
socket.emit('disconnected');
messageContainer.classList.add('hide');
messageForm.classList.add('hide');
disconnectButton.classList.add('hide');
appendForm();
feedbackBox('Disconnected by the server due to inactivity');
});
最佳答案
首先,将您的链接修复到 index.html 中的 Socket.io 库。试试 cdn,像这样 <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.5/socket.io.min.js"></script>
我有一个类似的问题。试试这个连接到本地主机:
const socket = io(':3000'); // pay attention on that it should be a string and starts with a colon symbol
编辑
首先你需要删除defer
来自 <script defer src="...>
的属性加载。这告诉浏览器继续加载页面,同时延迟脚本在后台加载,并在加载后运行此脚本。
因此,在您的情况下,带有 Socket.io 库的脚本将在行 const socket = io('...
要求之后运行
关于javascript - Live Server 工作,但我收到 localhost 的 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59803127/
我在使用 jquery 1.9.1 时遇到问题。我已经搜索过,但这些都没有解决我的问题。 $('.sm2_expander').live('click', function() { $
有些 Live CD 可以启动操作系统并允许您无需安装即可使用它。 我想知道是否有一种简单的方法来自定义 Live CD,以便它只加载运行一个应用程序所需的内容,然后运行该应用程序。 最佳答案 对于
当我从 Live CD 启动 Linux Mint 时,我能够将文件保存到“文件系统”。但这些文件保存在哪里呢?不可能是光盘,因为它是 CDR。我不认为它存储在 RAM 中,因为它只能保存这么多数据,
我正在尝试 ZIO . 我不明白为什么要添加Live作为Trait,然后提供一个object,比如: object Live extends Live 在不同的地方可以找到这种模式,例如 zio.co
我正在尝试播放 RTSP 直播流媒体网址“rtsp://164.100.51.207/broadcast/DDLive”。但我收到此错误 (1,-1)。 我正在尝试这段代码 VideoView myV
如何更改标签的 html,如下所示: $('#someId').html('foo bar'); 使用 live() 或 delegate() 函数时?只是为了澄清,我不希望这种情况发生在悬停、焦点或
我在这里没有看到很多关于 Microsoft 提供的 xbox live api 的帖子。谁能给我指一个有活跃的 xbox live api 社区的网站? 最佳答案 这是相当模糊的,所以我会提供一个广
我有一个带有 class="centerMessage" 的 div 。该 div 会在页面加载后的某个时刻插入到 DOM 中。我想更改此 div 上的 CSS 以使其居中。我尝试了下面的CSS功能,
我正在开发一个应用程序,我需要将通过智能手机的摄像机(在 iPhone 和 Android 手机上)捕获的视频流式传输直接到 YouTube Live。 我研究了 Codename One 的 Cap
当使用 DLT 时,我们可以使用 STREAMING LIVE TABLE 或 LIVE TABLE 创建一个实时表,如文档中所写: CREATE OR REFRESH { STREAMING LIV
所以,我在一个网站上工作,我希望用户能够使用他们的 xbox 帐户登录,将他们的玩家标签链接到我的网站。我可以像这样使用 oauth: 但是,我不知道如何获得 xbox live 权限。执行此操作的其
我正在使用苹果的 http 实时流媒体将实时视频流式传输到 ipad/iphone。其中一个重要的步骤是将传输流与播放列表一起分割成几个 ts 段。根据苹果的文档,推荐的 ts 段持续时间为 10 秒
我正在尝试实现“使用 Outlook.com 登录”流程,其中涉及客户端和服务器代码。 流程是: 从客户端将用户重定向到: https://login.live.com/oauth20_authori
如果您使用 YouTube 直播打开广播“事件”,用户可以使用回放功能,让他们无需离开界面即可观看过去 3 小时的广播 - 您可以像观看视频一样轻松观看,但您仍处于广播中,您只需控制过去缓冲的分钟数。
我有一个使用 HTTP Live Streaming 传送视频内容的应用程序。我希望应用程序根据设备屏幕尺寸(4x3 或 16x9)检索适当的分辨率。我运行 Apple 的工具来创建主 .m3u8 播
我有一个使用 HTTP Live Streaming 传送视频内容的应用程序。我希望应用程序根据设备屏幕尺寸(4x3 或 16x9)检索适当的分辨率。我运行 Apple 的工具来创建主 .m3u8 播
super 快的。这是我的 .gitignore(在我的 repo 的根级别 # Makefile stuff LIVE-* .install-post-all 当我这样做时,LIVE-* 位不起作用
因此,我在 Gamasutra 阅读了 John Carmack 的采访,其中他谈到了他所谓的“存在于内存映射文件中的实时 C++ 对象”。以下是一些引用: JC: Yeah. And I actua
在教师端对类(class)进行更改后,有预览更改和查看实时版本的选项,但目前这两个选项都无法正常工作,我们必须在 URL 中附加基本 url (www.abc.com/)是时候预览更改或查看实时版本了
有人可以详细说明aria-live="assertive"之间的区别吗?和 aria-live="polite" ? 据我了解 aria-live="assertive"将获得更高的优先级并清除队列,
我是一名优秀的程序员,十分优秀!