jQuery事件处理程序闭包

jQuery事件处理程序闭包,jquery,ajax,closures,jquery-events,Jquery,Ajax,Closures,Jquery Events,第一次单击按钮时,我希望事件处理程序执行JSON请求,并返回一个函数来处理对按钮的任何进一步单击。在没有绑定和解除绑定按钮上的事件处理程序的情况下,如何实现这一点 我只想执行请求,然后让返回的事件处理程序 显示或隐藏DOM元素,无需再次执行整个函数、缓存检查等 伪码 你在找像这样的东西吗 我不知道你为什么需要在这里创建自己的延迟对象。似乎您可以在.done处理程序的末尾分配aboutpage,或者使用一个标志来跟踪这是否是第一次: var aboutpage = function() {

第一次单击按钮时,我希望事件处理程序执行JSON请求,并返回一个函数来处理对按钮的任何进一步单击。在没有绑定和解除绑定按钮上的事件处理程序的情况下,如何实现这一点

我只想执行请求,然后让返回的事件处理程序 显示或隐藏DOM元素,无需再次执行整个函数、缓存检查等

伪码


你在找像这样的东西吗


我不知道你为什么需要在这里创建自己的延迟对象。似乎您可以在.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();
    }
}