javascript - 如何在循环运行时强制 Jquery/JS 替换变量?
问题描述
<html>
<header><script src = "/jquery.js"></script></header>
<div id="cars"></div>
<script>
$.post({
url:"/cars.php",
dataType:"JSON",
success:function(cars){
var fromidcount = Object.keys(cars).length;
for (var i=0;i<=(fromidcount-1);i++){
var carname= Object.keys(cars)[i];
$("#cars").append("<input type='button' id='"+carname+"'>");
$("#"+carname).click(function(){
alert("selected "+carname);
});
}
}
});
</script>
</html>
我从 PHP 获取 JSON 数组,并使用其中的值通过 Jquery 动态创建 HTML 按钮。到目前为止,它制作了 ids="BMW" 和 "Toyota" 的两个按钮。然后我的脚本应该创建指令,以便当点击 id="BMW" 时,它会提醒“Selected BMW”。当 id="Toyota" 被点击时,它应该会提示“Selected Toyota.
但是,当我单击按钮时,都会提示“已选择丰田”。我检查了开发工具并确认按钮 id 是 BMW 和 Toyota,但每个按钮的事件仍然显示alert("selected "+carname);
而不是alert("selected "+"BMW");
andalert("selected "+"Toyota");
所以我认为发生的事情是,当单击按钮时,Jquery 才会更新alert("selected "+carname);
. 但是到那时,循环已经完成,所以它获取的值是循环的最后一个值,即 Toyota。
您可以看到我在 for 循环中有多个变量 carname 实例。并且 carname 的所有实例都被它们各自的值替换,除了 in 中的那个alert("selected "+carname);
。为什么会这样,我该如何解决?
汽车是一个多维数组。[[宝马],[丰田]]
解决方案
您在这里遇到了 JavaScript 的闭包/词法范围规则。您需要另一个函数来关闭carname
添加事件处理程序的变量,但是从 ID 中读取汽车名称可能更容易,因为您在那里拥有它:
$("#"+carname).click(function(){
alert("selected " + this.id);
});
如果您需要将ID用于其他事情,您还可以将汽车名称添加为data-
属性。
推荐阅读
- java - 如何将元素添加到列表中
? - slack - 使用 Slack 用户的数据
- java - 春季启动计划任务没有等待完成关闭
- linux - 使用awk解析转换如下日志
- kubernetes - GKE 中的私有集群如何对同一子网中的 GCP 计算实例 (VM) 进行身份验证?
- wordpress - Wordpress 中的联系表格 7 - 如何隐藏电子邮件中的空白字段?
- reactjs - 无法让 npm 运行启动 testcafe 的脚本
- lua - 为什么这段代码意味着所有表共享一个元表
- javascript - jQuery 在单击下一步时显示和隐藏表单
- azure - 将 DataFactory 连接到 Lotus notes DB