гобелен 5 поддерживает VBScript? - PullRequest
0 голосов
/ 07 июня 2011

Меня попросили «прослушать» имя пользователя Windows с помощью фрагмента vbscript, и у меня возникли проблемы с его настройкой в ​​приложении «Гобелен» (5.1.0.5).

Кажется, гобелен пытаетсяинтерпретировать vbscript как javascript и, следовательно, потерпеть неудачу.

Фрагмент vbscript (ниже) встроен в компонент, который, в свою очередь, условно загружается в зону как часть мультизонального обновления.

pseudo tml:

<page>
    <t:zone>
        <t:if>
            <t:mycomponent>
                <vbscript />

vbscript:

<script type="text/vbscript" language="vbscript">
    Dim shell
    set shell = createobject("wscript.shell")
    set env = shell.environment("process")
    set field = document.getElementById("windowsLoginField")
    if field is nothing then
        alert("no field")
    else
        field.value = env("username")
    end if
</script>

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

Когда зона перезагружается в состоянии, когда vbscript должен быть обработан, я получаю следующую ошибку в firebug:

missing ; before statement
Dim shell 

Это потому, что скрипт проверяется prototypejs:

evalScripts: function() {
    return this.extractScripts().map(function(script) { return eval(script) });
}, 

Кто-нибудь знает способ избежать прототипа, оценивающего этот сценарий, чтобы он мог выполнить его и выполнить как vbscript?

Я заметил, что @Includ не существуетeVbScriptLibrary аннотация ...

спасибо, стр.

1 Ответ

2 голосов
/ 14 июня 2011

Гобелен наследует эту проблему от прототипа.Одним из решений является исправление прототипа extractScripts и evalScripts, чтобы они делали то, что вы хотите, когда они видят vbscript.

Этот код работает (проверено в IE7 и Chrome), но его можно сделать более гибким (ключи отключены отнапример, тип, а не язык)

<script type="text/javascript">

String.prototype.extractScripts = function() {
    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');

    var matchVBScript = new RegExp('<script.*type=(["\'])text\/vbscript\\1');

    return (this.match(matchAll) || []).map(function(scriptTag) {
      return [matchVBScript.match(scriptTag), (scriptTag.match(matchOne) || ['', ''])[1]];
    });
  }

String.prototype.evalScripts = function() {
    return this.extractScripts().map(function(script) { 
      // if it's vbscript and we're in IE then exec it.
      if ( script[0] && Prototype.Browser.IE ) return execScript(script[1], "VBScript");

      // if it's not vbscript then eval it    
      if ( !script[0] ) return eval(script[1]);

    });
}
</script>
...