tapestry 5支持vbscript吗?

时间:2011-06-07 01:14:44

标签: vbscript tapestry

我被要求通过vbscript片段'嗅探'用户的Windows用户名,并且无法在tapestry(5.1.0.5)应用程序中使用它。

似乎tapestry试图将vbscript解释为javascript,因此失败了。

vbscript片段(下方)嵌入在一个组件中,该组件在一个区域内有条件地加载,作为multizoneupdate的一部分。

伪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执行?

我注意到没有@IncludeVbScriptLibrary注释...

谢谢,p。

1 个答案:

答案 0 :(得分:2)

Tapestry从原型继承了这个问题。一种解决方案是修补原型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>