【问题标题】:jQuery overlay not working in IE6, OperajQuery 覆盖在 IE6、Opera 中不起作用
【发布时间】:2010-06-04 21:18:17
【问题描述】:

我一直在摸索好几个小时试图弄清楚这一点。我有这个页面:http://173.203.72.190/default.aspx。单击“任何美食”时,应该会打开一种叠加层。

除了 IE6 和 Opera 之外,它几乎在所有浏览器中都能正常工作。在 IE6 和 Opera 中,jQuery 'overlay' 不会打开。

有人知道为什么会这样吗?

编辑:触发覆盖的代码如下:

$("a#zoneListLink").click(function() { 

    var listTop = $(this).css("top");
    var listLeft = $(this).css("left");

    var api = $("a#zoneListLink").overlay({api: true, close:'div.close', top: listTop, left:listLeft, onLoad:function() { $(document).click(function() { api.close(); } ); },
    onClose:function() { $(document).unbind("click"); } }).load();

});

【问题讨论】:

  • 嗯,你在那个页面上有很多东西,但如果你有 jQuery,你就会把它弄糊涂。也许您应该尝试将页面减少到重现问题的最小代码。
  • 好点。会尝试一下(回应霍根,而不是杰森)。杰森,我愿意!但我们仍有 10% 的用户使用 IE6。另外,这个问题也出现在 Opera 上。
  • 此外,Opera 的市场份额仅为 0.02%。我不会担心的。 IE6 已正式弃用,没有人使用 Opera。继续前进。
  • @Jason:开发人员很少决定应该支持哪些浏览器
  • @philippe 任何称职的开发人员都应该能够列出为什么不支持这两种浏览器的原因,除非有非常非常具体的要求。最大的问题是您将花费 80% 的时间来处理只有不到 5% 的用户会看到的小怪癖。金钱谈判。

标签: javascript jquery cross-browser opera internet-explorer-6


【解决方案1】:

jQuery 叠加效果内部存在错误或不兼容问题。很难找到,因为 Opera 的行为更有意义,但打破了脚本的错误预期..

首先,比较这个命令在 Opera 和 Firefox 中的输出:

javascript:alert(getComputedStyle(document.getElementById("cuisineListLink"),'').top);

Opera 为您提供美食列表链接的顶部位置(以像素为单位)。 Firefox 说“自动”。

现在,在 combine.js 中查找这段代码(由我包装):

if(typeof t=="string"){
    t=t=="center"?Math.max((n.height()-q)/2,0):parseInt(t,10)/100*n.height()
}

我不知道为什么它会执行“parseInt(t,10)/100*n.height()”,但看起来这段代码需要字符串“center”(对图层进行垂直居中)或一个号码。当 Opera 传入像 '310px' 这样的字符串时,脚本将提取整数,将其除以 100(即 3.1),然后乘以浏览器窗口的高度(?!)。最终效果是叠加层被小心地放置在屏幕之外 - 向下 3 个屏幕高度。

在 Firefox 中,我们到达这一行,变量 t 是字符串 'auto'。该脚本尝试返回“非数字”NaN 的 parseInt(),然后继续除以 100 并乘以窗口高度——这当然会继续返回 NaN。然后它将覆盖定位在 NaNpx 上,浏览器将简单地将其作为虚假值忽略。您会在 Firefox 的错误控制台中找到与此相关的警告。

我建议使用不同的覆盖插件(或者可能是更新的迭代?),因为这段代码没有多大意义。

【讨论】:

  • 出色的工作!我必须承认,我的问题有点像大海捞针(没有上下文,很难调试),而您已经成功了!我昨晚发现'listTop' 和'listLeft' 正在返回'auto'。我意识到(如果我错了,请纠正我),这是因为覆盖控件在窗口上创建了一个位置为“静态”的控件。
  • 我将代码更改为以下: var listPosition = $(this).offset(); var api = $("a#zoneListLink").overlay({api: true, close:'div.close', top: listPosition.top + 26, left:listPosition.left, onLoad:function() { $(document ).click(function() { api.close(); } ); }, onClose:function() { $(document).unbind("click"); } }).load();将位置设为绝对而不是静态 -> $("#zoneList").css("position", "absolute");它有效!
  • 解决它的另一种方法 - 如果标记将保持原样 - 将只是让覆盖层保持静态并且根本不传递任何顶部/左侧值。毕竟,叠加层在脚本无法重新定位它们的其他浏览器中完美定位:)。所以不是 listPosition.top+26 我猜你可以传递 null 什么的?或者只是硬编码字符串“auto”。将其视为性能优化 - 当然,如果标记可能会被移动,那么最好保留当前版本。
  • (顺便说一句,我意识到为什么脚本是这样写的:它支持百分比。所以它需要一个数字,字符串“center”或字符串中的百分比,如“25%”。它的错误是只检查输入是否为字符串,而不是在进行百分比计算之前查找实际的 '%' 符号。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多