Javascript 为什么我的点击事件处理程序(是)正在工作?
我知道这有点可笑,因为人们经常要求解决一些不起作用的问题,在这种情况下,情况恰恰相反 我在玩JavaScript,我发现了一些让我困惑的东西! 我试着在网上寻找帮助,但找不到任何有用的东西 问题是:在只调用一次函数Javascript 为什么我的点击事件处理程序(是)正在工作?,javascript,html,Javascript,Html,我知道这有点可笑,因为人们经常要求解决一些不起作用的问题,在这种情况下,情况恰恰相反 我在玩JavaScript,我发现了一些让我困惑的东西! 我试着在网上寻找帮助,但找不到任何有用的东西 问题是:在只调用一次函数bar之后,onclick事件工作得非常好。这怎么可能 但是当我询问变量x的类型时,它会返回未定义的,而不是数字,这是正常的,因为x在条内 function bar() { var p = document.getElementById("foo"); p.onclic
bar
之后,onclick
事件工作得非常好。这怎么可能
但是当我询问变量x
的类型时,它会返回未定义的,而不是数字
,这是正常的,因为x
在条内
function bar() {
var p = document.getElementById("foo");
p.onclick = showAlert;
var x = 5;
alert("bar function was called !");
}
bar();
如果有人能告诉我到底发生了什么,请详细解释
完整代码:(JSfiddle链接:)
#福{
边框:纯蓝1px;
宽度:30%;
填充:10px;
}
我的事件元素
单击上面的元素
功能条(){
var p=document.getElementById(“foo”);
p、 onclick=showart;
var x=5;
警报(“调用了条形函数!”);
}
bar();
功能showAlert(事件){
警报(“检测到onclick事件!”);
}
调用'bar'函数时,它会更新'p'元素的onclick属性。该属性保持设置状态,直到页面刷新,然后需要再次调用“bar”函数才能设置该属性。链接的“onclick”属性的范围是页面的生命周期。它对页面是全局的
“x”是一个局部变量,其作用域在声明时开始,在函数结束时结束。在函数外部,页面不知道变量“x”
有关详细信息,请查阅全局变量与局部变量 调用'bar'函数时,它会更新'p'元素的onclick属性。该属性保持设置状态,直到页面刷新,然后需要再次调用“bar”函数才能设置该属性。链接的“onclick”属性的范围是页面的生命周期。它对页面是全局的
“x”是一个局部变量,其作用域在声明时开始,在函数结束时结束。在函数外部,页面不知道变量“x”
有关详细信息,请查阅全局变量与局部变量 即使p
的作用域是条形函数getElementById
也会返回对DOM中某个节点(作用域更大)的引用。通过调用p.onclick=showart
您正在从该函数中修改onclick
属性(范围更大)
var p = document.getElementById("foo");
p.onclick = showAlert;
function showAlert(event) {
alert("onclick Event detected!");
}
在只调用一次函数“bar”之后,“onclick”事件
工作非常好。。这怎么可能
这是可能的,因为调用bar
会改变范围更大的对象。
var global = {specialKey: 'I am global scoped'}
function testingFunctionScope() {
global.specialKey = 'Not function scoped!';
console.log(global.specialKey); // Not function scoped!
}
testingFunctionScope();
console.log(global.specialKey); // Not function scoped!
即使p
的作用域是条形函数getElementById
也会返回对DOM中某个节点的引用(该节点的作用域更大)。通过调用p.onclick=showart
您正在从该函数中修改onclick
属性(范围更大)
var p = document.getElementById("foo");
p.onclick = showAlert;
function showAlert(event) {
alert("onclick Event detected!");
}
在只调用一次函数“bar”之后,“onclick”事件
工作非常好。。这怎么可能
这是可能的,因为调用bar
会改变范围更大的对象。
var global = {specialKey: 'I am global scoped'}
function testingFunctionScope() {
global.specialKey = 'Not function scoped!';
console.log(global.specialKey); // Not function scoped!
}
testingFunctionScope();
console.log(global.specialKey); // Not function scoped!
这称为“提升”,在您的示例中,函数在变量声明之前是可以访问的。我建议您阅读JavaScript中提升的内容。
关于变量x,它是“闭包”。如果我正确理解了您的问题,您正在尝试从另一个函数调用变量“x”。这称为“提升”,在您的示例中,函数在变量声明之前是可以访问的。我建议您阅读JavaScript中的内容。
关于变量x,它是“闭包”。如果我正确理解了您的问题,您正在尝试从另一个函数调用变量“x”。onclick事件正在工作,因为在bar函数中您设置了元素的onclick参数
var p = document.getElementById("foo");
p.onclick = showAlert;
您可以将这两条线移到条形函数之外,而无需使用单独的函数即可获得相同的效果
var p = document.getElementById("foo");
p.onclick = showAlert;
function showAlert(event) {
alert("onclick Event detected!");
}
这就是脚本标记中所需的全部内容
单击元素时,将调用showAlert函数。onclick事件正在工作,因为在bar函数中设置了元素的onclick参数
var p = document.getElementById("foo");
p.onclick = showAlert;
您可以将这两条线移到条形函数之外,而无需使用单独的函数即可获得相同的效果
var p = document.getElementById("foo");
p.onclick = showAlert;
function showAlert(event) {
alert("onclick Event detected!");
}
这就是脚本标记中所需的全部内容
单击元素时,将调用showAlert函数。好的,我想我知道您不明白的地方,我准备了一小段代码来说明。无论您在何处使用p.onclick,当函数绑定到那里时,它将在DOM元素的整个生命周期中保持,或者直到您解除绑定该函数为止。
选中此项:
我设置处理程序并根据按下的按钮移除它们
// set vars globaly for ease of use.
var p = document.getElementById("foo");
var buttonRemove = document.getElementById("remove-handler");
var buttonAdd = document.getElementById("add-handler");
function bar() {
p.onclick = showAlert;
buttonRemove.onclick = removeOnClick;
buttonAdd.onclick = addOnClick;
var x = 5;
alert("bar function was called !");
}
bar();
function showAlert(event) {
alert("onclick Event detected!");
}
function addOnClick(event) {
p.onclick = showAlert;
}
function removeOnClick(event) {
p.onclick = undefined;
}
和html:
<button id="foo">My Event Element</button>
<p>Click on the above element..</p>
<button id="remove-handler">
Remove on click handler
</button>
<button id="add-handler">
Add back on click handler
</button>
我的事件元素
单击上面的元素
单击时删除处理程序
单击时添加回处理程序
此url应清除以下内容:
好的,我想我知道你不明白什么,我准备了一小段代码来说明。无论您在何处使用p.onclick,当函数绑定到那里时,它将在DOM元素的整个生命周期中保持,或者直到您解除绑定该函数为止。
选中此项:
我设置处理程序并根据按下的按钮移除它们
// set vars globaly for ease of use.
var p = document.getElementById("foo");
var buttonRemove = document.getElementById("remove-handler");
var buttonAdd = document.getElementById("add-handler");
function bar() {
p.onclick = showAlert;
buttonRemove.onclick = removeOnClick;
buttonAdd.onclick = addOnClick;
var x = 5;
alert("bar function was called !");
}
bar();
function showAlert(event) {
alert("onclick Event detected!");
}
function addOnClick(event) {
p.onclick = showAlert;
}
function removeOnClick(event) {
p.onclick = undefined;
}
和html:
<button id="foo">My Event Element</button>
<p>Click on the above element..</p>
<button id="remove-handler">
Remove on click handler
</button>
<button id="add-handler">
Add back on click handler
</button>
我的事件元素
单击上面的元素
单击时删除处理程序
单击时添加回处理程序
此url应清除以下内容:
我不太明白