Код JavaScript внутри тега <script> - PullRequest
5 голосов
/ 04 февраля 2012

Очевидно, что объект 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#ScriptJSONOptions

Ответы [ 3 ]

9 голосов
/ 04 февраля 2012

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

Если имеется атрибут 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);
5 голосов
/ 04 февраля 2012

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

Однако JavaScript-код Firebug Lite определенно найдет свой тег <script> и проанализирует содержимое вручную.

1 голос
/ 10 февраля 2012

Ниже приведен код, который анализирует объект 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

...