更新!!!
我应该更具体地说明我所不知道的事情。 我熟悉AJAX请求,并且已经对后端进行了排序。
在前端脚本中,我有一个来自后端的事件的事件侦听器,而我所有的问题实际上都是关于触发事件侦听器之后的“做什么以及如何做”。
现在,发生这种情况时,我想做的是进行一些更改,主要是将所有用户的图像IMG1更改为IMG2(因为这是对该网站),而且:
我需要使更改永久化,因此,在用户重新加载页面或有新用户进入的情况下,他们所有人仍然应该看到IMG2。 (并且唯一会更改图像的时间是,例如,前端脚本上的事件侦听器将在同一后端事件上再次触发,以再次更改图像(至IMG3)。例如是的,在此示例中,用户没有“点击”请求来更改图像,因此在更新之前,请忽略我的示例。
现在要解决您的问题,我检查了Web套接字的内容,如果我对所有套接字运行“事件”图像更改,它似乎正在执行我需要的工作。现在只剩下两个问题:
1)这种在所有套接字上发生的用于更改图像的更改是否将是永久的,因此在用户重新加载页面或新用户进入的情况下,他们都会看到新图像( IMG2)作为对网页的永久更改?
2)关于这些永久性更改类型,reactJs是否是动态进行此类更改的方法? 如果在那个事件侦听器(用于后端事件的 )上,我将简单地忽略所有Web套接字内容并运行相同的代码来更改图像的src,那会发生什么呢?
2.5)因为从我的角度来看,后端事件在没有任何特定用户输入的情况下触发,因此未与任何用户链接。因此,如果我只是在没有websockets的情况下在该事件上运行代码,则它要么完全不执行任何操作(所以对任何人都没有更改) 或 为所有用户执行更改(仅作为网页的动态更新)。如何运作?
我期待着您的答复,并在此先谢谢大家!!
答案 0 :(得分:0)
每个用户的前端(在浏览器或移动应用程序中运行)(本地)和后端(可以在其中在所有用户之间共享数据)之间可能有所不同。
例如,可以通过firebase来实现。这是一个示例:Firebase - Multiple users simultaneously updating same object using its old value
显然,这并不意味着后端数据总是共享的。在许多情况下,每个用户都访问自己的后端数据副本,该副本存储在数据库中。
答案 1 :(得分:0)
click事件需要由AJAX请求处理,向服务器发送消息,服务器将处理该事件并做出响应。响应后,将为用户执行第一种事件。
在服务器端,您需要在某个位置(可能在数据库中)有一个事件队列。如果您使用的是WebSockets,那么如果通过WebSocket通道满足了请求,则必须为所有用户执行第二种事件。如果您不使用WebSockets,则需要从浏览器执行polling。无论如何,您将需要在服务器端使用一个计数器来确定何时遇到第二种事件。
编辑
是的,除非有充分的理由不这样做,否则WebSockets是必经之路,就像老板说他或她不希望服务器使用WebSockets。使用WebSocket,您可以在服务器和客户端浏览器之间建立实时频道。您可以使用此通道将URL更改发送给客户端。另一方面,客户端将必须使用Javascript处理更改,收集要更改src
的标记并进行更改。如果您碰巧对所有此类标签都拥有changable
类,则可以使用function
来执行更改,如下所示:
function changeSources(newSrc) {
var items = document.getElementsByClassName("changable");
for (var index = 0; index < items.length; index++)
items[index].src = newSrc;
}
但是,此更改将仅对最初已加载的已加载页面和新加载的页面生效,这本身不会使用新的src
。因此,您也必须解决该问题。整齐的方法是,在通过WebSocket将新src
发送到客户端之前,将新src
存储在服务器上,并在新的src
用作这些标记的src
时使用客户端请求HTML。因此,您的问题有两个部分,第一部分是更改已加载页面上的src,第二部分是使更改永久生效。
ReactJS是一个框架。此时,我们需要定义技术背景,因为ReactJS将使用其中的一种可能的解决方案。
https://www.npmjs.com/package/react-websocket
这是一个WebSocket实现。最好的技术背景是使用WebSocket,除非有很好的理由不这样做。
https://www.npmjs.com/package/react-notifications
服务器通知系统通常是单程票道。服务器可以发送通知,但是客户端没有这种可能性。
浏览器可能会定期向服务器发送HTTP请求,这样它就可以接收iframe
更改响应。如果不能选择WebSockets和服务器通知系统,则这是一个很好的解决方案。
您可以永久使用不可见的 <nav id="mainNav" class="navbar navbar-default navbar-fixed-top navbar-custom" style="margin-bottom : 0px;">
<div class="container-fluid" ng-controller = "NavController">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header page-scroll">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span> Menu <span ng-show="userCart.cart_size>0" style="color:orange">({{userCart.cart_size}}) </span><i class="fa fa-bars"></i>
</button>
<a class="navbar-brand" href="#page-top">XYZ IoT</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="hidden">
<a href="#/main#page-top"></a>
</li>
<li class="page-scroll">
<a href="#/main#portfolio">Products</a>
</li>
<li class="page-scroll">
<a href="#/main#about">About</a>
</li>
<li class="page-scroll">
<a href="#/main#contact">Contact</a>
</li>
<!-- Add the Login Anchor -->
<li ng-if="!userInfo.authorization">
<a href="#/login">Login</a>
</li>
<li ng-if="userInfo.authorization">
<a href="#/mydevices">My Devices</a>
</li>
<li ng-if="userInfo.authorization">
<a href="#/main" ng-click = "logout()">Logout</a>
</li>
</ul>
</div>
</div> <!-- /.navbar-collapse -->
</nav>
进行加载,这将使您有可能将实时消息从服务器发送到客户端,但这非常不便。