我被要求通过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。
答案 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>