2011-06-07 128 views
0

我被要求通过vbscript代码段“嗅探用户的windows用户名”,并且无法在tapestry(5.1.0.5)应用程序中使用它。做tapestry 5支持vbscript吗?

看来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中应呈现的状态重新加载,我得到的萤火以下错误:

missing ; before statement 
Dim shell 

这是因为脚本是由prototypejs评价:

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

有没有人知道一种方法来避免原型评估这个脚本,以便它可以通过并执行为VBScript?

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

感谢页。

回答

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> 
+0

很好的答案说笑,我个人通过包括解决它脚本在页面tml中,这样它就不会被原型所破坏。 – pstanton 2011-06-20 06:24:00