ExtPB.Net的demo程序有个树形导航菜单,里面的菜单打开的窗口放在右边的TabStrip控件中。我们可以设计win通过导航打开,但有时我们希望以弹出窗口的形式打开它,但怎么办呢?
现在可以这样修改一下:
1. 数据结构更改:
也就是增加一个OpenStyle=4的类型,然后将要打开的win窗口的路径写在ObjName里,再将该窗口的js文件路径写在OpenParm里,看上图的最后一行即是。
2. 修改w_index.win.js
else if (openStyle == "4") { self.dynamicLoadJs(parm, function () { try { //获得除路径外的实际(.win)窗口名称 var temp = url.split('.'); var objwinName = temp[temp.length - 1]; //动态创建(.win)窗口对象 var iw_subwin = eval("new " + objwinName); requestor.Open("/LoadWindow.ashx?name=" + url, iw_subwin); } catch (err) { requestor.MessageBox("提示", "打开窗口失败:" + err.message); } }); }
新定义了一个函数: dynamicLoadJs
1 this.dynamicLoadJs = function (jsurl, callback) { 2 if (jsLoadedFlag == jsurl) { //检查是否已经加载过 3 if (callback) { 4 callback(); 5 return; 6 } 7 } 8 var Odoc = document.getElementsByTagName('HEAD')[0]; 9 var oScript = document.createElement('script'); 10 oScript.setAttribute('type', 'text/javascript'); 11 oScript.setAttribute('src', jsurl); 12 //oScript.setAttribute('id', key); 13 Odoc.appendChild(oScript); 14 oScript.onload = oScript.onreadystatechange = function () { 15 if (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete') { 16 jsLoadedFlag = jsurl; //设置加载标记 17 oScript.onload = oScript.onreadystatechange = null;
18 if (callback) { 19 callback(); 20 } 21 } 22 } 23 }
另一点就是,加载的js如果设置一个唯一key值,也应该可以保证避免重复吧。那怎么设置呢?(是否可以将 jsurl 进行编码当做唯一key值)
限制:win窗口有参数的情况没处理。