Почему? Ну, как вы, наверное, знаете, хосты с доступной Chakra не имеют разрешения по умолчанию. По MSDN documentation:
Starting with JScript 5.8, by default, the JScript scripting engine supports the language feature set as it existed in version 5.7. This is to maintain compatibility with the earlier versions of the engine. To use the complete language feature set of version 5.8, the Windows Script interface host has to invoke IActiveScriptProperty::SetProperty .
Из того, что я был в состоянии понять, это означает, что вы должны закодировать свой собственный хост выполнения пользовательского сценария для оценки существующего кода чакры. -_-
Как полностью завораживает такой шум, гораздо легче клонировать все объекты и методы, которые вам нужны из других источников. Объект COM htmlfile
может выставлять объекты и методы, недоступные текущему хосту сценария, просто заставляя его работать в режиме совместимости.
// classic WSH JScript version
var htmlfile = new ActiveXObject('htmlfile'), JSON;
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />');
htmlfile.close(JSON = htmlfile.parentWindow.JSON);
И вуаля! Теперь вы можете JSON.parse()
или JSON.stringify()
до вашего содержимого, без необходимости включать json2.js и без необходимости прилагать огромные усилия, чтобы вызвать IActiveScript::SetProperty
.
Быстрое примечание об этом фрагменте кода выше: htmlfile.write('<meta... etc />')
работает в классическом JScript, но по какой-то причине .NET ведет борьбу с методами write()
и writeln()
. IHTMLDocument2_write()
и IHTMLDocument2_writeln()
следует использовать вместо этого, если вы когда-либо переключаетесь на .aspx и JScript.NET.
// JScript.NET version
var htmlfile:Object = new ActiveXObject('htmlfile'), JSON:Object = {};
htmlfile.IHTMLDocument2_write('<meta http-equiv="x-ua-compatible" content="IE=9" />');
htmlfile.close(JSON = htmlfile.parentWindow.JSON);
Я также хотел бы указать, что другие более современные методы ECMAscript могут быть импортированы аналогичным образом. Вот демонстрация нескольких других методов, которые aren't natively available in JScript 5.7, но могут быть клонированы от htmlfile
в стандартном режиме IE9. Сохранить с расширением .asp посетить его в веб-браузере:
<%@ Language="JScript" %>
<h3>Output:</h3>
<textarea style="width: 100%; height: 5em"><%
var htmlfile = Server.CreateObject('htmlfile');
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />');
// expose more modern methods from htmlfile
var JSON = htmlfile.parentWindow.JSON;
String.prototype.trim = htmlfile.parentWindow.String.prototype.trim;
Array.prototype.indexOf = htmlfile.parentWindow.Array.prototype.indexOf;
Array.prototype.forEach = htmlfile.parentWindow.Array.prototype.forEach;
Object.keys = htmlfile.parentWindow.Object.keys;
htmlfile.close(); // no longer needed
// demonstrate JSON.parse() and String.trim()
var strJSON = '{ "item1": " val1 needs trimmed. " }';
var objFromJSON = JSON.parse(strJSON);
Response.Write('JSON and String.trim() demo result: ' + objFromJSON.item1.trim() + '\n');
// demonstrate Array.indexOf()
var arr = [2, 4, 6, 8, 10];
Response.Write('Array.indexOf(val) demo result: ' + arr.indexOf(4) + '\n');
// demonstrate Object.keys() and Array.forEach()
var demo = { "foo": "bar", "baz ": "qux" };
demo.getKey = function(val) {
var obj = this, result;
Object.keys(obj).forEach(function(i) {
if (obj[i] === val) result = i;
});
return result;
}
Response.Write('Object.keys(obj).forEach(fn) demo result: ' + demo.getKey('qux'));
%></textarea>
Выход:
JSON and String.trim() demo result: val1 needs trimmed.
Array.indexOf(val) demo result: 1
Object.keys(obj).forEach(fn) demo result: baz
обновить IE на разъединять в IE 11, как правило, помогает, но классический ASP является такой старой технологии. –
Итак, что мешает вам использовать [JSON.Parse] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)? – Paul
@Lex Li: У меня есть один dev env с использованием Win10 (поэтому установлены IE11 и Edge), но в классических ASP-страницах все еще используется старший JScript AFAICT, и мне все еще нужно включить Crockford lib. – CodaCoder