JavaScript脚本在Firefox中不起作用

时间:2010-11-16 23:03:29

标签: javascript firefox dom javascript-events

我有一个旧函数,它缺少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 个答案:

答案 0 :(得分:7)

我不会发布关于如何重写代码的代码@Ivo Wetzel几乎是你所需要的,但是让meg给你一些建议。

  1. 世界正在快速变化,计算机行业也在快速变化。虽然有时它没有我们想要的那么快(IE 6缓慢消失),但是没有必要支持Netscape 4.

  2. 请咨询 StatCounter 等网站,了解正在使用的浏览器(在您所在的国家/地区)。另请参阅 YUI graded browser support 。雅虎是互联网上最大的玩家之一,他们的网站几乎适合所有人,所以他们知道他们在谈论什么。

  3. 找到一个好的DOM参考。 MDC 几乎就是您所需要的,但对于IE怪癖来说, MSDN 是件好事。谈论怪癖,不要忘记给 QuirksMode compatibility tables 添加书签。

  4. 切勿使用ie4 = document.all之类的内容,因为单个功能无法识别整个浏览器。这就像是说:“嘿,你有金发,你必须是布拉德皮特”。使用特征检测。阅读以下两篇优秀文章: Browser Detection (and What to Do Instead) Feature Detection: State of the Art Browser Scripting

  5. 不要使用document.write,因为它的同步I / O非常糟糕。它会阻止您的页面呈现并导致糟糕的用户体验。网络就是 asynchronous

  6.   

    “同步编程是不尊重的,不应该在人们使用的应用程序中使用。” - 道格拉斯·克罗克福德

答案 1 :(得分:3)

哦,我的上帝......这一定是我多年来看到的最糟糕的代码,那么让我们试着把它清理干净吧:

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 :(得分:2)

您似乎需要将所有“事件”实例更改为“e”。

答案 3 :(得分:2)

我会测试是否存在对象/属性,而不是测试浏览器。例如:

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

另请注意,我将“event”更改为“e”,因为您传入函数的参数是“e”。如果您仍想使用事件,请将参数重写为:

function get_mouse(event)

虽然我不相信“event”是JS的保留字,但很多浏览器都使用它,所以我建议坚持使用“e”。

答案 4 :(得分:1)

Firefox包含document.documentElementdocument.documentElement.scrollTop以及document.bodydocument.body.scrollTop,因此您输入的是适用于Firefox的IE区域。

你也应该用

之类的东西开始你的功能
function get_mouse(e) {
    e = e || window.event;

然后在您使用e的所有地方使用event代替event

答案 5 :(得分:0)

如果您害怕麻烦,请在函数体的第一行添加var event = e function get_mouse(e) { var event = e;