繁体   English   中英

浮动窗格中的Dojo JavaScript两次无法正常工作

[英]Dojo javascript inside floating pane doesn't work well twice

我正在尝试在dojo浮动窗格中加载注册表。 表单位于div中,该div通过网址加载

http://mysite/register

并包含表单主体和具有一些自定义验证逻辑的javascript文件。 就是这样

<div>
   <form>
   </form>
   <script>
   </script>
</div>

我的脚本现在包含

require(["dojo/parser",
        "dijit/form/Form",
        "dijit/form/Button",
        "dijit/form/ValidationTextBox",
        "ssapp/widgets/AjaxValidationTextBox",
        "dijit/form/DateTextBox",
        "dojox/validate/web",
        "dojox/form/PasswordValidator",
        "dijit/form/FilteringSelect",
        "dijit/form/Select",
        "dijit/form/CheckBox",
        "dojox/layout/TableContainer",
        "dijit/layout/ContentPane",
        "dojo/dom",
        "dojo/query",
        "dojo/_base/xhr",
        "dojo/dom-attr",
        "dojox/validate",
        "dojo/on",
        "dojo/dom-style",
        "dijit/registry",
        "dojo/request",
        "dojo/json",
        "dojo/ready"

    ], function (parser, Form, Button, ValidationTextBox, AjaxValidationTextBox, DateTextBox, web, PasswordValidator, FilteringSelect, Select, CheckBox, TableContainer, ContentPane, dom, query, xhr, domAttr, validate, on, domStyle, registry, request, json, ready) {

        ready(function () {

            console.log('before country select');
            var countrySelect = dijit.byId("id_country"); //keep a reference to country select
            console.log(countrySelect);
        }); });

我有一个带有所有可用国家/地区列表的FilteringSelect。 第一次打开“浮动”窗格时,将呈现表单,并进入chrome控制台

before country select 
Object {_attachPoints: Array[4], _attachEvents: Array[0], constraints: Object, baseClass: "dijitTextBox dijitComboBox dijitValidationTextBox", query: Object…}

当我关闭浮动窗格时,我看到DOM节点已完全删除。 当我再次打开它时,表单再次呈现,但是在控制台中

before country select
undefined 

就像它找不到#id_country一样,或者脚本在完成加载之前就运行了。

我猜这是因为主页已经加载,现在文档已准备就绪。 如何预防此问题?

原始dijit“ id_country”是否有可能未被完全删除? 因此,当再次加载页面时,该ID正在使用,并且会生成一个新ID?

如果您认为代码在页面完全加载之前正在运行(似乎不太可能),请尝试在超时时间内运行该代码,这样就可以确保页面已完成加载。

看来这是时间错误的情况。 第一次加载FloatingPane时,没有任何内容需要解析,并且未加载所需的模块。 因此,有很多时间来加载类,解析内容然后运行脚本。

在关闭时,将删除窗口的整个DOM树。

第二次已加载类,但dom节点尚未准备好。 它们必须再次从服务器加载,然后解析。 但是所需的类已经加载,因此脚本没有其他事情可做,因此可以继续执行其功能。 var countrySelect = dijit.byId("id_country");尚未就绪,因此调用var countrySelect = dijit.byId("id_country"); 找不到那个dijit。

解决方案是将整个脚本逻辑包装在里面

     dijit.byId('signup-window').on('load', function () {
//script logic here
              });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM