我正在尝试在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一样,或者在脚本完成加载之前就已经运行了。
我想这是因为主页已经加载,现在文档已经准备好了。我该如何防止这个问题?
答案 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
});