Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的点击事件处理程序(是)正在工作?_Javascript_Html - Fatal编程技术网

Javascript 为什么我的点击事件处理程序(是)正在工作?

Javascript 为什么我的点击事件处理程序(是)正在工作?,javascript,html,Javascript,Html,我知道这有点可笑,因为人们经常要求解决一些不起作用的问题,在这种情况下,情况恰恰相反 我在玩JavaScript,我发现了一些让我困惑的东西! 我试着在网上寻找帮助,但找不到任何有用的东西 问题是:在只调用一次函数bar之后,onclick事件工作得非常好。这怎么可能 但是当我询问变量x的类型时,它会返回未定义的,而不是数字,这是正常的,因为x在条内 function bar() { var p = document.getElementById("foo"); p.onclic

我知道这有点可笑,因为人们经常要求解决一些不起作用的问题,在这种情况下,情况恰恰相反

我在玩JavaScript,我发现了一些让我困惑的东西! 我试着在网上寻找帮助,但找不到任何有用的东西

问题是:在只调用一次函数
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应清除以下内容:

我不太明白