我的第一个 JavaScript。有什么错误吗?

My first JavaScript. Any errors?

提问人:Jeff 提问时间:8/23/2009 最后编辑:Jeff 更新时间:10/19/2020 访问量:465

问:

星期天早上好!

这个周末,在摆弄了一些 JavaScript 之后,我终于写了我的第一个脚本。它是一个工具提示生成器。它在 FF 3 + 3.5、IE 6 + 7、Safari 4、Chrome 2 + 3 和 Opera 9 + 10 中运行良好。

在将我的新代码投入生产之前,我想我会问你是否看到任何明显的问题——或者它是否完美?(笑)

JSLint.com 报告:

Error:

Problem at line 10 character 15: 'e' is already defined.

    var e = window.event;

Implied global: window 10, document 19,20,22,24,33,35,41,43,49,55

这是我的代码(如果您不喜欢我的代码风格,请提前道歉):

function getmouseposition( e )
{
    var offx = 22;
    var offy = 14;
    var posx = 0;
    var posy = 0;

    if ( !e )
    {
        var e = window.event;
    }
    if ( e.pageX || e.pageY )
    {
        posx = e.pageX;
        posy = e.pageY;
    }
    else if ( e.clientX || e.clientY )
    {
        posx = e.clientX
               + document.body.scrollLeft
               + document.documentElement.scrollLeft;
        posy = e.clientY
               + document.body.scrollTop
               + document.documentElement.scrollTop;
    }
    if ( document.getElementById )
    {
        var tooltip = document.getElementById( 'tooltip' );

        tooltip.style.left = ( posx + offx ) + 'px';
        tooltip.style.top = ( posy + offy ) + 'px';
    }
}

function tooltip_on( text )
{
    if( !document.getElementById( 'tooltip' ) )
    {
        var span = document.createElement( 'span' );

        span.id = 'tooltip';
        span.style.display = 'none';
        span.innerHTML = ' ';

        document.body.appendChild( span );
    }
    var tooltip = document.getElementById( 'tooltip' );

    tooltip.innerHTML = text;
    tooltip.style.display = 'block';
    tooltip.style.position = 'absolute';

    document.onmouseover = getmouseposition;
    // document.onmousemove = getmouseposition;
}

function tooltip_off()
{
    document.getElementById( 'tooltip' ).style.display = 'none';
}

编辑:

我也想知道,这句话在:getmouseposition function

if ( document.getElementById )
JavaScript的

评论

0赞 ChaosPandion 8/23/2009
嘿 Jeff,你为什么不使用 title 属性?
0赞 André Hoffmann 8/23/2009
可能是因为他不能使用 CSS 设置它们的样式。
0赞 ChaosPandion 8/23/2009
我想是这样。但是没有进一步的背景,我不确定。
0赞 meandmycode 8/23/2009
'if (document.getElementById)' 正在检查文档对象是否有名为 getElementById 的成员,如果没有,它将得到 'undefined',因此条件将变为 'if (undefined)',并且未定义的数据类型支持转换为布尔值,它将返回为 false。另一方面,如果成员存在,它将获取对象,我相信默认情况下对象会转换为布尔值 true。基本上,它正在检查浏览器是否支持函数“getElementById”,以便它可以尝试使用它。
0赞 Jeff 8/23/2009
感谢所有的帮助。希望我能接受不止一个答案,因为它们都很好。

答:

4赞 p4bl0 8/23/2009 #1

对于错误:由于是函数的参数,它已经存在,因此您不需要声明它,只需为其赋值(如果它为 null 或未定义)。e

只需删除相关行的“”部分:var

if ( !e ) e = window.event;

评论

0赞 Jeff 8/23/2009
因此,为了清楚起见,我应该将“if ( !e ) { var e = window.event; }” 更改为 “if ( !e ) e = window.event;”?
0赞 meandmycode 8/23/2009
请注意,如果你像示例一样删除大括号,jslint 会抱怨,它会强制你不要删除语句块大括号。
0赞 p4bl0 8/23/2009
考虑到 meandmycode 所说的内容,您(Jeff)应该将“”更改为“”。if ( !e ) { var e = window.event; }if ( !e ) { e = window.event; }
1赞 ChaosPandion 8/23/2009 #2

我建议您遵循函数名称约定。它使那些维护代码的人的生活变得更加轻松。

