Javascript document.getElementById的值是多少?
我是一名经验丰富的程序员,但我正在努力学习javascript,通过观察事物的工作方式,我学到了最好的东西。我发现一个脚本可以在数组中淡出图像。这是剧本Javascript document.getElementById的值是多少?,javascript,javascript-events,Javascript,Javascript Events,我是一名经验丰富的程序员,但我正在努力学习javascript,通过观察事物的工作方式,我学到了最好的东西。我发现一个脚本可以在数组中淡出图像。这是剧本 window.addEventListener?window.addEventListener("load",so_init,false):window.attachEvent("onload",so_init); var d=document, imgs = new Array(), zInterval = null, current=0,
window.addEventListener?window.addEventListener("load",so_init,false):window.attachEvent("onload",so_init);
var d=document, imgs = new Array(), zInterval = null, current=0, pause=false;
function so_init() {
if(!d.getElementById || !d.createElement)return;
css = d.createElement("link");
css.setAttribute("href","xfade2.css");
css.setAttribute("rel","stylesheet");
css.setAttribute("type","text/css");
d.getElementsByTagName("head")[0].appendChild(css);
imgs = d.getElementById("imageContainer").getElementsByTagName("img");
for(i=1;i<imgs.length;i++) imgs[i].xOpacity = 0;
imgs[0].style.display = "block";
imgs[0].xOpacity = .99;
setTimeout(so_xfade,1000);
}
function so_xfade() {
cOpacity = imgs[current].xOpacity;
nIndex = imgs[current+1]?current+1:0;
nOpacity = imgs[nIndex].xOpacity;
cOpacity-=.05;
nOpacity+=.05;
imgs[nIndex].style.display = "block";
imgs[current].xOpacity = cOpacity;
imgs[nIndex].xOpacity = nOpacity;
setOpacity(imgs[current]);
setOpacity(imgs[nIndex]);
if(cOpacity<=0) {
imgs[current].style.display = "none";
current = nIndex;
setTimeout(so_xfade,1000);
} else {
setTimeout(so_xfade,50);
}
function setOpacity(obj) {
if(obj.xOpacity>.99) {
obj.xOpacity = .99;
return;
}
obj.style.opacity = obj.xOpacity;
obj.style.MozOpacity = obj.xOpacity;
obj.style.filter = "alpha(opacity=" + (obj.xOpacity*100) + ")";
}
}
及
我能找到的所有东西都显示window.addEventListener和d.getElementById分别是window和document对象的方法。那么,当它们在没有任何参数的情况下被调用时,它们的值是什么,在这种情况下,什么条件会使它们为真,什么条件会使它们为假
if(!d.getElementById || !d.createElement)return;
这一行测试这些方法是否存在,也就是说,它测试浏览器是否支持这两种方法。处理浏览器兼容性不是一件有趣的事情,但最好测试功能,而不是浏览器版本
这一行测试这些方法是否存在,也就是说,它测试浏览器是否支持这两种方法。处理浏览器兼容性不是一件有趣的事,但最好测试功能,而不是浏览器版本。代码正在检查这些方法是否存在,以及它们是否存在。代码正在使用替代方法(浏览器兼容性问题)或中止一个无论如何都会失败的函数 这一行:
window.addEventListener?window.addEventListener("load",so_init,false):window.attachEvent("onload",so_init);
if(!d.getElementById || !d.createElement)return;
正在检查是否存在窗口。addEventListener
。如果它真的这么做了,那就是在叫它。如果它不存在,则调用window.attachEvent
。这是为了处理旧版本的IE,它没有addEventListener
,但有一个类似的功能,名为attachEvent
。大多数头脑清醒的程序员会把这个抽象放在一个实用函数或一个垫片中,你可以调用它来从正常编程中抽象出来。在IE9之前的所有IE版本中仍然需要这种逻辑
这一行:
window.addEventListener?window.addEventListener("load",so_init,false):window.attachEvent("onload",so_init);
if(!d.getElementById || !d.createElement)return;
如果对象
d
上的getElementById
或createElement
中的任何一个属性/方法不存在,则正在中止函数(提前返回)。由于这些方法存在于所有当前使用的浏览器中(添加到IE 5.5中,Firefox、Chrome和Safari 1.0中),因此不再需要进行此检查。代码正在检查这些方法是否存在,以及它们是否使用了替代方法(浏览器兼容性问题)或中止一个无论如何都会失败的功能
这一行:
window.addEventListener?window.addEventListener("load",so_init,false):window.attachEvent("onload",so_init);
if(!d.getElementById || !d.createElement)return;
正在检查是否存在窗口。addEventListener
。如果它真的这么做了,那就是在叫它。如果它不存在,则调用window.attachEvent
。这是为了处理旧版本的IE,它没有addEventListener
,但有一个类似的功能,名为attachEvent
。大多数头脑清醒的程序员会把这个抽象放在一个实用函数或一个垫片中,你可以调用它来从正常编程中抽象出来。在IE9之前的所有IE版本中仍然需要这种逻辑
这一行:
window.addEventListener?window.addEventListener("load",so_init,false):window.attachEvent("onload",so_init);
if(!d.getElementById || !d.createElement)return;
如果对象
d
上的getElementById
或createElement
中的任何一个属性/方法不存在,则正在中止函数(提前返回)。不再需要此检查,因为这些方法存在于所有当前使用的浏览器中(在5.5中添加到IE,在Firefox、Chrome和Safari 1.0中出现)。在这两种情况下,脚本似乎都在练习渐进和优雅的降级技术。查看这篇文章,但简而言之,它是在检查浏览器是否支持这些功能。在这两种情况下,脚本似乎都在练习渐进而优雅的降级技术。请阅读本文,但简而言之,它是在检查浏览器是否支持这些功能。如果使用不带括号的函数名,它不会调用该函数,它会提供对该函数的引用。一个非常简单的例子:
function f1() { alert("hi"); }
var f2 = f1; // This doesn't call the f1 function, it takes a reference
// to it and assigns it to f2.
f2(); // Can call f2 since it refers to the same function; alerts "hi"
从中可以看出,函数名实际上只是碰巧包含函数引用的变量,而不是字符串、数字或其他,如果您定义这样的函数,这一点可能会更加明显:
var f3 = function() { alert("hello") };
f3(); // "hello"
那么,在这样的背景下,如果(someFunctionName),那么说是什么意思呢?在JS中,表达式被视为“truthy”,不仅当它是布尔true,而且当它的计算结果是非空字符串、非零数字或任何对象(甚至是空对象)时。空字符串、零、空、未定义和NaN都是“falsy”。布尔true
和“truthy”之间的区别在JavaScript中非常重要。JS函数是一种对象类型。因此:
if (someFunctionName)
// is testing if someFunctionName is "truthy" and is a shortcut way of saying
if (someFunctionName != undefined)
// also equivalent to
if (typeof someFunctionName != "undefined")
您询问的第二个示例是,if(d.getElementById)
,它测试对象d
(设置为document
)是否有一个名为getElementById
的方法。从一般意义上讲,这是因为很久以前并非所有浏览器都支持该方法,因此此代码旨在允许代码在所有浏览器中运行而不会出错。实际上,document.getElementById()
至少从IE5开始就受到支持,因此此测试是多余的
不过,您询问的第一个示例仍然相关,因为IE8和更早版本不支持window.addEventListener
。因此,代码:
window.addEventListener ? window.addEventListener("load",so_init,false)
: window.attachEvent("onload",so_init);
是否正在使用三元运算符?:
测试是否定义了窗口.addEventListener
。如果是,则调用它,否则调用window.attachEvent
(这是旧的IE等价物)。所有现代浏览器都支持一种或另一种。如果使用不带括号的函数名,它不会调用该函数,它会提供对该函数的引用。一个非常简单的例子:
function f1() { alert("hi"); }
var f2 = f1; // This doesn't call the f1 function, it takes a reference
// to it and assigns it to f2.
f2(); // Can call f2 since it refers to the same function; alerts "hi"
从中可以看出,函数名实际上只是碰巧包含函数引用的变量,而不是字符串、数字或其他,如果您定义这样的函数,这一点可能会更加明显:
var f3 = function() { alert("hello") };
f3(); // "hello"
那么,在这样的背景下,如果(someFunctionName)
,那么说是什么意思呢?在JS中,表达式被认为是“truthy”,不仅当它是布尔true,而且当它的计算结果是非空st