我正在处理一些我从其他人手中接过的HTML和Javascript代码.该页面每十秒重新加载一个数据表(通过异步请求),然后使用一些DOM代码重新构建表.有问题的代码看起来像这样:
var blah = xmlres.getElementsByTagName('blah');
for(var i = 0; i < blah.length; i++) {
var td = document.createElement('td');
var select = document.createElement('select');
select.setAttribute("...", "...");
select.onchange = function() {
onStatusChanged(select, callid, anotherid);
};
td.appendChild(select);
}
Run Code Online (Sandbox Code Playgroud)
但是当onchange为一个<select>元素触发事件时,似乎将相同的值传递给表中每个表的onStatusChanged()方法<select>(我已经在循环的每次迭代中验证了,callid并且anotherid被赋予了新的,不同的值).
我怀疑这是因为我使用select.onchange = function()语法设置事件处理程序的性质.如果我理解这是如何正常工作的,那么这个语法将onchange事件的闭包设置为一个函数,该函数引用这两个引用,最终得到它们在循环的最后一次迭代中设置的最终值.触发事件时,由callid和引用anotherid的值是最后一次迭代中设置的值,而不是在单个迭代中设置的值.
有没有办法可以复制我传递给的参数的值onStatusChanged()?
我更改了标题以更好地反映问题和接受的答案.
我在循环中使用jQuery"GET"从服务器获取几个结果.我想将循环索引作为固定参数包含在回调中,但它不起作用.
(我遵循了本文关于如何做的建议.)
但是,我在回调中得到的值完全不是我所期望的 - 而不是每个循环索引值,它总是等于索引的退出值.
即.这里的代码片段为每次回调执行打印出'16'.如何让它打印1,2,3 ...(我意识到订单可能不同,那很好)
除了下面的代码,我还尝试了几种方法来指定回调函数,例如.function(data, textStatus) { return test(data, textStatus, idx); }, 'text');等等
这应该怎么样?
function test(data, textStatus, siteNo)
{
console.log("siteNo=" + siteNo);
}
function loadConfigLists()
{
var siteReport;
// retrieve site configuration
jQuery.get("svGetSiteConfig.php", function(data, textStatus)
{
// retrieve port configuration for all sites
for (var idx=1; idx<=15; idx++)
{
var probeIP = siteConfigArray[idx].siteIP;
if (probeIP != "" && probeIP != null)
jQuery.get("svGetPortInfo.php?svSiteIpAddr=" + probeIP+"&s="+idx,
function(data, textStatus) { test(data, textStatus, idx); }, 'text');
else …Run Code Online (Sandbox Code Playgroud) 我想做以下事情:
for (var i = 0; i < 10; ++i) {
createButton(x, y, function() { alert("button " + i + " pressed"); }
}
Run Code Online (Sandbox Code Playgroud)
这个问题是我总是得到最终值,i因为Javascript的闭包不是按值.
那么我怎么能用javascript做到这一点?