1. 高度可定制化界面的实现,大致思路是,在源工程进行界面绘制,发布后把变动的模块保存到数据库并通知目标工程进行重绘页面。目标工程重新从数据库中取出变动的模块,然后绘制页面达到效果。

  2. 碰到的问题

(1)juery执行完成append()方法后,js代码块被过滤执行了。基于上述1的思路,是要先保存到数据库,再到目标工程重绘的。在源工程执行后,js代码块消失了,导致目标工程出问题。

  目标就是在html的js代码块,在源工程取出绘制页面,保存入库,在目标工程还要保留该代码块界面重绘使用。

  通过jquery对象的append()给界面填充数据库的页面html内容时,html内容中包含js代码块,如“<script>var a=1;</script>”,在append()执行完成之后,该script代码块是被执行了,所以append()之后的组件是没有该script代码块的。换一个思路,在append()执行之后,取a的值,是可以取到的。如打印alert(a);是可以弹出1的。

  想到的解决办法就是,执行完append()方法后,js脚本也执行了,设置个全局变量保存js脚本中的值。然后入库时,重新把js代码块拼装保存到数据库中。

  在拼装的过程中又遇到问题了,因为包含在<script></script>脚本中,所以拼接“<script>var a=1;</script>”时,</script>提前结束了。需要用到转义字符,好吧,那拼接成“<script>var a=1;<\/script>”。这种方法在html和jsp是认同的,可行的。但到了xhtml中,执行完全校验,要求每个开始的<script>都必须有结束的</script>来结束。网上有提到用分开的方法,即把<scipt>分成两部分'<scr'+'ipt>',也是会报错的。又变得纠结了。所以继续找方法。完全用转义字符替代,变为“&lt;script&gt;var a=1;&lt;/script&gt;”。这次没报错了,界面校验通过也保存到数据库了。在目标工程进行重绘的时候,直接将html代码块输出了,js代码块也执行输出,出现了界面显示“<script>var a=1;</script>”。又不是想要的结果。目的是要该js代码块执行的。继续找方法,还是得在保存库的时候就保存成“<script>var a=1;</script>”。这样绘制界面时候才会执行该js代码。查询了jquery的api,没有发现可用的方法,又找到js原生的方法escape()和unescape()。

var temp = escape("&lt;script&gt;var a=1;&lt;/script&gt;");

var result = unescape(temp);

将result拼接到html代码块入库就完成了。