直接在 HTML 中设置“onclick”与通过 DOM 设置“onclick”之间有区别吗?
Is there a difference between setting "onclick" directly in HTML vs. via the DOM?
为什么logfunc
"未定义"?
var logfunc = function(obj) {
return function() {
console.log(obj)
}
}
t += '<a onclick="logfunc(this)"><</a>'
如果将
longfunc
声明在全局范围之外,则无法访问对它的引用,小提琴
我不提倡通过省略var
直接在全局范围内声明变量,但它是一个很好的例子:
function setupStuff() {
var logfunc = function(obj) { //defined within setupStuff scope
/*...*/
}
t += '<a onclick="logfunc(this)"><</a>';
}
function setupStuffDifferently() {
logfuncB = function(obj) { //defined in the global scope
/*...*/
}
t += '<a onclick="logfuncB(this)"><</a>';
}
我宁愿看到单独声明的函数,例如
t += '<a onclick="logfunc(this)"><</a>';
function logfunc(obj) { //this would work when assigned through `onclick`
/*...*/
}
如果该选项可供您使用,我建议您使用像jQuery这样的库,它在分配和处理点击事件方面提供了更大的灵活性。
您收到"logfunc 未定义"错误,因为您的logfunc
不在全局中(即 window
) 使用 HTML 元素属性绑定的作用域和函数必须是全局的。
你可以通过说来解决这个问题:
window.logfunc = function(obj) {
return function() {
console.log(obj)
}
};
但这仍然不会做你认为它做的事情,因为logfunc
只返回一个调用console.log
的函数,而<a>
不会知道它应该调用function() { console.log(obj) }
函数,它只会将其视为一个真正的值。我想你想要:
window.logfunc = function(obj) {
console.log(obj)
};
如果要单击链接以生成控制台消息。
至于"onclick
和通过DOM有什么区别"
- 通过属性附加的函数必须是全局的,这很快就会导致一个大混乱。
- 使用
onclick
只能为每个元素附加一个函数,但可以根据需要随时调用addEventListener
。如果您想将 JavaScript 片段作为字符串粘贴在一起,您可以绕过此限制,但这很讨厌。 - 类似地,您可以使用
removeEventListener
轻松撤消addEventListener
调用;从onclick
属性中删除事件处理程序比添加事件处理器更涉及更讨厌的字符串争吵。 - 使用
onclick
会不必要地纠缠您的HTML和JavaScript,从而导致维护噩梦。
相关文章:
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 将OnClick函数设置为<ul>,最后一个ul是擦除第一个ul-s
- 使用javascript onclick设置CSS颜色
- 如何在onclick事件执行代码时在ImageButton上设置加载gif
- 如何在循环中设置onclick属性
- 未捕获的类型错误:无法设置属性'onclick'为null.已尝试window.onload
- 如何获取 onchange 以设置 onclick=window.open(url)
- jQuery设置属性onclick所有元素,而不是使用内联JS
- 仅当onclick和隐藏消息时设置cookie
- 如何获取变量's设置元素时的文字值's onclick处理程序
- 使用脚本设置onclick事件
- 如何读取存储在图像的数据src中的URL,并在另一个img控制器的src中设置该URL onclick
- 为未排序列表设置onclick()属性
- 正在尝试使用jQuery设置onClick事件
- 在外部 JavaScript 中设置 OnClick 函数
- javascript onclick设置为变量函数名
- 使用onclick设置Javascript变量
- 使用onclick设置tagName属性时出现问题
- 开始0透明度和onClick设置不透明度为100
- 将onclick设置为自定义对象的每个实例,并将属性传递给函数