每个带有扩展的页面都会重新加载 javascript(并重新建立 ws 连接)

Posted

技术标签:

【中文标题】每个带有扩展的页面都会重新加载 javascript(并重新建立 ws 连接)【英文标题】:Every page with extends reloads javascript (and re-establishes ws connection) 【发布时间】:2019-02-20 10:49:26 【问题描述】:

早安,

我有点卡在一个问题上,不知何故找不到解决方案。

我有基本模板和两个扩展基本模板的模板。基本模板包括 websocket.js 文件,该文件在用户打开页面时建立 WebSocket 连接。问题是当他点击一些指向某个子页面的链接时,浏览器正在重新加载所有静态文件,包括导致 WebSocket 连接断开/重新连接的 websocket.js。

问题我怎样才能避免这种重新加载。应该避免使用扩展并在不重新加载的情况下移动到 jQuery 样式的动态页面更新,或者我可以将 javascript WebSocket 对象保留在全局某处,并且如果该对象未定义,则不建立新连接(我也不知道该怎么做) .

websocket.js 很简单:

var websocketServerLocation = 'ws://' + window.location.host +
    '/ws/dashboard/';

function start(websocketServerLocation) 
    ws = new WebSocket(websocketServerLocation);
    ws.onmessage = function (e) 
        var data = JSON.parse(e.data);
        drawDashboard(data);
    ;
    ws.onclose = function () 
        // Try to reconnect in 5 seconds
        setTimeout(function () 
            start(websocketServerLocation)
        , 5000);
    ;


start(websocketServerLocation);

base.html:

% load staticfiles %
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    ....
    <script type="text/javascript" src="% static "websocket.js" %"></script>
</head>
<body>
    ...

  <div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link" href="% url 'child1' %">child1<span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="% url 'child2' %">child2</a>
     ....
</html>

一些“孩子”:

% extends "base.html" %
% load staticfiles %
% block content %

% endblock %

【问题讨论】:

【参考方案1】:

Django 将每个模板视为新页面或请求,即使它们扩展了相同的基本模板。因此,将无法保留基本模板。在其他一些方式中,您可以通过 jQuery 和 ajax 运行一切来完成您的工作。

【讨论】:

以上是关于每个带有扩展的页面都会重新加载 javascript(并重新建立 ws 连接)的主要内容,如果未能解决你的问题,请参考以下文章

如何使值不重置每个页面重新加载?

从 javascript POST 重新加载剃须刀页面

值更改时快速重新加载视图

发送带有 json 的 html 文件并让浏览器重新加载该 json 而无需重新加载页面

底部导航视图中的每个选项卡单击都会重新加载片段

Flutter Page 每次在导航弹出时都会重新加载