【问题标题】:JQuery recursive function?jQuery递归函数?
【发布时间】:2009-09-02 16:37:06
【问题描述】:

如何从函数内部调用函数,使其成为递归的?这是我的代码,我添加了一条注释,我想在其中开始递归:

$('a.previous-photos, a.next-photos').click(function() {
    var id = $('#media-photo img').attr('id');
    var href = $(this).attr('href');
    href = href.split('/');
    var p = href[href.length - 1];
    var url = '/view/album-photos/id/' + id + '/p/' + p;

    $.get(url, function(data) {
        $('.box-content2').replaceWith('<div class="box-content2"' + data + '</div>');
    });

    // here I want to call the function again

    return false;
});

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    你可以递归调用匿名函数

    arguments.callee( .... );
    

    请参阅here 了解更多信息。

    【讨论】:

    • 能否获得完整的样本?我还没能完成这项工作,但是......
    • 链接网站有一个创建匿名递归阶乘函数的例子。
    • agruments.callee 已被弃用。见stackoverflow.com/questions/103598/…
    • 你应该命名函数
    【解决方案2】:

    最佳答案已过时。目前(2012 年 8 月)至少在 Firefox 中已弃用被调用者。使用被调用者已过时。目前(2012 年 8 月)被调用者是“...被 ECMA-262 弃用。”(参见 discussion

    您遇到了两个问题:

    1. 函数处理程序只会传递事件对象。
    2. 函数没有命名,所以不能引用它进行递归

    解决方案 2:

    这是两者中较容易的。通常使用匿名函数的原因是保持命名空间干净。括号定义了一个本地命名空间,因此在给函数命名后,括号外将无法访问它。以下内容对您有用:

    $('.someclass').onClick( function dosomething(){
        ... your code ...
        dosomething() //again
    });
    dosomething() // will cause scope error, function not defined
    

    解决方案 1:

    这有点困难。由于唯一传递给函数的是事件对象,因此您需要扩展它以传递值。还好,原来jQuery有系统just for this

    $('.someclass').on( 'click', {myvar: 0}, function dosomething(event){
        ... your code ...
        event.data.myvar = event.data.myvar + 1;
        dosomething(event) //again
    });
    

    注意:当您必须附加和分离处理程序以防止像 DOMSubtreeModified 这样的无限循环时,这尤其有用。

    $('.someclass').on( 'DOMSubtreeModified.mynamespace', {myvar: 0}, function myfunc( event ){
        $(this).off( 'DOMSubtreeModified.mynamespace' );
        ... Some Code that changes .someclass subtree ...
        event.data.myvar = event.data.myvar + 1;
        $(this).on( 'DOMSubtreeModified.mynamespace', {myvar: event.data.myvar}, myfunc );
    });
    

    【讨论】:

      【解决方案3】:

      这类东西应该可以解决问题,但应该有更好的设置方法:

      function myfunc() {
          var id = $('#media-photo img').attr('id');
          var href = $(this).attr('href');
          href = href.split('/');
          var p = href[href.length - 1];
          var url = '/view/album-photos/id/' + id + '/p/' + p;
      
          $.get(url, function(data) {
              $('.box-content2').replaceWith('<div class="box-content2"' + data + '</div>');
          });
      
          if(!cond){//you need a condition, or it'll recurse indefinitely.
             myfunc();
          }
      
          return false;
      }
      
      $('a.previous-photos, a.next-photos').click(function(){myfunc();});
      

      【讨论】:

        【解决方案4】:

        从 Javascript 1.2 开始,您可以使用 arguments.callee(...) 来实现对匿名函数的递归调用

        // here I want to call the function again
        arguments.callee();
        

        【讨论】:

          【解决方案5】:

          将您的代码放入 jQuery 插件格式并调用自身,例如...

          (function($) {
          $.fn.togglethis = function () {
              $(this).animate({opacity:"1.0"}, 1000, function() {
                  /* Code Here */
                  return $(this);
              });
          
          }
          })(jQuery);
          $(document).ready(function() {
              $("#togglethis").togglethis();
          });
          

          在注释所在的位置插入您想要的代码。

          【讨论】:

            猜你喜欢
            • 2022-01-19
            • 2017-07-01
            • 2015-03-01
            • 2010-12-23
            • 1970-01-01
            • 2010-12-25
            • 2023-04-02
            相关资源
            最近更新 更多