JavaScript-скрипт не работает в Firefox - PullRequest
0 голосов
/ 17 ноября 2010

У меня есть старая функция, в которой отсутствуют строки для Mozilla / Firefox, и, следовательно, JavaScript не работает должным образом Функция отслеживает координаты мыши, поэтому я могу позиционировать окна.

Как заставить код работать и в Firefox?

Xoffset = -60; // modify these values to ...
Yoffset = 20; // change the popup position.
var old, skn, iex = (document.all),
    yyy = -1000;

var ns4 = document.layers
var ns6 = document.getElementById && !document.all
var ie4 = document.all

if (ns4) skn = document.dek
else if (ns6) skn = document.getElementById("dek").style
else if (ie4) skn = document.all.dek.style
if (ns4) document.captureEvents(Event.MOUSEMOVE);
else {
  skn.visibility = "visible"
  skn.display = "none"
}
document.onmousemove = get_mouse;


function popup(msg, bak) {
  var content = 
      "<TABLE  WIDTH=150 BORDER=1 BORDERCOLOR=black CELLPADDING=2" +
      "CELLSPACING=0 " + "BGCOLOR=" + bak + "><TD ALIGN=center>" + 
      "<FONT COLOR=black SIZE=2>" + msg + "</FONT></TD></TABLE>";
  yyy = Yoffset;
  if (ns4) {
    skn.document.write(content);
    skn.document.close();
    skn.visibility = "visible"
  }
  if (ns6) {
    document.getElementById("dek").innerHTML = content;
    skn.display = ''
  }
  if (ie4) {
    document.all("dek").innerHTML = content;
    skn.display = ''
  }
}

function get_mouse(e) {
  var x = (ns4 || ns6) ? event.pageX : event.x + document.body.scrollLeft;
  skn.left = x + Xoffset;
  var y = (ns4 || ns6) ? event.pageY : event.y + document.body.scrollTop;
  if (document.documentElement &&  // IE6 +4.01 but no scrolling going on
     !document.documentElement.scrollTop) {
    y = event.y + document.documentElement.scrollTop;
  }
  else if (document.documentElement && // IE6 +4.01 and user has scrolled
           document.documentElement.scrollTop) { 
    y = event.y + document.documentElement.scrollTop;
  }
  else if (document.body && document.body.scrollTop) { // IE5 or DTD 3.2
    y = event.y + document.document.body.scrollTop;
  }

  skn.top = y + yyy;
}

function kill() {
  yyy = -1000;
  if (ns4) {
    skn.visibility = "hidden";
  }
  else if (ns6 || ie4) skn.display = "none"
}

Я получаю эту ошибку:

«событие не определено»

Работает нормально в IE.

Ответы [ 6 ]

7 голосов
/ 28 ноября 2010

Я не собираюсь публиковать код о том, как переписать ваш код @ Ivo Wetzel's - это почти то, что вам нужно, но позвольте вам дать вам несколько советов.

  1. МирБыстро меняется, как и компьютерная индустрия.И хотя иногда это не так быстро, как мы хотим (IE 6 медленно исчезает), нет необходимости поддерживать Netscape 4.

  2. Проконсультируйтесь с таким сайтом, как StatCounter , чтобы узнать, какие браузеры используются (в вашей стране / регионе).Также проконсультируйтесь с Поддержка браузера YUI Graded .Yahoo является одним из крупнейших игроков в Интернете, их сайт должен работать почти для всех, поэтому они знают, о чем говорят.

  3. Найдите хорошую ссылку на DOM. MDC в значительной степени то, что вам нужно, но хорошо иметь MSDN для IE причуд.Говоря о причудах, не забудьте добавить в закладки Таблицы совместимости QuirksMode .

  4. Никогда не используйте такие вещи, как ie4 = document.all, потому что одна функцияне будет идентифицировать весь браузер.Это все равно что сказать: «Эй, у тебя светлые волосы, ты, должно быть, Брэд Питт» .Используйте функцию обнаружения.Прочитайте эти две замечательные статьи: Обнаружение в браузере (и что делать вместо этого) и Обнаружение функций: современные сценарии браузера

  5. Не используйте document.write, потому что это синхронный ввод-вывод, который ужасен.Это блокирует рендеринг вашей страницы и приводит к плохому пользовательскому опыту.Сеть - это асинхронный .

«Синхронное программирование неуважительно и не должно использоваться в приложениях, которые используются людьми».- Дуглас Крокфорд

3 голосов
/ 28 ноября 2010

Боже мой ... это, наверное, худший код, который я когда-либо видел за последние годы, тогда давайте попробуем его почистить:

Xoffset = -60; // modify these values to ...
Yoffset = 20; // change the popup position.
var old, skn = document.getElementById("dek").style, yyy = -1000;

function popup(msg, bak) {
    var content = 
        "<TABLE  WIDTH=150 BORDER=1 BORDERCOLOR=black CELLPADDING=2" +
        "CELLSPACING=0 " + "BGCOLOR=" + bak + "><TD ALIGN=center>" + 
        "<FONT COLOR=black SIZE=2>" + msg + "</FONT></TD></TABLE>";

    yyy = Yoffset;
    document.getElementById("dek").innerHTML = content;
    skn.display = '';
}

document.onmousemove = function(e) {
    e = e || window.event;

    var x = e.pageX !== undefined ? e.pageX : e.clientX + document.body.scrollLeft;
    var y = e.pageY !== undefined ? e.pageY : e.clientY + document.body.scrollTop;
    skn.left = x + Xoffset;
    skn.top = y + yyy;
}

function kill() {
  yyy = -1000;
  skn.display = "none";
}

Он все еще не исправлен, но он должен работать ... как-то ... Ну, если вы не отправите остальные из них HTML, я не смогу проверить это.

Пожалуйста, прошу вас ... избавьтесь от всего этого дерьма и используйте jQuery.

2 голосов
/ 30 ноября 2010

Вместо того, чтобы проверять браузеры, я бы проверял, существует ли объект / свойство.Например:

var x = e.pageX ? e.pageX : e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; 

Я думаю, что может быть более простой способ сделать это, например,

var x = e.pageX || e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;

, но я не уверен, что это сработает.Проверьте это и посмотрите, что вы получите.Также, для более подробной информации, просмотрите: quirksmode.org / js / events_properties.html

Также обратите внимание, что я изменил «событие» на «e», так как параметр, который вы передаете вфункция "е".Если вы все еще хотите использовать событие, перепишите параметр следующим образом:

function get_mouse(event)

Хотя я не верю, что «событие» является зарезервированным словом для JS, многие браузеры используют его, поэтому я бы предложил придерживатьсяна «е».

2 голосов
/ 17 ноября 2010

Похоже, вам нужно изменить все ваши экземпляры 'event' на 'e'.

1 голос
/ 17 ноября 2010

Firefox включает в себя document.documentElement и document.documentElement.scrollTop и document.body и document.body.scrollTop, поэтому вы вводите области, предназначенные для IE, с Firefox.

Вы также должны начать свою функцию с чего-то вроде

function get_mouse(e) {
    e = e || window.event;

Затем используйте e вместо event во всех местах, которые вы используете event.

0 голосов
/ 17 ноября 2010

Добавьте var event = e в первую строку функции body, если вы боитесь неприятностей function get_mouse(e) { var event = e;

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