使用 localStorage 强制重新加载特定 window 选项卡或弹出窗口 window

Using localStorage to force specific window tab or popup window to reload

我正在开发一个 Django 项目,在该项目中,我们为文档分配协议编号,在提交并关闭表单后,协议编号应出现在模态消息中。请求的功能是,如果文件从主 window 或从文档的弹出列表中分配了一个协议编号,它应该始终显示一个模态 window 以及该文件的协议编号分配给.

我写了一个 jQuery 脚本,它基于某些条件(页面 URL 包含或不包含特定字符串)- [它] 设置 的 localStorage 值将 更新为 1。发生这种情况时,它会强制活动 window 或弹出窗口 window 重新加载,以显示具有指定协议编号的模式。

不幸的是,重新加载并没有像我希望的那样发生。它在 大多数 的时间都有效,但有时它也可以:

出于某种原因,我无法理解为什么脚本有时有效而有时无效。我想要一些反馈、指导甚至替代方法来做到这一点,因为它真的让我感到困惑,让我发疯!!!

这是我在项目的 base.html 中编写的脚本,位于 $(document).ready() 函数的顶部:

  var ispopup = '{{ request.get_full_path }}';
  if((ispopup.indexOf('_popup') > -1 ) && (ispopup.indexOf('case') > -1 )){
    console.log('This is a case page in a popup');
    window.setInterval(function(){
      var myupdate = localStorage.getItem('update');
      if(myupdate==1){
        console.log("update before :"+myupdate);
        
          localStorage.setItem("update","0");
          window.location.reload();
        {% if messages %}
          $("#messagesModal").modal('show');
        {% endif %}
        localStorage['papaurl'] = "";      
        console.log("update after :"+myupdate);
        console.log("papaurl :"+localStorage["papaurl"]);
      }
    },2000);    
  } else if((ispopup.indexOf('grandchild') == -1) && (ispopup.indexOf('_popup') == -1 )){
      var thispage;
      if(ispopup.indexOf('library')>-1){thispage = 'library';}
      else if(ispopup.indexOf('case')>-1){thispage = 'case';}
      else{thispage = 'list'}
      console.log('This is a '+thispage+' page in the base page');

      window.setInterval(function(){
        var myupdate = localStorage.getItem('update');
        if(myupdate==1){
          console.log("update before :"+myupdate);
          {% if not messages %}
            localStorage.setItem("update","0");
            window.location.reload();
          {% endif %}
          
          localStorage['papaurl'] = "";      
          console.log("update after :"+myupdate);
          console.log("papaurl :"+localStorage["papaurl"]);
        }
      },2000);
  }  

Django 标签中的'messages' 变量包含协议号的字符串,该字符串是在本项目的Python 部分生成并添加的。 感谢您的帮助。

显然这有点令人费解,或者我缺少 logic/knowledge 来让它发挥作用。幸运的是,我有另一个选择,主要是 Python 工作:

表单提交后,HttpResponseRedirect 应用程序数据更新的reverse_lazy,本质上是打开带有更新表单的对象,并在那里显示弹出窗口。由于它不需要查找父页面或它是否是弹出窗口 window,因此它始终如一地工作。它需要做的就是像这样检查 {{ messages }} :

{% if messages %} $('#messagesModal').modal('show');{% endif %}

注意:提交时确实存在问题,页面没有立即转发到更新表单(可能是由于网络或服务器负载),使得可以在第一次重新提交表单时第二次重新提交表单提交仍在进行中。为了防止这种情况,我在提交表单时禁用了提交按钮。