JSON对象传递给外部JavaScript - 酷技术

时间:2011-05-26 07:47:26

标签: javascript json design-patterns external options

我正在查看FireBug Lite并看到他们使用非常酷的技术将选项传递到外部脚本文件中。

<script type="text/javascript" src="https://getfirebug.com/firebug-lite.js">
{
    overrideConsole: false,
    startInNewWindow: true,
    startOpened: true,
    enableTrace: true
}
</script>

我想知道是否有人知道这种技术的名称,我可以在哪里找到有关它的更多信息或它是如何工作的。看起来很酷。谢谢!

2 个答案:

答案 0 :(得分:4)

你可能认为这不是一种自动变量传递技术。

他们所有的代码都循环遍历所有script代码,直到找到加载代码的代码(通过将src属性与正则表达式/(firebug-lite(?:-\w+)?(?:\.js|\.jgz))(?:#(.+))?$/;进行比较)。< / p>

如果找到了标记,它只会得到.innerHTML标记的script,并对其进行评估。

我想这个(未命名的)技术在现实世界中并不相关,因为我们没有保证找到哪个script标签引用我们的库的方法(特别是因为它对所有人来说都很常见)脚本将被合并到实时服务器上的一个脚本文件中。)

此外,我怀疑这是如何跨浏览器的;因为它肯定不会被spec所指出,其中指出:

说完(并考虑过):spec表示浏览器不应解释这两者。然而,这与该技术无关。浏览器不必插入两者,因为脚本的内容是通过innerHTML读入的(即使它确实在内容中读取,它也不会造成任何伤害)。只要浏览器符合规范,并加载URI(所有浏览器都这样做),就没有问题! (除了不知道/保证您的图书馆所属的script标签)。

  

脚本可以在。中定义   SCRIPT元素的内容或   外部文件。如果是src属性   未设置,用户代理必须解释   元素的内容为   脚本。如果src有URI值,   用户代理必须忽略该元素   内容并通过检索脚本   URI。

(即,不要同时解读)。

答案 1 :(得分:2)

继@ Matt的回答,并澄清我的评论:

var doc = Firebug.browser.document;
var script = doc.getElementsByTagName("script")[index];
var url = getScriptURL(script);
var isExternal = url && url != doc.location.href;

try
{
  if(isExternal)
  {
    Ajax.request({url:url, onSuccess:renderProcess, onFailure:onFailure})
  }
  else
  {
    var src = script.innerHTML;
    renderProcess(src)
  }
}
catch(e)
{
  onFailure()
}