所以我对javascript很陌生(事实上,我一般都是编程新手)。
我的问题是,我可以考虑将.js文件加载到
<head><script src="script.js"></script>...</head>
作为加载头文件(如在c/c++中)?
我想不是。假设我的script.js如下所示:
function copyToClipboard(text)
{window.prompt("Copy to clipboard: Ctrl+C, Enter", text);}
我的index.html看起来是这样的:
<!DOCTYPE html>
<html>
<head>
<script src="script.js"></script>
</head>
<body>
<textarea id="a" autofocus="true"></textarea>
<script> onclick=copyToClipboard(document.getElementById("a").value);
</script>
</body>
</html>
它不工作,即它不等待我的点击(这意味着函数加载正确-它被成功地调用,它只是弹出不等待鼠标事件)。但如果我把剧本放进去,它就能用:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<textarea id="a" autofocus="true"></textarea>
<script>onclick=function copyToClipboard(text) {
window.prompt("Copy to clipboard:Ctrl+C,Enter",document.getElementById("a").value);
}
</script>
</body>
</html>
发布于 2014-06-01 07:01:34
第一段代码不能工作的原因是您正在调用copyToClipboard()
函数并将返回值分配给onclick
变量。在第二段代码中,您将正确地为它分配一个函数引用,而不是立即调用该函数。
换言之:
onclick = copyToClipboard(document.getElementById("a").value);
“调用copyToClipboard()
,将返回值(undefined
)赋给onclick
变量”
onclick = function copyToClipboard(text) { ...
“将一个名为copyToClipboard()
的函数的引用赋给onclick
变量”
要使它与外部脚本中的函数定义一起工作,请将函数调用包装在一个匿名函数中:
onclick = function() {
copyToClipboard(document.getElementById("a").value);
};
发布于 2014-06-01 07:05:33
所有的人都称赞javascript误导开发人员错误诊断他们的问题的能力!
这不是定义内联onclick处理程序的方法。内联onclick处理程序是html元素的一个属性(或属性,我们将在以下几个部分中找到):
<textarea id="a" autofocus="true" onclick="copyToClipboard(this.textContent)"></textarea>
您对<script>
标记所做的只是包含一些javascript代码,以便在浏览器解析您的html时执行:
<script> onclick=copyToClipboard(document.getElementById("a").value);</script>
调用您的函数,并将其返回值分配给onclick
。
但是等等,为什么你的第二个片段起作用了?
这是因为onclick
也是dom元素的属性。还可以将单击处理程序分配给window
本身--这就是第二个代码段实际上正在做的事情(由于javascript的一个不酷的特性,它试图将未定义的变量赋值给全局对象的属性)。这意味着,无论在哪里单击,都将调用新的单击处理程序。
至于你的开场白,你不能说标签是包含的--一个脚本可以包含的不仅仅是声明和定义,不像包含的文件。您可以查看一些模块标准/框架,如RequireJS,以获得更类似的功能。
https://stackoverflow.com/questions/23977436
复制相似问题