提问人:Jeff 提问时间:8/23/2009 最后编辑:Jeff 更新时间:10/19/2020 访问量:465
我的第一个 JavaScript。有什么错误吗?
My first JavaScript. Any errors?
问:
星期天早上好!
这个周末,在摆弄了一些 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 )
答:
对于错误:由于是函数的参数,它已经存在,因此您不需要声明它,只需为其赋值(如果它为 null 或未定义)。e
只需删除相关行的“”部分:var
if ( !e ) e = window.event;
评论
if ( !e ) { var e = window.event; }
if ( !e ) { e = window.event; }
我建议您遵循函数名称约定。它使那些维护代码的人的生活变得更加轻松。
function myMethodName(myParam) {
// Code
}
评论
是的。即使没有人发现错误,也总是有错误。
但是,在这种特殊情况下,您给出的报告是正确的。你有:
var e = window.event;
这是创建一个新变量,而不是替换您已经定义的参数。将其更改为:e
e
e = window.event;
评论
var e = window.event;
e = window.event;
你有一个函数的参数,也通过你的函数内部声明。当参数传递给函数时,它已经作为该名称存在,声明具有相同名称的变量将导致错误。如果是这种情况,我会更改声明的变量的名称、参数的名称或正确分配它。e
var e =
该 jslint 错误意味着该变量已经通过作为所述函数的参数在函数范围内定义。无需重新声明它,因此只需从该行中删除即可。e
getmouseposition
var
其次,显式访问 and 对象的属性是非常标准的。我不会更改您代码的那部分。不知道为什么 jslint 甚至提到了这些行。window
document
非常挑剔的警察会抱怨括号内的空格:
// 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 程序员会使用驼峰大小写来表示函数,因此而不是getMousePosition
getmouseposition
我的观点是,除了删除我在顶部建议的声明之外,只要您始终如一地坚持格式,您的代码就具有相当可读性和体面的风格。var
要解决与检查相关的 JSLint 问题,请执行假定浏览器选项。语法看起来不错,除了我会尝试使用单个 var 命令和函数顶部的逗号分隔列表来声明所有变量。这样效率更高,也更容易/。implied global... document
maintain
read
你的第一次尝试做得很好,我希望这对你有用。
为了响应您的编辑,如果正在检查该功能是否可用,那么在现在,可以安全地假设此功能可用。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';
}
}
if ( document.getElementById )
此检查用于检测是否为当前使用的浏览器的文档对象定义了函数 getElementById。如果用户使用的浏览器不支持此功能,则不希望在浏览器中出现错误,而是处理这种情况。
评论