mbm*_*414 2 javascript jquery closures loops
我正在为"仪表板"网页创建一个状态表.每个状态都处于"开"或"关"状态.
我正在尝试使用jQuery button/buttonset
来切换/切换控件以允许用户切换状态的值.我作为ajax数据库查询的结果动态创建表和按钮.
当用户点击其中一个按钮时,我基本上试图触发ajax查询,但我很难正确分配点击事件.
无论点击什么按钮,我的第一个轮次都有最终列表值.
所以,啊哈!这是一个标准的"JavaScript闭包"问题.(所以我认为...)
进一步玩弄它没有产生任何结果,我也不太了解关闭问题,以便弄清楚为什么我的技术是错误的.
这是我要调用的代码:
function SetStatus(item, status) {
var params = '{itemName: "' + item + '", status: "' + status + '"}';
$.ajax({
type: "POST",
url: "WebServices/Dashboard.asmx/SetItemStatus",
data: params,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: StatusSet,
error: ShowError
});
}
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试的当前代码版本:
$(itemOnButton).click(
function (_item) {
SetStatus(_item, 'On');
} (itemName)
);
Run Code Online (Sandbox Code Playgroud)
结果是,一旦从数据库获得结果(在它们甚至显示之前),立即SetStatus
触发最后一项status
=='开'.
我知道这很简单,我仍然相信这是一个基本的封闭问题,但我正在撞墙!谢谢你的帮助!
$(itemOnButton).click(
function (_item) {
SetStatus(_item, 'On');
} (itemName)
);
Run Code Online (Sandbox Code Playgroud)
目前,当您点击它时,您正在触发"关闭"功能.尝试
$(itemOnButton).click(
function (ev) {
// this is the clicked element
// ev is the event object
// how do you get the name?
// var itemName = $(this).attr("name");
SetStatus(itemName, 'On');
}
);
Run Code Online (Sandbox Code Playgroud)
你也可以这样做
$(itemOnButton).click(
function (_item) {
return function (ev) {
SetStatus(_item, 'On');
};
} (itemName)
);
Run Code Online (Sandbox Code Playgroud)
现在它像你一样触发,但它不立即执行,而是返回click的事件处理函数.
返回的事件处理函数现在是_item的闭包.匿名函数是_item的范围,通过参数设置为itemName.