我有一个收集XML的ajax调用,并根据该数据创建了一些div,我在其上附加了click()jquery侦听器。单击时,我希望这些div调用函数并将参数传递给该函数。但是,在调用单击时,参数的值已更改。以下是jsfiddle I built演示问题的示例:
$(document).ready(function() {
function x() {
$.ajax({
type: "POST",
url: "/echo/xml/",
dataType: "xml",
data: {
xml: "<the>xml</the>"
},
success: function(xml) {
console.log('success');
$('#test').show();
var text = "CORRECT";
$('#test').click(function() {
insertText(text);
console.log(text);
});
text = "WRONG";
}
});
}
x();
});
function insertText(t) {
$('#test').html(t);
}
我希望文本显示为CORRECT,而不是WRONG。
我知道这是一个令人费解的例子,但我试图在范围和发生的事情上尽可能地模拟我的实际代码。在基于点击调用click()
函数时,text
的值已更改。有没有办法在创建text
时将click()
的价值“烘焙”到for
来电?我将在运行XML时通过{{1}}循环创建其中的一些循环,并且不希望将所有数据挂起到变量中以供以后使用。
答案 0 :(得分:1)
最简单的方法可能是创建一个附加处理程序的函数。这样,函数内的参数不变。
var text = "CORRECT";
bindClick("test", text);
// ...
function bindClick(id, text){
$('#' + id).click(function() {
insertText(text);
console.log(text);
});
}
答案 1 :(得分:1)
像这样 - 将它绑定到闭包形式的局部变量。
(function(text){
$('#test').click(function() {
insertText(text);
console.log(text);
});
})(text);
答案 2 :(得分:1)
在调用click
赋值之后才调用text = "WRONG"
函数,因此该函数当然使用text
的“不正确”值。如果您想要在定义时将text
的值烘焙到函数中,您可以使用立即调用的匿名函数,如下所示:
(function(bakedText) {
$('#test').click( function() {
insertText(bakedText);
console.log(bakedText);
}
})(text);
请参阅此处的演示:http://jsfiddle.net/H4DpV/