【问题标题】:Using localStorage to force specific window tab or popup window to reload使用 localStorage 强制特定窗口选项卡或弹出窗口重新加载
【发布时间】:2020-11-17 10:48:46
【问题描述】:

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

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

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

  • 强制重新加载页面或
  • 根本不强制重新加载,我必须手动执行或
  • (当脚本在弹出窗口中激活时)它会重新加载主页而不是弹出窗口或
  • (当脚本在弹出窗口中激活时)它会重新加载弹出窗口,但除非我手动重新加载,否则不会出现模式消息

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

这是我在项目的 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 部分中生成和添加的。 感谢您的帮助。

【问题讨论】:

    标签: jquery django bootstrap-modal


    【解决方案1】:

    显然它有些令人费解,或者我缺乏使其工作的逻辑/知识。幸运的是,我还有另一个选择,主要是 Python 工作:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-16
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多