2011-02-07 14 views
0

小さなjQueryプラグインを作成するアイデアはありましたが、evalに依存することなくこれを行う方法がわかりません。Javascript関数に条件テストを送信するにはどうすればいいのですか?

は、ここでは、コードです:

  var testMe = 1; 

      $.extend({ 
       once : function(condition, duration, callback) { 
        window[ "once" ] = window.setTimeout(function() { 
         if (condition) 
         { 
          callback.apply(); 

          window.clearTimeout(window[ "once" ]); 
         } else { 
          window[ "once" ] = window.setTimeout(arguments.callee, duration * 1000); 
         } 
        }, duration * 1000); 
       } 
      }); 

      $.once(testMe == 2, 5, function() { 
       alert("Match!"); 
      }); 

$.once()が呼び出されているとき、最初のパラメータは、その後評価さのように見えますし、唯一それが条件パラメータに送信され、この時点での値です。

$.once("testMe == 2" ...とはevalの使用withing別の方法がありますif (eval(condition))

使用:私が見つけた唯一の方法は、それを文字列として送信するのですか?

ありがとうございます。

編集:

  var testOne = 1, 
       testTwo = 1; 

      $.extend({ 
       once : function(name, conditionFn, duration, callback) { 
        if (typeof duration == "function") 
        { 
         callback = duration; 
         duration = 5; 
        } 

        window[ "once" + name ] = window.setInterval(function() { 
         if (conditionFn()) 
         { 
          callback(); 

          window.clearInterval(window[ "once" + name ]); 
         } 
        }, duration * 1000); 
       } 
      }); 


      //Examples 
      $.once("testOne", function() { 
       return testOne == 2 
      }, 2, function() { 
       alert("testOne == 1"); 
      }); 

      $.once("testTwo", function() { 
       return testTwo == 2 
      }, 2, function() { 
       alert("testTwo == 1"); 
      }); 

答えて

2

あなたは正しいです。パラメータが評価されて渡されます。あなたが何をしているのか本当に分かっていない限り、evalの使用をお勧めしません。そうする魅力的な理由があります。

代わりに述語(ブール値を返す関数)をプラグインに渡します。チェックを行うたびに、関数を呼び出します。

var testMe = 1;

$.extend({ 
    once : function(predicate, duration, callback) { 
     window.once = window.setInterval(function() { 
      if (predicate()) { 
       window.clearInterval(window.once); 
       callback(); 
      } 
     }, duration * 1000); 
    } 
}); 

$.once(function() { return testMe == 2; }, 5, function() { 
    alert("Match!"); 
}); 

N.B.私はあなたの繰り返しのsetTimeout呼び出しを自己キャンセルsetInterval()に置き換えました。また、callbackcallback.apply()で呼び出していましたが、これを行う理由はありません。上記のコードのように、()で直接呼び出すことができます。

+0

それは私の元のコードのはるかにクリーンなバージョンですね。 – Cybrix

1

比較の結果を返す関数を送る:こちらのプラグインの最終バージョンである

var testMe = 1; 

$.extend({ 
        // receive the function 
    once : function(conditionFn, duration, callback) { 
     window[ "once" ] = window.setTimeout(function() { 

       // execute the function 
      if (conditionFn()) 
      { 
       callback.apply(); 

       window.clearTimeout(window[ "once" ]); 
      } else { 
       window[ "once" ] = window.setTimeout(arguments.callee, duration * 1000); 
      } 
     }, duration * 1000); 
    } 
}); 
     // send a function 
$.once(function(){return testMe == 2;}, 5, function() { 
    alert("Match!"); 
}); 
+0

「if(condition())」を意味しないのですか? – Medo42

+0

はい、私は最初にパラメータ名を更新するのを忘れていました。 – RightSaidFred

+0

これは機能します!しかし、私は非常に "ユーザーフレンドリー"で、関数に条件を返す匿名関数を渡すようにユーザーに要求する必要はありません。しかし私はそれが私が持っている唯一の解決策だと思う。 – Cybrix

関連する問題