Объект JSON перешел на внешний JavaScript - Cool Technique

Я смотрел FireBug Lite и видел, что они используют довольно крутую технику для передачи опций во внешний файл script.

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

Мне было интересно, знает ли кто-нибудь название этой техники и где я могу найти больше информации об этом или о том, как это работает. Кажется довольно круто. Спасибо!

Ответ 1

Это не автоматическая техника передачи переменных, как вы думаете.

Все их код выполняет цикл через теги script, пока не найдет тот, который загрузил их код (сравнивая атрибут src с регулярным выражением (/(firebug-lite(?:-\w+)?(?:\.js|\.jgz))(?:#(.+))?$/;).

Если он находит тег, он просто получает тег .innerHTML тега script и оценивает его.

Я предполагаю, что этот (неназванный) techique не имеет отношения к реальному миру, так как у нас нет гарантированного метода определения того, какой тег script относится к нашей библиотеке (особенно, поскольку это распространено для всех script для объединения в один файл script на живых серверах).

Кроме того, у меня есть сомнения относительно того, как кросс-браузер это; поскольку это, безусловно, не соответствует spec, в котором говорится:

Сказав это (и подумав об этом): spec заявляет, что браузер не должен интерпретировать оба. Однако это не относится к этой технике. Браузеру не нужно перебирать оба значения, так как содержимое script считывается через innerHTML (и даже если оно читается в содержимом, оно не приносит никакого вреда). В зависимости от того, как браузер соответствует спецификации и загружает URI (что делают все браузеры), нет проблем! (кроме того, что вы не знаете/не гарантируете, к какому тэгу script принадлежит ваша библиотека).

script может быть определен в пределах содержимое элемента script или в внешний файл. Если атрибут src не задано, пользовательские агенты должны интерпретировать содержимое элемента как script. Если значение src имеет значение URI, пользовательские агенты должны игнорировать элемент содержимого и получить script через URI.

(т.е. не интерпретировать оба).

Ответ 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()
}