[英]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.