现有函数不是函数?

时间:2018-04-18 03:04:41

标签: javascript html

所以我正在做一个项目。我的功能正常,直到我突然点击一个应该运行download()的按钮,但事实并非如此。所以我打开控制台,看到这个:

TypeError: download is not a function

我很困惑。我从控制台运行download(),它工作正常。所以我认为这可能是onclick(我的按钮有onclick="download()")的问题,所以我使用JavaScript来添加点击事件。

$("#download").onclick=download()

注意:$()是一个自定义的jQuery-esque函数,不使用框架本身。在这个问题的同时,它还有许多其他用途。
但这也不起作用。所以我也尝试使用

$("#download").addEventListener("click", download)

这再次无效。两次都说$()null。所以我出去了,尝试使用

document.getElementById("download").onclick=download()

addEventListener()相同。但这给了我一个非常令人惊讶的错误信息:

TypeError: document.getElementById(...) is null

我在控制台中重复了所有表达式,发现它们不是null。我没有点击按钮,直到页面加载了几秒钟。

以下是相关代码:

function $(el){switch(el[0]){case"#":return document.getElementById(el.substring(1));break;case".":return document.getElementsByClassName(el.substring(1));break;default:return document.getElementsByTagName(el);break;}}

function download() {
	alert("download() executed")
}

// Attempted Scripts:
//$("#download").onclick = download()
//$("#download").addEventListener("click", download)
//document.getElementById("download").onclick = download()
//document.getElementById("download").addEventListener("click", download)
<a class = "nav-link nohighlight" id = "download" onclick = "download()">Download</a>

感觉就像我的网络浏览器只是试图确保我不运行该功能。我在最新的Edge和Firefox上测试了这个。您可以看到我的整页here

1 个答案:

答案 0 :(得分:3)

查看您的UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound , .badge]) {(accepted, error) in if !accepted { // notification access denied } } 标记在HTML中的位置:它在上方正文。默认情况下,脚本会立即运行:当HTML解析器跨越它们时,立即执行脚本,然后继续解析其余的HTML。因此,在您的脚本运行时,尚未创建任何元素 - 因此,选择任何元素都将失败。

将整个脚本包装在DOMContentLoaded侦听器函数中:

script

或者为您的脚本标记提供document.addEventListener('DOMContentLoaded', () => { // put your whole script here }); 属性,该属性指示解析器仅在文档完全解析后才运行它:

defer