IW升级到12以上后,似乎引用外部的JS文件不好使了,一旦引用,就会出现IW控件无法响应事件,整个页面被锁死, 不知道其他人有没有遇到过类似的现象,反正我是经过多次实验证明引用外部JS就会出错。IW相关的资料也没有引用外部JS文件的具体方法,网上的一些方法基本上是IW10以前版本的,根本不能用。下面给出自己的解决方法:
一种就是直接把JS文件的内容通过TIWServerController.HTMLHeaders或IWForm.ExtraHeader(JavaScript)使用LoadFromFile的方法加载进去。虽然JS内的功能能用了,可是JS文件比较大、内容较多时,生成的客户端页面就会很大。
另一种方法是本文重点介绍的(偶然翻看TMS源代码受到启发):
主要原理就是把JS文件做成IW支持的内部资源文件。首先把JS文件做成IW能识别的内部资源,打开project->Resources and Images->Add,添加JS文件, Resource identifier写入IW_JS_MYJS(MYJS是需要命名的JS名称,一定要是大写,前面的部分是IW的命名规则,不要修改)。Resource types选RCDATA。
然后,打开ServerController单元,uses添加IWServerInternalFiles,在 IWServerControllerBaseCreate事件里添加如下代码:
gInternalFiles.add('IW_JS_MYJS','/js/myjs.js');//这句话就是将资源文件标识为内部文件
HTMLHeaders.Add('<script type="text/javascript" src="$/js/myjs__'+StartUID+'.js"></script>'); 注意“__”是两个下划线。
当然这种方法也只是能够正常调用JS而已,如果JS文件发生变化,整体程序就得重新编译,灵活性大打折扣。本文也只是起到一个抛砖引玉的作用,期待大家能有更好的办法。