Код JavaScript внутри тега <script>

Очевидно, объект JSON может быть передан внутри связанного скрипта. Я пытаюсь выяснить, как именно это работает (или если это работает):

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

Я заметил это здесь в документации Firebug Lite: http://getfirebug.com/firebuglite

3 ответа

Решение

Содержание не выполняется, потому что элемент имеет src приписывать. Это не совсем законно, как есть. Спецификация HTML5 гласит:

Если есть src атрибут, элемент должен быть либо пустым, либо содержать только документацию сценария, которая также соответствует ограничениям содержимого сценария.

Содержание этого <script> Элемент не является ни действительным JSON, ни допустимым JavaScript. Это недопустимый JSON, потому что имена свойств не заключены в кавычки. Это недопустимый JavaScript, потому что, хотя он выглядит как блочное выражение с помеченными операторами, двоеточие после startInNewWindow не может законно появиться там.

Тем не менее, загружаемый скрипт всегда может найти последний элемент скрипта и проанализировать его содержимое:

 var scripts = document.getElementsByTagName('SCRIPT');
 var lastScript = scripts[script.length - 1];
 var content = eval(lastScript.innerText || lastScript.textContent);

Браузер будет игнорировать любой контент в <script src /> тег.

Тем не менее, Firebug Lite Javascript специально найдет его <script> помечать и анализировать содержимое вручную.

Вот рассматриваемый код, который анализирует объект JSON на случай, если кому-то будет интересно.

// process the Script JSON Options
var innerOptions = FBL.trim(script.innerHTML);
if (innerOptions) {
    var innerOptionsObject = eval("(" + innerOptions + ")");

    for (var name in innerOptionsObject) {
        var value = innerOptionsObject[name];

        if (name == "debug") {
            Env.isDebugMode = !!value;
        }
        else if (name in Env.Options) {
            Env.Options[name] = value;
        }
        else {
            Env[name] = value;
        }
    }
}

http://code.google.com/p/fbug/source/browse/lite/branches/firebug1.5/build/firebug-lite-debug.js#478

Другие вопросы по тегам