jQuery事件处理程序闭包
第一次单击按钮时,我希望事件处理程序执行JSON请求,并返回一个函数来处理对按钮的任何进一步单击。在没有绑定和解除绑定按钮上的事件处理程序的情况下,如何实现这一点 我只想执行请求,然后让返回的事件处理程序 显示或隐藏DOM元素,无需再次执行整个函数、缓存检查等 伪码jQuery事件处理程序闭包,jquery,ajax,closures,jquery-events,Jquery,Ajax,Closures,Jquery Events,第一次单击按钮时,我希望事件处理程序执行JSON请求,并返回一个函数来处理对按钮的任何进一步单击。在没有绑定和解除绑定按钮上的事件处理程序的情况下,如何实现这一点 我只想执行请求,然后让返回的事件处理程序 显示或隐藏DOM元素,无需再次执行整个函数、缓存检查等 伪码 你在找像这样的东西吗 我不知道你为什么需要在这里创建自己的延迟对象。似乎您可以在.done处理程序的末尾分配aboutpage,或者使用一个标志来跟踪这是否是第一次: var aboutpage = function() {
你在找像这样的东西吗
我不知道你为什么需要在这里创建自己的延迟对象。似乎您可以在.done处理程序的末尾分配aboutpage,或者使用一个标志来跟踪这是否是第一次:
var aboutpage = function() {
$.ajax({
url:"your url here",
dataType: "jsonp",
cache: false
}).done(function(data){
var resp = data.posts[0]['photo-url-75'];
var aboutEl = $('<img/>', {src: resp});
$('#container').append(aboutEl);
// assign aboutpage so the next click will just toggle
aboutpage = function() {
$('img').toggle();
};
});
};
$('#showcontent').on('click', function(){
aboutpage();
};
您也可以只使用一个标志:
function aboutpage() {
if (!aboutpage.gotJSON) {
// the first time this is called, retrieve JSON data
aboutpage.gotJSON = true;
$.ajax({
url:"your url here",
dataType: "jsonp",
cache: false
}).done(function(data){
var resp = data.posts[0]['photo-url-75'];
var aboutEl = $('<img/>', {src: resp});
$('#container').append(aboutEl);
});
} else {
// subsequent times, just toggle
$('img').toggle();
}
}
也许放一个.donefunction{};在ajax的结尾?你真的读过代码了吗?BaconJS解决方案行吗@PHearst?@BenjaminGruenbaum我肯定BaconJS可以解决这个问题,但我一直在寻找一个只依赖jQuery@PHearst这是一个你一开始就不应该遇到的问题,我仍然不明白您试图解决的问题。这也会导致多个请求。如果仍然返回整个函数,我希望找到一个只返回切换作为事件处理程序的解决方案。您的第一个答案是正确的,这里不需要延迟。JSFIDLE是一个较大代码库中的简化示例,其中延迟方式是有意义的。无论如何,谢谢你的简化。
var aboutpage = function() {
$.ajax({
url:"your url here",
dataType: "jsonp",
cache: false
}).done(function(data){
var resp = data.posts[0]['photo-url-75'];
var aboutEl = $('<img/>', {src: resp});
$('#container').append(aboutEl);
// assign aboutpage so the next click will just toggle
aboutpage = function() {
$('img').toggle();
};
});
};
$('#showcontent').on('click', function(){
aboutpage();
};
function aboutpage() {
if (!aboutpage.gotJSON) {
// the first time this is called, retrieve JSON data
aboutpage.gotJSON = true;
$.ajax({
url:"your url here",
dataType: "jsonp",
cache: false
}).done(function(data){
var resp = data.posts[0]['photo-url-75'];
var aboutEl = $('<img/>', {src: resp});
$('#container').append(aboutEl);
});
} else {
// subsequent times, just toggle
$('img').toggle();
}
}