为什么这个html/javascript组合会以这种方式打印? Ovi地图API示例 点击我! 点击我! 点击我!
而且为什么这个html/javascript组合会以这种方式打印? Ovi地图API示例 点击我! 点击我! 点击我!,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,而且 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/h
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Ovi Maps API Example</title>
</head>
<body>
<button id="butt1" name="butt" type="button">Click Me!</button>
<button id="butt2" name="butt" type="button">Click Me!</button>
<button id="butt3" name="butt" type="button">Click Me!</button>
</body>
<script src="jquery.js" type="text/javascript" charset="utf-8"></script>
<script src="foo.js" type="text/javascript" charset="utf-8"></script>
</html>
$(文档).ready(函数(){
//警惕(“准备就绪”);
var myClickFunctions=新数组();
//向所有三个按钮添加事件处理程序
对于(var i=1;i,因为每次函数循环时,您都为同一个变量分配一个新值,因此,当单击任何按钮时,var索引为4
让每个锚定标记打印其索引的快速方法是附加以下内容:
$(document).ready(function() {
//alert("ready");
var myClickFunctions = new Array();
//add event handlers to all three buttons
for(var i=1;i<=3;i++){
myClickFunctions[i]=function(){
var index = i;
alert(index);
}
var buttonID = "#butt";
var button = $(buttonID + i);
button.click(myClickFunctions[i]);
}
我能看到的唯一问题是,我怀疑对象相等性比较只有在被比较的两个DOM元素完全相同时才会验证为真,但它们可以
此外,尽管如此,您在这里试图实现的最终目标是什么(因为我确信,在单击任何锚定时用警报骚扰用户的页面不是您预期的最终目标).因为每次函数循环时都会给同一个变量分配一个新值,因此,当单击任何按钮时,var索引都是4
让每个锚定标记打印其索引的快速方法是附加以下内容:
$(document).ready(function() {
//alert("ready");
var myClickFunctions = new Array();
//add event handlers to all three buttons
for(var i=1;i<=3;i++){
myClickFunctions[i]=function(){
var index = i;
alert(index);
}
var buttonID = "#butt";
var button = $(buttonID + i);
button.click(myClickFunctions[i]);
}
我能看到的唯一问题是,我怀疑对象相等性比较只有在被比较的两个DOM元素完全相同时才会验证为真,但它们可以
此外,尽管如此,您在这里试图实现的最终目标是什么(因为我确信,在单击任何锚定时,让用户收到警告的页面不是您的预期最终目标)。阅读JavaScript闭包及其工作原理。事实是按钮中的I
。单击(myClickFunctions[I])
底部的结尾将是4。请记住,在声明函数时不设置var index=i,只有在调用函数时才设置。您需要做的是将函数包装在一个闭包中,如下所示:
$('a').click(function() {
var theAnchors = $('a');
for (i in theAnchors)
if (theAnchors[i] == this)
alert(i);
});
或者更好的做法是:
myClickFunctions[i]=(function(i){
return function(){
var index = i;
alert(index);
}
})(i)
myClickFunctions函数将获取i的当前值,并返回一个已设置该值的函数。这是正确的方法。阅读JavaScript闭包及其工作原理。事实是按钮中的i
。单击(myClickFunctions[i])
底部的结尾将是4。请记住,在声明函数时不设置var index=i,只有在调用函数时才设置。您需要做的是将函数包装在一个闭包中,如下所示:
$('a').click(function() {
var theAnchors = $('a');
for (i in theAnchors)
if (theAnchors[i] == this)
alert(i);
});
或者更好的做法是:
myClickFunctions[i]=(function(i){
return function(){
var index = i;
alert(index);
}
})(i)
myClickFunctions函数将取i的当前值,并返回一个已设置该值的函数。这是正确的方法。您正在将匿名函数设置为myClickFunctions[i]
正在围绕i
创建一个闭包。闭包在变量本身上关闭,而不是在闭包时的值。因此,当函数实际运行时,i
是4,因此您将始终得到4
一个简单的修复方法是调用一个返回函数的函数,并捕获i的当前值
//put this anywhere
function myClickFunctions(i){
return function(){
alert(i);
}
}
//and at the end:
button.click(myClickFunctions(i));
如果这让人困惑,那么我建议阅读JavaScript中的闭包。过一段时间,闭包就成了第二天性。您正在设置的匿名函数myClickFunctions[I]
正在围绕i
创建一个闭包。闭包在变量本身上关闭,而不是在闭包时的值。因此,当函数实际运行时,i
是4,因此您将始终得到4
一个简单的修复方法是调用一个返回函数的函数,并捕获i的当前值
//put this anywhere
function myClickFunctions(i){
return function(){
alert(i);
}
}
//and at the end:
button.click(myClickFunctions(i));
如果这让人困惑,那么我建议阅读JavaScript中的闭包。它们在一段时间后成为第二天性。循环结束时“I”的值是“4”,因此每次单击按钮时,显示的数字是“4”,因为您正在访问“I”的引用当你点击按钮时,函数正在执行,而不是在循环过程中
如果你想得到与按钮id相同的“i”号,那么我建议这样做
myClickFunctions[i] = (function(curI) {
return function() {
var index = curI;
alert(index);
};
})(i);
$(文档).ready(函数(){
//警惕(“准备就绪”);
var myClickFunctions=新数组();
//向所有三个按钮添加事件处理程序
对于(var i=1;i循环结束时的“i”值为“4”,因此每次单击按钮时,将显示的数字为“4”,因为您访问的是“i”的引用,而函数是在单击按钮时执行的,而不是在循环期间
如果你想得到与按钮id相同的“i”号,那么我建议这样做
myClickFunctions[i] = (function(curI) {
return function() {
var index = curI;
alert(index);
};
})(i);
$(文档).ready(函数(){
//警惕(“准备就绪”);
var myClickFunctions=新数组();
//向所有三个按钮添加事件处理程序
对于(var i=1;iThanks,你能提供更多的细节吗?我的大脑工作的方式表明,这是因为所有函数都共享对i的引用,因为作用域链接的工作方式?我希望我能在Javascript中的变量作用域方面为你提供更多帮助,但我不是专家。我知道的足够多,可以说,与nu相比,它相对古怪在JavaScript中使用for…in
循环可能会导致意外的结果。不能保证它会按顺序循环项目,而且还存在处理继承属性的问题。标准d for loop会更好。如果页面有很多锚,这也可能会很昂贵。是的,我通过艰难的方式了解到了这一点。我不打算将此示例逐字使用,只是作为参考。谢谢,你能提供更多细节吗?我的大脑工作方式表明,这是因为所有函数都共享对我的引用作用域链接工作方式的原因?我希望我能在Javascript中的变量作用域方面为您提供更多帮助,但我不是专家