почему эти календарные javascript-скрипты скрывают теги select, applet и iframe для IE? - PullRequest
0 голосов
/ 06 октября 2010

Я пытаюсь диагностировать проблему с более старым сайтом, чем я поддерживаю.Проблема в том, что в IE8 тег SELECT скрыт.Оказывается, это связано с более старой версией calendar.js, в которой стиль visibility:hidden применяется не только к тегам SELECT, но также к апплетам и фреймам.

Я не справился со своим 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";
      }
    }
  }
};

1 Ответ

4 голосов
/ 06 октября 2010

Эти объекты всегда были / были в верхней части Z-порядка, что означает, что они будут отображаться поверх вашего календаря, если он будет пытаться появиться поверх них.

Это больше не верно для select в любом современном браузере, и (вам нужно проверить это, но) Я подозреваю, что то же самое верно для iframe.У них, конечно, нет этой проблемы в IE8.

applet, с другой стороны, почти наверняка проблема все еще существует, поскольку в страницу встроено тяжелое окно.Вспышка в режиме тяжеловесного окна тоже будет иметь такую ​​же проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...