2011-05-26 48 views
10

我在看FireBug Lite,看到他们使用了一种非常酷的技术将选项传递给外部脚本文件。传递给外部JavaScript的JSON对象 - 酷技巧

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

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

+0

这是类似JSONP? http://en.m.wikipedia.org/wiki/JSONP – mason 2014-02-21 03:35:54

回答

4

它不像您想象的那样是一种自动变量传递技术。

所有他们的代码所做的是通过所有的script标签循环,直到他们发现里面装的代码(由src属性比较正则表达式(/(firebug-lite(?:-\w+)?(?:\.js|\.jgz))(?:#(.+))?$/;)之一。

如果发现标签,它只是得到script标签的.innerHTML,并对其进行评估。

我想这(未命名)己技巧是不是在现实世界相关,因为我们没有发现有保证的方法,该方法script标签是指我们库(特别是所有脚本在l上合并成一个脚本文件是很常见的) ive服务器)。

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

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

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

(即,不解释两者)。

+1

打开https://getfirebug.com/firebug-lite.js文件;并搜索'var getScriptURL'和'var options = fileOptions.split(“,”);' – 2011-05-26 08:36:08

+0

@Theo:'fileOptions'用于“脚本URL选项”(http://getfirebug.com/firebuglite#ScriptURLOptions)。你想让我看看'getScriptUrl'的什么? – Matt 2011-05-26 08:40:07

+0

@Matt我不是故意的你,我加入你的答案。我的意思是'var url = getScriptURL(script);',是你解释发生的地方。 – 2011-05-26 08:44:45

2

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

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() 
}