2016-01-19 2 views
1

Microsoft цитирует, что javascript теперь является гражданином первого класса в Visual Studio и «Универсальной платформе Windows», но мне еще предстоит найти способ обновление десятилетия + старого механизма JScript, используемого в сценарии ASP IIS/Classic. Итак, мой вопрос: кто-нибудь знает, есть ли способ сделать это?Обновление IIS/Classic ASP Javascript/JScript скриптовые двигатели (до Chakra?)

Почему?

Я хотел бы использовать JSON.parse, например, на классической странице ASP (которая использует javascript, а не VBScript). В настоящее время я включаю в себя копию старого сценария Джона Крокфорда, который в порядке, но в эти дни это не нужно.

+0

обновить IE на разъединять в IE 11, как правило, помогает, но классический ASP является такой старой технологии. –

+0

Итак, что мешает вам использовать [JSON.Parse] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)? – Paul

+0

@Lex Li: У меня есть один dev env с использованием Win10 (поэтому установлены IE11 и Edge), но в классических ASP-страницах все еще используется старший JScript AFAICT, и мне все еще нужно включить Crockford lib. – CodaCoder

ответ

3

Почему? Ну, как вы, наверное, знаете, хосты с доступной 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 
+0

Это интригующий подход - стыд, я не мог заставить его работать. Я могу сделать Server.CreateObject («htmlfile») (также пробовал ActiveXObject) из ASP, но htmlfile.write завершился с ошибкой «htmlfile: Invalid argument». Примечание. Проверка на отладчике визуальной студии показывает, что объект htmlfile создан, и я вижу, что метод записи доступен. – CodaCoder

+0

@CodaCoder Попробуйте 'htmlfile.IHTMLDocument2_write() 'и посмотрите, есть ли у вас больше удачи. – rojo

+0

«Объект не поддерживает это свойство или метод» :( – CodaCoder

Смежные вопросы