0

jQuery のプラグインを作成していますが、アニメーションが終了した後に同じ関数を再実行する必要があります。setTimeout()アニメーション機能を使用してこれを実行しようとしています。

私が苦労しているコードは一番下にあります

jQuery(theslide).animate(theanimation,1000,function() {
        setTimeout('this.makemeslide()',3000)
})

コンソールのエラー メッセージはUncaught TypeError: Object [object Window] has no method 'makemeslide'です。しかし、私は自分の目標を達成する方法を知りません。

ここに私の完全なコード

jQuery.fn.daSlider = function(options) {
    //Options
    var settings = $.extend( {
          'selector'         : 'slider',
          'width'      : 940,
          'height'     : 380
        }, options);

    //globals
    var sliderarray = [];
    var slidercount = 0;


    //Contruct
    this.construct = function()
    {
       jQuery('.slider .slide').each(function(){

              jQuery(this).css('display','none');
              sliderarray.push(this) ;

              jQuery(this).children().each(function(){
                    jQuery(this).css('display','none');
                    sliderarray.push(this) ;
                });
       });

      this.makemeslide();
    }
    //run the constuct

    this.makemeslide = function()
    {
      theslide = sliderarray[slidercount];
      slidercount++;

      way_to_slide = jQuery(theslide).attr('slide');

      slide_position =  jQuery(theslide).position();
      //console.log(slide_width);
      //console.log(slide_height);


      if(way_to_slide == 'right')
      {
        jQuery(theslide).css('left', slide_position.left + settings.width);
        theanimation = {'left' : '-='+settings.width};
      }
      if(way_to_slide == 'left')
      {
        jQuery(theslide).css('left', slide_position.left - settings.width);
        theanimation = {'left' : '+='+settings.width};
      }
      if(way_to_slide == 'up')
      {
        jQuery(theslide).css('top', slide_position.top - settings.height);
        theanimation = {'top' : '+='+settings.height};
      }
      if(way_to_slide == 'down')
      {
        jQuery(theslide).css('top', slide_position.top + settings.height);
        theanimation = {'top' : '-='+settings.height};
      }
      if(way_to_slide == 'fade')
      {
        jQuery(theslide).css('opacity', 0);
        theanimation = {'opacity' : 1};
      }

      jQuery(theslide).css('display','block') ;
      jQuery(theslide).animate(theanimation,1000,function(){setTimeout('this.makemeslide()',3000)})

    }
    this.construct();

};
4

2 に答える 2

1

編集setTimeoutするコード文字列には絶対に使用しないでください。evalまた、this参照は親関数からのものではありません。

var plugin = this;
jQuery(theslide).animate(theanimation, 1000, function() {
    // "this" references theslide element
    setTimeout(function() {
        // "this" references the global object (window)
        plugin.makemeslide();
    }, 3000);
});

ところで、独立したタイムアウトの代わりに、コールバックでjQuery のdelayメソッドを使用したい場合があります。

于 2013-02-17T12:58:06.777 に答える
0

これは 、javascriptのこれがiJavaと同じではないためです。 この場合、これはウィンドウオブジェクトです。

この問題を回避するためにクロージャを使用できます。

function Object(){
    self=this;
    this.inner = function(){


     setTimeout(function(){
        alert(self);
        alert(this);
     },100);
    }
}

var o = new Object();
o.inner();

2番目のアラートには、oオブジェクトではなく、ウィンドウオブジェクトが表示されることに注意してください。

于 2013-02-17T13:01:21.023 に答える