javascript - 为什么这些日历 javascript 隐藏 IE 的 select、applet 和 iframe 标记?

标签 javascript internet-explorer internet-explorer-8 calendar

我正在尝试诊断比我支持的旧站点的问题。问题是在 IE8 中,SELECT 标签被隐藏。事实证明,这是由于旧版本的 calendar.js 不仅将 visibility:hidden 样式应用于 SELECT 标签,还应用于小程序和 iframe。

我对我的 JavaScript 和旧浏览器怪癖的细节感到生疏,但我发现奇怪的是,当这些标签与日历无关时,它会隐藏这些标签。在出现问题的页面中,隐藏的选择标记位于日历对象上方的 div 中,尽管它们的形式相同。

这是早期版本 IE 的问题吗?放入 if 来检查 IE 版本,并且不在版本 8 及更高版本中应用这些样式是否“安全”?

这是来自 calendar.js 的函数:

Calendar.prototype.hideShowCovered = function () {
  if (!Calendar.is_ie && !Calendar.is_opera)
    return;
  function getVisib(obj){
    var value = obj.style.visibility;
    if (!value) {
      if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C
        if (!Calendar.is_khtml)
          value = document.defaultView.
            getComputedStyle(obj, "").getPropertyValue("visibility");
        else
          value = '';
      } else if (obj.currentStyle) { // IE
        value = obj.currentStyle.visibility;
      } else
        value = '';
    }
    return value;
  };

  var tags = new Array("applet", "iframe", "select");
  var el = this.element;

  var p = Calendar.getAbsolutePos(el);
  var EX1 = p.x;
  var EX2 = el.offsetWidth + EX1;
  var EY1 = p.y;
  var EY2 = el.offsetHeight + EY1;

  for (var k = tags.length; k > 0; ) {
    var ar = document.getElementsByTagName(tags[--k]);
    var cc = null;

    for (var i = ar.length; i > 0;) {
      cc = ar[--i];

      p = Calendar.getAbsolutePos(cc);
      var CX1 = p.x;
      var CX2 = cc.offsetWidth + CX1;
      var CY1 = p.y;
      var CY2 = cc.offsetHeight + CY1;

      if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
        if (!cc.__msh_save_visibility) {
          cc.__msh_save_visibility = getVisib(cc);
        }
        cc.style.visibility = cc.__msh_save_visibility;
      } else {
        if (!cc.__msh_save_visibility) {
          cc.__msh_save_visibility = getVisib(cc);
        }
        cc.style.visibility = "hidden";
      }
    }
  }
};

最佳答案

这些对象始终位于 Z 顺序的顶部,这意味着如果日历尝试显示在它们的顶部,它们就会显示在日历的顶部。

在任何现代浏览器中,select 都不再适用,并且(您需要对其进行测试)我怀疑 iframe 也是如此。他们在 IE8 中当然不会有这个问题。

另一方面,

applet 几乎肯定仍然存在问题,因为它是嵌入到页面中的重量级窗口。 Flash 在重量级窗口模式下也会出现同样的问题。

关于javascript - 为什么这些日历 javascript 隐藏 IE 的 select、applet 和 iframe 标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3873855/

相关文章:

javascript - Node 嵌套函数中的异步/等待?

javascript - 触发 Internet Explorer 的更改事件

css - ie8 在第一页加载时不呈现/加载@font-face 字体

javascript - 为什么 javascript 点击区域在 IE8 中不起作用?

css - .EOT 字体在 IE8 及以下版本中不显示

css - 尽管实现了 response.js 和 css3-mediaqueries.js,但响应式 Bootstrap 页面在 IE8 中不起作用

javascript - 我如何通过 $.ajax 调用使用成功函数

c# - Sys.WebForms.PageRequestManagerServerErrorException : An unknown error occurred while processing the request on the server.“

php - 动态创建的复选框计算,未正确显示

html - 将鼠标悬停在 'a' 标签上(IE 无法正常工作)