0

ここで提案されているボイラープレートに従って構造化されたプラグインがあります。

http://markdalgleish.com/2011/05/creating-highly-configurable-jquery-plugins/

プラグインはChromeで希望どおりに応答しますが、InternetExplorerとFireFoxのエラーが発生します

ここで使用中のプラグインを表示できますhttp://websonalized.com/myplugin.php

MSIE開発者コンソールのエラー(デバッグ):

無効な引数myplugin.js、84行目文字5

Firefoxのエラー:

エラー:役に立たないsetTimeout呼び出し(引数の前後に引用符がありませんか?)

setTimeout(animateSlide(sliderImage)、3000);

これはコードの関連ビットです

...

this.$slides.each(function(i){

    slide_config = $.extend({
        duration: 3000,
        squares: 225, //it will display the closest 'perfect square' number of tiles
        transition: 'linear'
    }, $(this).data());

    var sliderImage = $(this).find('.slidebg');

    ...

    setTimeout(animateSlide(sliderImage), 3000);

    function animateSlide(s){
        console.log('ANIMATED IMAGE SLIDER ' + i);
        console.log(s); 

        $(s).show('explode', { pieces: slide_config.squares }, 5000);
    };

    ...

setTimeoutビットを次のように書き直すと、エラーはなくなります。

...

this.$slides.each(function(i){

    slide_config = $.extend({
        duration: 3000,
        squares: 225, //it will display the closest 'perfect square' number of tiles
        transition: 'linear'
    }, $(this).data());

    var sliderImage = $(this).find('.slidebg');

    ...

    setTimeout(function(){$(sliderImage).show('explode', { pieces: slide_config.squares }, 5000);}, 3000);              


    ...

ただし、slide_config.squaresの値はこのインスタンスに対応しておらず、値は最後のスライドデータによって設定された値です。

this.$slides.each(function(i){

    slide_config = $.extend({
        duration: 3000,
        squares: 225, //it will display the closest 'perfect square' number of tiles
        transition: 'linear'
    }, $(this).data());

これは文脈と関係があると思います。誰かが私がsetTimeoffをどのように使用すべきかを修正して理解するのを手伝ってもらえますか?

修正とは、ブラウザFF、IE、ChromeでエラーなしでsetTimeoutを設定できることを意味しますが、各インスタンスのslide_config.squares値は、各スライドオブジェクトまたはデフォルト(つまりslide_default)によって設定された値と同じです。

注:最初のコードサンプルでは、​​slide_config.squaresの値は私が期待したものです。つまり、slideobjectまたはslide_configのデフォルトに従って設定されています。繰り返しになりますが、コードは最初のコードでGoogleChromeで正常に機能しているように見えます

4

1 に答える 1

1

次のように記述slide_configして、コールバック内でローカル変数として宣言する必要がありますeach()

var slide_config = ...;

setTimeoutこれにより、すべてのクロージャがグローバルを共有するのではなく、各クロージャに変数の独自のコピーが与えられます。

于 2012-09-24T03:09:28.510 に答える