代码之家  ›  专栏  ›  技术社区  ›  Codex73

JavaScript脚本在Firefox中不起作用

  •  -1
  • Codex73  · 技术社区  · 14 年前

    我有一个旧函数,它缺少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 回复  |  直到 14 年前
        1
  •  2
  •   RussellUresti    14 年前

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

    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”。如果仍要使用event,请将参数重写为:

    function get_mouse(event)
    

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

        2
  •  7
  •   gblazex    14 年前

    我不打算发布如何重写代码的代码@Ivo Wetzel's正是您所需要的,但是让meg给您一些建议。

    1. 世界变化很快,计算机工业也在迅速变化。虽然有时它没有我们想要的那么快(IE 6慢慢褪色),但没有必要支持Netscape 4。

    2. 咨询以下网站 StatCounter 找出正在使用的浏览器(在您的国家/地区)。同时咨询 YUI graded browser support . 雅虎是互联网上最大的玩家之一,他们的网站必须为几乎所有人服务,所以他们知道自己在说什么。

    3. 找到一个好的DOM引用。 MDC 是你所需要的,但是有 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 .

    “同步编程是不礼貌的,不应该用于人们使用的应用程序。”—道格拉斯·克罗克福德

        3
  •  3
  •   Ivo Wetzel    14 年前

    哦,我的上帝。。。这一定是我多年来见过的最糟糕的代码了,那么让我们试着清理一下:

    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";
    }
    

    它仍然坏得无法修理,但是 应该 工作。。。不知怎的。。。。好吧,除非你把剩下的都贴出来,否则我没办法测试。

    求你了,我求你。。。扔掉所有这些垃圾,使用jQuery。

        4
  •  2
  •   wajiw    14 年前

    似乎需要将“event”的所有实例更改为“e”。

        5
  •  1
  •   Anthony Mills    14 年前

    Firefox包括 document.documentElement document.documentElement.scrollTop document.body document.body.scrollTop 所以你进入的区域是IE和Firefox的对应区域。

    你还应该以如下方式开始你的函数

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

    然后使用 e 而不是 event 在你使用的所有地方 事件 .

        6
  •  0
  •   Ming-Tang    14 年前

    添加 var event = e 在功能体的第一行,如果你害怕麻烦 function get_mouse(e) { var event = e;