日期:2014-05-16  浏览次数:20433 次

开发可拖动portal门户遇到javascript多实例冲突问题,解决方案
最近在为公司开发一个通用的门户发布平台,项目做了一大半了,突然遇到javascript多实例冲突问题,蛋都碎了!!

原理是这样的:

门户的以页面为大的容器,每个页面里面又有多个小的容器(暂且叫它控件容器),控件容器是用来放控件的,后台语言(java)在生成页面时选择对应的控件放到对应的控件容器中。

控件其实就是一大段代码,其中包括html、css、javascript代码,控件中的代码只贡空间本身用,所以后台语言只要把控件所有代码打印到空间容器中,控件中的css和javascript就会把控件表现出来。

问题来了,当同一个控件在同一个页面出现多次时,javascript就无法正常运行了,原因是javascript可能通过id来获取DOM节点,而同一个控件被在同一个页面中有多个,这就意味中存在多个相同的id标签,然后就乱了。。。


目前在考虑的解决方案:

(1)在每个控件容器中加iframe标签并以页面的形式引入控件,但是这样的话一个页面中包含了多个页面,不知道这个样会不会有什么问题,而且iframe本身处理起来不知道会不会出现瑕疵,比如不同浏览器下会不会出现滚动条什么的。。。

(2)通过后台语言给每个控件容器打印一个唯一的id,要求控件中的javascript在DOM操作时都以唯一id来选择标签。但是要怎样给这个id而只让本容器中的javascript拿到这个id呢?例如下面:


page页面内容:(用两个div表示两个控件容器)
——————————————————————————————————————

<!-- id中的1是后台语言输出的唯一标记 -->
<div id="1">
    <script>
        这里需要一行javascript代码
    </script>
</div>


<!-- id中的2是后台语言输出的唯一标记 -->
<div id="2">
    <script>
        这里需要一行javascript代码
    </script>
</div>


——————————————————————————————————————

在页面中标记“这里需要一行javascript代码”的地方应该是一段相同的代码,如何让这段代码执行时拿到其对应的id标签?(id的值是后台语言输入的,所以对javascript是未知的)


详细方案还在讨论中,公司一大帮人跟后面碎蛋中 。。。。