function myMethodName(myParam) {
    // Code
}

评论

0赞 Jeff 8/23/2009
投票支持因果报应。顺便说一句,有人否决了我的整个问题。呜呜呜!不。
2赞 VoteyDisciple 8/23/2009 #3

是的。即使没有人发现错误,也总是有错误。

但是,在这种特殊情况下,您给出的报告是正确的。你有:

var e = window.event;

这是创建一个变量,而不是替换您已经定义的参数。将其更改为:ee

e = window.event;

评论

0赞 Jeff 8/23/2009
因此,为了清楚起见,我应该将“if ( !e ) { var e = window.event; }” 更改为 “e = window.event;”?下面有人说了非常相似的话。
1赞 VoteyDisciple 8/23/2009
您应该将该行精确地替换为 p4bl0 建议的行完全相同的内容,但出于风格原因也要删除大括号。var e = window.event;e = window.event;
1赞 Kyle B. 8/23/2009 #4

你有一个函数的参数,也通过你的函数内部声明。当参数传递给函数时,它已经作为该名称存在,声明具有相同名称的变量将导致错误。如果是这种情况,我会更改声明的变量的名称、参数的名称或正确分配它。evar e =

2赞 Kenan Banks 8/23/2009 #5

该 jslint 错误意味着该变量已经通过作为所述函数的参数在函数范围内定义。无需重新声明它,因此只需从该行中删除即可。egetmousepositionvar

其次,显式访问 and 对象的属性是非常标准的。我不会更改您代码的那部分。不知道为什么 jslint 甚至提到了这些行。windowdocument

非常挑剔的警察会抱怨括号内的空格:

// Most do this:
function myFunction(param){
   // Statement 1
   // Statement 2
   // Statement 3
}

// Not this
function myFunction( param )
{
   // Statement 1
   // Statement 2
   // Statement 3
}

非常非常挑剔的风格傻瓜会告诉你在函数的顶部使用一个 var 声明:

// Do this
function getmouseposition(e){
    var offx = 22,
        offy = 14,
        posx = 0,
        posy = 0;


// Not this
function getmouseposition(e)
{
    var offx = 22;
    var offy = 14; 
    var posx = 0;
    var posy = 0;

最后,大多数注重风格的 javascript 程序员会使用驼峰大小写来表示函数,因此而不是getMousePositiongetmouseposition

我的观点是,除了删除我在顶部建议的声明之外,只要您始终如一地坚持格式,您的代码就具有相当可读性和体面的风格。var

0赞 austin cheney 8/23/2009 #6

要解决与检查相关的 JSLint 问题,请执行假定浏览器选项。语法看起来不错,除了我会尝试使用单个 var 命令和函数顶部的逗号分隔列表来声明所有变量。这样效率更高,也更容易/。implied global... documentmaintainread

你的第一次尝试做得很好,我希望这对你有用。

0赞 Christian C. Salvadó 8/23/2009 #7

为了响应您的编辑,如果正在检查该功能是否可用,那么在现在,可以安全地假设此功能可用。getElementById

您可以检查是否找到该元素,而不是检查函数:

var tooltip = document.getElementById('tooltip');

if (tooltip) {
  tooltip.style.left = ( posx + offx ) + 'px';
  tooltip.style.top = ( posy + offy ) + 'px';
}

您的功能,可以简化:getmouseposition

function getmouseposition( e ) { 
  var offx = 22, 
      offy = 14, 
      posx = 0, 
      posy = 0, tooltip; 

  e = e || window.event; 
  posx = e.pageX || (e.clientX 
                    + document.body.scrollLeft 
                    + document.documentElement.scrollLeft); 

  posy = e.pageY || (e.clientY  
                    + document.body.scrollTop 
                    + document.documentElement.scrollTop); 

  if (tooltip = document.getElementById('tooltip')) { 
    tooltip.style.left = ( posx + offx ) + 'px'; 
    tooltip.style.top = ( posy + offy ) + 'px'; 
  } 
} 
0赞 crunchdog 8/23/2009 #8

if ( document.getElementById )

此检查用于检测是否为当前使用的浏览器的文档对象定义了函数 getElementById。如果用户使用的浏览器不支持此功能,则不希望在浏览器中出现错误,而是处理这种情况。