2013-07-29 21 views
1

我已经使用jquery小部件工厂编写了一些小部件。通常,我使用JavaScript代码块中的构件函数传递选项和回调引用。将函数对象引用作为序列化的json传递

现在我想在自动生成的html页面中使用小部件,并将选项传递给它们而不使用JavaScript块。我正在指定嵌入式json中的一个常用JavaScript代码块解析的选项,并将它传递给该小部件。

<div id="search_widget"> 
    <script type="application/json"> 
    { 
     "search": { 
      "search_string": "text to be searched", 
      "callback": "a function object in an outer scope" 
     } 
    } 
    </script> 
</div> 

如何将保留其范围的函数对象传递给json格式的小部件? 小部件将调用条件满足时指定的函数。

感谢您的帮助。

+0

Function.prototype.toJSON = ... – dandavis

回答

0

您可以将函数体作为文本传递,但您的接收上下文将必须知道它是一个函数,并用构造函数(或其他)构造函数“重新构造”它。你不能保留“范围”,尽管这在JSON块中并不意味着太多。

你也可以传递函数名称,或者一些识别模式,或者其他任何你喜欢的东西,但是所有的条件是接收代码知道如何处理它。

JSON没有提供表示“功能”的机制。这个概念与格式完全不相容,正确的是,它的意图是语言中立。

编辑 —需要注意的是,如果你的名字编码的功能:

<script type="application/json"> 
{ 
    "search": { 
     "search_string": "text to be searched", 
     "callback": "search_callback_23" 
    } 
} 
</script> 

然后,抓住对象并解释内容可以随时与外JSON对象上下文调用函数的代码:

function handleJSON(the_JSON_from_the_example) { 
    var json = JSON.parse(the_JSON_from_the_example); 
    if ("search" in json) { 
    var searchTerm = json.search.search_string; 
    var callback = findCallbackFunction(json.search.callback); // whatever 
    callback.call(json, searchTerm); // or json.search maybe? 
    } 
} 

换句话说,如果是这样的解释JSON编码信息的代码知道够找到回调函数的引用,那么就可以大概判断出的Appro公司作为this调用该函数时使用的priate对象。

+0

谢谢Pointy,但传递函数体不是一个选项。是否可以传递一个函数名称和范围指示,以便我可以代理方法调用? – Mountain

+0

@ user2631483只要接收环境有一种方法可以理解你的JSON如何识别函数,那么你可以做任何事情(只要表示只涉及字符串和数字以及布尔值)。你必须解释更多关于“范围”的含义,因为JSON中确实没有这样的东西。 – Pointy

+0

根据范围,我的意思是以某种方式使用json传递'this'对象。但正如你所说的,JSON中不会有这样的事情。 – Mountain