虽然同行评审代码以修复IE中的视差问题,但我看到了这些奇怪的代码。
if (window.navigator.userAgent.indexOf("Trident") >= 0) {
$('body').mousewheel(function (event, delta) {
// disable native scroll
if (event.preventDefault) {
event.preventDefault();
} else { // IE fix
event.returnValue = false;
};
$html.stop().animate({
scrollTop: $html.scrollTop() + (-delta * 500)
}, 'slow');
});
}
代码来自this site,但作者没有提到某人如何在函数调用结束时删除()并将其塞入if语句。 Javascript似乎没问题,因为它是一种非常松散的语言,但我不明白这里发生了什么的概念?
If this is an IE browser
when some scrolling happens
[*what is this?*]
add jQuery scroll animation to replace it
done
fi
答案 0 :(得分:4)
这称为 "feature detection" ,是用于确定客户端是否支持某个API的常用模式。它首选 "browser detection" ,这是您的第一行代码(window.navigator.userAgent.indexOf("Trident") >= 0
)。检查用户代理字符串不仅是一个始终是移动目标的全职工作,而且用户代理字符串很容易被欺骗,即使它们不是,它们也不总是准确的。
您的特定用例源于Internet Explorer在IE 9之前不支持preventDefault()
的事实,因此如果您的代码需要在支持此标准以及IE 8或更低版本的浏览器中运行,则需要以适当的方式为适当的客户阻止事件。
在JavaScript中,对象属性只不过是键和"方法"技术上不存在。函数是一等公民(他们是数据),可以像任何其他数据一样存储在属性中。您可以像访问任何对象属性一样直接访问函数(作为数据):
var myObj = {
foo:"something",
bar:function(){ console.log("bar says hello"); }
};
console.log(myObj.foo); // Just accessing the value of the foo property
console.log(myObj.bar); // Just accessing the value of the bar property

但是,可以调用函数,并且在JavaScript中,调用运算符为()
。因此,如果您查找可以调用的内容并想要调用它,只需在其末尾添加()
:
var myObj = {
foo:"something",
bar:function(){ console.log("bar says hello"); }
};
myObj.bar(); // Accessing the value of the bar property and invoking the result

因此,如果某个对象具有某个属性(键)并且您对其进行查询,那么您将获得其值。在我们通常称之为"方法"的情况下,该值将是存储在属性中的函数。并且,如果属性(密钥)不存在,您将获得undefined
返回给您。
考虑到所有这些,我们可以继续讨论相关主题......
当你检索一个值时,它可以被认为是" truthy"或者" falsy",这只是意味着,如果您将值转换为布尔值,它会转换为true
还是false
。 false
,空(""
),null
,undefined
和0
值是假的,其他一切都是真的。
以下尝试获取preventDefault
对象的event
属性值。:
// Notice we're not calling the function (no parenthesis)
// We're just retrieving the value of the property
if(event.preventDefault)
在支持preventDefault()
的用户代理中,将返回本机函数,因为它处于if
条件,它将转换为布尔值。它将在此处转换为true
,然后输入true
语句的if
分支。如果该属性不存在,则会返回undefined
,转换为false
并输入false
分支。
查明属性是否存在的另一种方法是in
运算符:
if(preventDefault in event)
这会检查继承的属性以及"拥有"对象的属性。
这是另一个例子。您会注意到以下代码中的任何位置都不会foo
实际被调用(您不会看到" foo被调用了!"在控制台中)。我们只查找foo
属性的值:
var myObj = {
foo : function(){ console.log("foo was invoked!"); }
};
// Notice were not calling foo (no parenthesis). We're just looking up its value:
console.log(myObj.foo);
// What about a property that doesn't exist?
console.log(myObj.foo2); // undefined
// And we can convert that value to a Boolean
console.log(Boolean(myObj.foo)); // true
console.log(Boolean(myObj.foo2)); // false
if(myObj.foo){
console.log("foo exists");
} else {
console.log("foo doesn't exist");
}

答案 1 :(得分:3)
这是一份警卫声明。 JavaScript中的function
只不过是对象,所以此代码保护preventDefault
存在。