2012-03-23 24 views
1

jsonに関数を含むようにして、プラグインのオプションがjson文字列にあった関数の戻り値を取得するようにします。json文字列の関数の値を取得する

(function($) { 
    function defined(obj){return typeof(obj)!=='undefined';} 
    function evaluate(ele, obj) { 
     if(typeof obj === 'function') { 
      //alert('is function'); 
      obj = obj(ele); 
     }else{ 
      try{ 
       //alert('thinking it may be a function still'); 
       obj = eval("("+obj+"("+ele+"));"); 
       //obj = (obj)(ele); 
      }catch(err){ 
       //Handle errors here 
       //alert('not function'); 
      } 
     } 
     return obj; 
    } 
    function debug(message) { 
      console.debug(message); 
    } 
    $.set = function(options){ 
     var settings = $.extend({}, {}, options); 
     if(defined(settings.actions)){ 
      $.each(settings.actions, function(index, value) { 
       $(value.element).do_action(defined(value.options)?value.options:null); 
      }); 
     } 
    } 

    $.fn.do_action = function(options) { 
    // Add event handler to all matching elements 
    return this.each(function() { 
     var ele = $(this); 
      var settings = $.extend({}, $.fn.do_action.defaults, options); 
      var label= evaluate(ele, settings.label); 

      var message = "label:'" + label + "'"; 
      debug('Tracking ' + action + ' ' + message); 
    }); 
    }; 
    $.fn.do_action.defaults = { 
    label   : function(ele) { return ele.attr('href'); } 
    }; 
}(jQuery)); 

であり、制御が

$.getJSON('default.txt' , function(data){ 
    $.set({ 
     actions:data // this si where we pull in the options 
    }); 
}); 

Iある

default.txt

[ 
     { 
      "element":"a[href$='.jpg']", 
      "options":{ 
       "label":"test" 
       } 
     },{ 
      "element":"a#hover", 
      "options":{ 
       "label":(function(ele){ return 'test'; })() 
      } 
     } 
    ] 

とプラグイン:など

が設定されています私が警報を入れたらうまくいくようだ匿名関数、

"label":(function(ele){ return 'test'; })() 

から

"label":(function(ele){ alert('test') })() 

にとてもが、その後、私は私が唯一のメッセージ

Tracking label:'(function(ele){ return 'test'; }) 
を取得するとして、それがコンソールに右印刷するように見えることはできません

[編集] "あなたはjsonにコードを入れてはいけません"ということをやめてください。あなたがGoogleに就職してトップレベルのプログラマーがスーパー・ドルを支払っているのであれば、その理由を聞くことになりますが、申し訳ありませんが、それが良いのであれば、私のために働くでしょう。他に何が言えばいいのかわからないので、私はあなたがそれを避けなければならない理由をすでに理解しています。あなたがちょうどできない時、私がGoogleが同じことをすると思われる理由があります。

+5

JSONはコードすべきではありません - ちょうどデータ。 –

+0

google;) –

+0

ちょうどヘッドアップ - "lable"として "label"のスペルが間違っている場所をいくつか持っています – matt

答えて

1

labelメンバーは機能ではありません。それは関数によって返される値です。最後の()の最後は、「labelの値が要求されるとすぐにこの関数を実行し、その戻り値をlabelの値として提供する」という意味です。

つまり、JSONオブジェクトに関数を含める必要がある場合は、関数を文字列化して評価することをお勧めします。 {foo:(function(){...})}のようなJSONの生の関数を使うこともできるはずですが、私は個人的にはこのようなことをするのに厄介な時間がありました(しかし、それを得ることができる、それのために行く)。

(余談としては、それは既存のオブジェクトから関数を文字列化することはできませんが、あなたは、ユーザ/プログラマの入力からテキストとしてあなたの機能を取得している場合、それは問題ではありません。)

+0

私はここであなたの質問に従っていません、ごめんなさい。はい、文字列の後ろを再実行する機能を実行しています。しかし、それは警告ではありません。警戒。 –

+0

はい、()は少し外れて見えます –

+0

編集されました。ラベルは常に実行されるため、警告が発生します。ラベルの最後の "解決された"値は文字列です。 labelの値を要求すると、その無名関数が実行され、labelの値として "test"が返されます。 – apsillers

関連する問題