昨天试了下artDialog,感觉还不错,但是有点可惜的是它的iframeTools和thickbox一样,在我的项目里还是无法加载iframe(IE6下)
在IE6下,thickbox,普通模式,例如直接定义一个a标签,class为thickbox,这样可以加载,但我在JS中直接调用tb_show就无法加载;artDialog,也是无法加载,一直显示正在载入中,Chrome下均正常
这个问题我在IE下是直接用window.open来解决了
说到这里,实际测试中还发现了一个问题,本来我直接操作父窗口是用window.parent,但是window.open打开的页面中这样是无效的,我用了另外一段代码来解决:
var op = window.opener ? window.opener : window.parent; op.__catalog_add_finish(123);
这样就可以调用父窗口的__catalog_add_finish函数了。
好了,回归到iframeTools上,我先说下我的页面布局:A页面作为菜单导航,没有任何JS,然后iframe包含了B页面,B页面作为主要内容展示,现在想在B页面中打开C页面
这时用artDialog.iframeTools就碰到问题了,调用art.dialog.open时会提示
Uncaught TypeError: Cannot read property ‘defaults’ of undefined
看了下artDialog.iframeTools.source.js,第39行是这样写的:
if (test('top')) {
top = window.top;
} else if (test('parent')) {
top = window.parent;
};这个匿名函数是这么定义的:
/** 获取 artDialog 可跨级调用的最高层的 window 对象 */ var _top = artDialog.top = artDialog.parent = function ()
也就是说,我在B页面调用art.dialog.open,但是却直接跨级,调用A页面的对象了。A页面没有加载artDialog,当然会报错了。
不知道作者为何要这样设计,刚才QQ微博咨询了下作者,还未回复。
我自己把代码改了下,在我的布局环境下是可以的,但是不知道会不会有其他的问题。
将刚才第39开始的那段代码改成这样:
if (test('opener') && window.opener.artDialog) {
top = window.opener;
} else if (test('parent') && window.parent.artDialog) {
top = window.parent;
} else if (test('top') && window.top.artDialog) {
top = window.top;
};现在是可以使用了
over
PS : @ 2011-08-16 12:52作者(http://t.qq.com/tangbin)在QQ微博回复我了,现在公布一个官方解决方法
修改artDialog.iframeTools.source.js第36行
return doc.getElementsByTagName('frameset').length === 0;改成
return window[name].artDialog && doc.getElementsByTagName('frameset').length === 0;测试通过
谢谢分享,刚用到这个碰着了!
我也碰到这个问题了,按上面方法改过以后在chrome下面可以,在ie8下面还是报原来的错。最后只能在顶层页面上加上artDialog的引用才解决掉
你用非官方的那个修改方法试试,如果可以的话,说明IE下window.open打开的页面只能获取到window.opener