我有一个项目列表,其中包含我尝试在点击事件中返回的不同数据值。我似乎无法将click事件中的值传递给父函数。我可能只是做错了。我只需要每个click事件的数据值来替换我的systemName变量的值。有人可以帮助我吗?
function getSystemName(){
var systemName = '';
$('.pulldown li').bind('click', function(){
var systemName = '';
var systemName = $(this).find('a').data('value');
console.log(systemName);
});
return systemName;
}
//编辑:我应该解释一下,我正试图从click事件中获取该值,以通过jquery .load更新页面上的内容,所以也许就像下面提到的那样....我不是这样做的因为我可以在点击时正确记录systemName但似乎不更新页面内容。这是整个代码块。
$.ajaxSetup ({
cache: false
});
var ajax_load = "<img src='.../images/130.gif' alt='loading...' align='middle' />";
var loadUrl = ".../content.php";
var getSystemName = (function(){
var systemName = '';
$('.pulldown li').bind('click', function(){
systemName = $(this).find('a').data('value');
console.log(systemName);
});
return function() { return systemName };
})();
$("#results")
.html(ajax_load)
.load(loadUrl, "ki_systems=" +getSystemName());
答案 0 :(得分:2)
在问题的代码中,每次调用getSystemName()
时,它都会再次绑定一个点击处理程序 (导致多个点击处理程序),然后返回本地{{1}变量总是空白的。
如果您说每次致电systemName
,您希望它返回与最近点击的getSystemName()
元素相关联的系统名称,那么您可以将li
变量声明为一个全局变量并绑定事件处理程序(一次)在 systemName
之外:
getSystemName()
但是这使得函数变得多余:你可以直接反映全局变量。
另一方面,你可以只声明函数并使用闭包来避免需要全局变量,如下所示:
var systemName = '';
$('.pulldown li').bind('click', function(){
systemName = $(this).find('a').data('value');
console.log(systemName);
});
function getSystemName() {
return systemName;
}
对于那些没有经验的人来说,最后一块可能会让人感到困惑。它将var getSystemName = (function(){
var systemName = '';
$('.pulldown li').bind('click', function(){
systemName = $(this).find('a').data('value');
console.log(systemName);
});
return function() { return systemName };
})();
// if no items have been clicked yet it will return an empty string by default
console.log( getSystemName() ); // ""
// click on an item with name "red"
console.log( getSystemName() ); // "red"
// click on an item with name "green"
console.log( getSystemName() ); // "green"
设置为从立即执行的匿名函数表达式返回的任何内容(注意结尾处的额外空括号)。返回的是一个简单的函数,当被调用时,它将返回getSystemName
,它在外部作用域中声明。点击处理程序也会更新同一个systemName
。因此,当您实际调用systemName
时,您正在调用getSystemName()
语句中的小单行函数。
答案 1 :(得分:1)
我认为这里的问题是你缺少同步和异步编程 - 你可能想要在getSystemName()函数上进行回调。我希望你所采取的方法在架构方面存在问题。
但是,如果我使用你的风格写下它,那就是它的样子:
function getSystemName(callback) {
$('.pulldown li').bind('click', function(){
console.log(systemName);
callback( $(this).find('a').data('value') );
});
}
所以不是这种代码:
console.log("System Name: ", getSystemName())
你会:
getSystemName( function (name) { console.log("System Name: ", name); } );
答案 2 :(得分:0)
你不能。
查看代码。
systemName
设置为空字符串systemName
设置为其他systemName
您无法让 3 等待 2 。您需要对点击处理程序中的数据执行某些操作,而不是尝试将其返回。
答案 3 :(得分:0)
从第二个和第三个定义中删除var。如果在变量名之前使用var,则将创建一个新的本地实例。
systemName = '';
systemName = $(this).find('a').data('value');
console.log(systemName);
答案 4 :(得分:0)
好吧,我想您正在尝试设置一个值以查看哪个节点已被单击,因此您需要更改systemName变量的范围。把它移出来它就像全球一样,如下:
var systemName = '';
$('.pulldown li').bind('click', function(){
systemName = $(this).find('a').data('value');
console.log(systemName);
});
答案 5 :(得分:0)
考虑到这一点,在第二行,你只是将一个回调函数绑定到click事件,而不是执行该函数内的代码。