关于 artDialog 的 iframeTools 一处问题和尝试性解决

昨天试了下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;
测试通过
3 条评论

3 条评论

  • wehnehw 说道:

    谢谢分享,刚用到这个碰着了!

  • light 说道:

    我也碰到这个问题了,按上面方法改过以后在chrome下面可以,在ie8下面还是报原来的错。最后只能在顶层页面上加上artDialog的引用才解决掉

    • Moyo 说道:

      你用非官方的那个修改方法试试,如果可以的话,说明IE下window.open打开的页面只能获取到window.opener

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>