2016-12-25 23 views
0

我正在编写一个JavaScript脚本,当用户按下键盘上的某个键时,如果它是指定的键之一,脚本将播放相应的声音。如果用户按下的键不是声音键,例如“R”,那么我希望脚本结束。现在,它返回:“不能设置属性的'currentTime'为null”即使我试图用if(audio == false)return来结束它;为什么不使用代码块中的return来结束我的函数?不知道为什么我总是收到“无法设置属性'currentTime'为null”

我也很好奇编写条件语句后,代码块在同一行上的规则是什么。 (我下面的教程,它是第一次我看到它这样做的方式。)

<script> 
    window.addEventListener("keydown", function(e){ 
    var audio = document.querySelector(`audio[data-key="${e.keyCode}"]`) 
    console.log(audio) 

    // this function stops the function if you press a button that doesn't have a corresponding sound 

    if (audio == false) return; 

    audio.currentTime = 0; 
    audio.play(); 
    }); 
</script> 
+0

你应该有明确===检查空。在交互式控制台中,尝试输入'false == null'并看看你得到了什么。这个东西的规则是有点挑剔,所以默认显式检查,除非你确定它们是如何应用的。 – pvg

回答

0

在JavaScript中,如果document.querySelector结果不存在,也不会设置audiofalse,它将返回null。这意味着audio == false不会返回true

你可能想这样的:

if(audio === null) 
+0

当我实现这个代码时,当我按下没有音频声音的按键时,它仍然记录'null'。在这个例子中,它没有得到null,这正是我想要实现的。 –

+1

我猜它记录为空,因为你有console.log(音频)才运行。 – Brian

0

这是因为只有undefined和null本身是抽象等于空。

console.log(null == null);  // true 
 
console.log(undefined == null); // true 
 
console.log(false == null);  // false

在这种情况下,我只想迫使布尔:

if (!audio) return; 
+0

你能告诉我更多关于你为什么使用1行和无括号的内容吗?此外,当我执行此代码时,当按下没有音频声音的按键时,它仍然记录为“空”。在这个例子中,它使用相同的代码,你推荐它,它不会得到空,但由于某种原因,我不断得到它... –

+0

@FaiqueMoqeet这就像'if(!audio){return; }'。如果你有一个单独的陈述,你不需要大括号。 – Oriol

+0

好吧,我想,从来没有遇到过它。谢谢。 –

相关问题