浮动窗格中的Dojo javascript不能很好地工作两次

时间:2014-09-24 20:40:23

标签: javascript html dojo

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

加载
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一样,或者在脚本完成加载之前就已经运行了。

我想这是因为主页已经加载,现在文档已经准备好了。我该如何防止这个问题?

2 个答案:

答案 0 :(得分:0)

原来的dijit&#34; id_country&#34>是否有可能?还没有完全删除?因此,当再次加载页面时,该ID正在使用中,并生成一个新的ID?

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

答案 1 :(得分:0)

似乎是时间错误的情况。第一次加载FloatingPane时,没有任何东西需要解析,并且没有加载所需的模块。所以有足够的时间加载类,解析内容然后运行脚本。

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

第二次类已经加载但是dom节点还没有准备好。必须从服务器再次加载它们然后进行解析。但是已经加载了所需的类,因此脚本没有其他任何操作,所以它继续使用它的函数。 dijits尚未准备就绪,因此呼叫var countrySelect = dijit.byId("id_country");无法找到dijit。

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

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