【发布时间】:2014-05-30 14:02:12
【问题描述】:
我有一个旧的 html 页面,它创建一个脚本文件并使用:
fsoObject = new ActiveXObject("Scripting.FileSystemObject")
wshObject = new ActiveXObject("WScript.Shell")
我正在尝试对其进行修改,使其也可以在其他浏览器中使用。如果您知道答案,请停止阅读,请回答。如果没有快速回答,这里是我尝试的描述。我成功地完成了这项工作,但前提是脚本少于 2000 个字符。对于超过 2000 个字符的脚本,我需要帮助。
该网页仅供内部使用,因此我可以轻松地在每台运行网络驱动器中的 VBScript 文件的计算机上创建自定义 URL 协议。
我创建了我的custom URL Protocol,它可以像这样启动一个 VBScript 文件:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\MyUrlProtocol]
"URL Protocol"=""
@="Url:MyUrlProtocol"
"UseOriginalUrlEncoding"=dword:00000001
[HKEY_CLASSES_ROOT\MyUrlProtocol\DefaultIcon]
@="C:\\Windows\\System32\\WScript.exe"
[HKEY_CLASSES_ROOT\MyUrlProtocol\shell]
[HKEY_CLASSES_ROOT\MyUrlProtocol\shell\open]
[HKEY_CLASSES_ROOT\MyUrlProtocol\shell\open\command]
@="C:\\Windows\\System32\\WScript.exe \"X:\\MyUrlProtocol.vbs\" \"%1\""
在MyUrlProtocol.vbs 我有这个:
MsgBox "The length of the link is " & Len(WScript.Arguments(0)) & " characters"
MsgBox "The content of the link is: " & WScript.Arguments(0)
当我点击 <a href="MyUrlProtocol:test" id="test">click me</a> 时,我看到两条消息,所以一切正常(在 Windows 7 中使用 Chrome 和 IE 进行了测试。)
当我执行document.getElementById("test").click()时它也有效
我认为这可能是解决方案:我会将脚本的文本传递给 VBS 静态脚本,该脚本将创建动态脚本并运行它,但是使用这个系统我不能传递超过 ~2000 个字符。
所以我尝试将脚本的文本分割成小于 2000 个字符的块,并模拟点击链接的几次,但只有第一个有效。
所以我尝试使用 xmlhttp.open("GET","MyUrlProtocol:test",false);,但 Chrome 显示为 Cross origin requests are only supported for HTTP。
是否可以通过自定义 URL 协议将超过 2000 个字符传递给 VBScript 脚本?
如果不是,是否可以依次调用多个自定义 URL 协议?
如果没有,是否有另一种方法来创建脚本文件并从 Javascript 运行它?
编辑 1
我找到了一个解决方案,但在 Chrome 中只有在它喜欢的时候才有效,所以我回到了原点。
以下代码在 IE 中执行脚本 4 次(正确),但在 Chrome 中只运行第一次执行。
如果我将其更改为delay += 2000,那么 Chrome 通常会运行脚本 2 次,但有时会运行 1 次,有时会运行 3 次甚至 4 次。
如果我将其更改为delay += 10000,那么它通常会运行脚本 4 次,但有时会错过一次。
在 Chrome 和 IE 中,该函数总是执行 4 次。奇怪的是sr.click()有时什么都不做,函数继续执行。
<HTML>
<HEAD>
<script>
var delay;
function runScript(text) {
setTimeout(function(){runScript2(text)}, delay);
delay += 100;
}
function runScript2(text) {
var sr = document.getElementById('scriptRunner');
sr.href='intelliclad:'+text;
sr.click();
}
function test(){
delay = 0;
runScript("uno");
runScript("due");
runScript("tre");
runScript("quattro");
}
</script>
</HEAD>
<BODY>
<input type="button" value="Run test" onclick="test()">
<a href="nothing yet" id="scriptRunner">scriptRunner</a>
</BODY>
</HMTL>
编辑 2
我尝试了 Luke 的建议,即从回调内部设置下一个超时,但没有任何改变(IE 始终有效,Chrome 随时可用)。
这是新代码:
var scripts;
var delay = 2000;
function runScript() {
var sr = document.getElementById('scriptRunner');
sr.href = 'intelliclad:' + scripts.shift();
sr.click();
if(scripts.length)
setTimeout(function() {runScript()}, delay);
}
function test(){
scripts = ["uno", "due", "tre", "quattro"];
runScript();
}
一些背景:页面要求面板的形状,可以是几个参数[nfaces=1, shape1='square', width1=100],也可以是多面、多槽、多紧固件等面板的数百个参数。询问所有参数后为我们的内部 3D CAD(可能大于 20KB)生成一个脚本,然后启动 CAD 并要求执行该脚本。
我想在客户端做所有事情,因为页面由 Domino Web 服务器提供服务,它甚至无法管理如此复杂的脚本。
【问题讨论】:
-
首先,您应该从 within setTimeout 回调中增加
delay,然后也从那里设置下一个 Timeouts,以避免异步代码执行出现问题。我不确定您将什么脚本传递给您的 URL 处理程序,或者您实际上是如何传递它的?更多细节或代码示例将在这里有所帮助。我确信有一种方法可以管理这个,而不必分块你的 VBScript,这听起来很容易出现很多问题。 -
@LukeH 我尝试按照您的建议进行操作,但没有帮助。我在帖子末尾添加了一些背景信息。
-
用javascript重写脚本可能比找到运行VBScript的解决方法更快?抱歉,我帮不上忙,但这听起来很复杂,我需要查看代码。
-
好的,我没有意识到这一点,因为我尝试了您的脚本,而无论更改计时器,Chrome 总是卡在 uno 号。正如您所说,必须将 IE 配置为信任我的服务器,有一个带有 IE 的 HTA 选项... HTA 是 HTML 应用程序,我不知道您是否知道它是一个带有带有 hta 标记的标题的简单 html 文件。它必须重命名为 .hta,然后将其视为 exe 应用程序。我从 IE5 开始编写 HTA 。它使您无需信任 ACTIVE X 组件即可获得完全访问权限。就像你双击一个exe文件一样。
标签: javascript html onclick url-protocol