有人可以解释一下如何使用preventDefault作为if表达式吗?

时间:2018-01-09 19:55:01

标签: javascript

虽然同行评审代码以修复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

2 个答案:

答案 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还是falsefalse,空(""),nullundefined0值是假的,其他一切都是真的。

以下尝试获取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存在。