主题:求教:用ScriptControl运行JS脚本时如何引用window对象?
joforn
[专家分:1460] 发布于 2008-01-17 15:44:00
我创建了一个ScriptControl,设置其语言为"JScript",但是发现在运行的脚本中连alert函数都用不了。应该是缺少window对象所致。
问题:如何把window对象加入Scriptcontrol对象集中,或是在脚本能否自己创建一个window对象。
[em13]
最后更新于:2008-01-17 15:52:00
回复列表 (共11个回复)
沙发
华山论剑 [专家分:5310] 发布于 2008-01-17 16:52:00
试试先设置:
ScriptControl1.AllowUI = True
板凳
joforn [专家分:1460] 发布于 2008-01-17 17:37:00
[quote]试试先设置:
ScriptControl1.AllowUI = True[/quote]
這一條在初始化時已經加入。
這一條只能讓VBS中的Msgbox可以正常執行。但JS中的還是不行。
3 楼
joforn [专家分:1460] 发布于 2008-01-17 17:38:00
謝謝二樓的回答,剛剛忘記加分了。呵呵。
雖然問題仍未解決。但還是多謝二樓的兄弟。
[em1]
也希望能有更多的高手來幫我一起來想想。在此先謝過。
4 楼
华山论剑 [专家分:5310] 发布于 2008-01-18 08:56:00
能否把代码贴出来,这样不好判断?
5 楼
joforn [专家分:1460] 发布于 2008-01-18 13:44:00
Private Sub ResetScript(Optional ByVal CodeL As Long)
'这段代码主要是用来初始化SC1(我在窗体中添加的ScriptControl)
'GetRNDName函数是用来返回一个随机名称。
'GetResCode函数是从资源文件中读取原始的未处理的脚本代码,准备加入供其它脚本文件在运行中调用。
'GetResSTR函数是能过字符转换,将原始代码转换成相应的脚本代码(转成JS代码或是VBS代码)
'上面三个函数均已经通过测试没有问题。
Private Sub ResetScript(Optional ByVal CodeL As Long)
Dim ObjName As String
Dim tCode As String
On Error Resume Next
SC1.Language = "VBScript"
SC1.AddCode "Sub Main()" & vbCrLf & vbCrLf & vbCrLf & "End Sub" & vbCrLf
SC1.Run "main"
SC1.Error.Clear
SC1.Reset
SC1.SitehWnd = Web1.hwnd
SC1.State = Connected
SC1.AllowUI = True
SC1.TimeOut = -1
SC1.Language = IIf(CodeL, "JScript", "VBScript")
ObjName = GetRNDName
SC1.AddObject ObjName, MyWeb
SC1.AddCode GetResSTR(GetResCode, ObjName, IIf(CodeL, "{", ""), IIf(CodeL, ";", ""), IIf(CodeL, "}", "End Function"))
SC1.Error.Clear
End Sub
'每次调用脚本文件时都调用上面的过程来初始化SC1使其能够按要求加入正确的模块代码。
'然后就是读取指定脚本文件运行。但这时运行代码就会出错了。
'下面是脚本文件中的内容,脚本代码是只有一条语句的函数:
function Main(){
alert("窗口对象输入方法");
}
'在窗体代码中运行
SC1.Run "Main"
'这时就会提示出错了。
6 楼
华山论剑 [专家分:5310] 发布于 2008-01-18 15:13:00
没有实际的调试环境,看了还是发蒙。
仅仅有个推测,是否将上面的名字"Main"换一个再试试,Sub Main默认是VB的模块级启动入口,是否有冲突?
7 楼
joforn [专家分:1460] 发布于 2008-01-18 18:07:00
[quote]没有实际的调试环境,看了还是发蒙。
仅仅有个推测,是否将上面的名字"Main"换一个再试试,Sub Main默认是VB的模块级启动入口,是否有冲突?[/quote]
不是Main的名字问题。因为我注释掉 alert("窗口对象输入方法");的话就不会出错。
比如说我如果用这个的话就没问题了:
function Main(){
var I;
I=100;
}
8 楼
joforn [专家分:1460] 发布于 2008-01-18 19:41:00
此帖再挂三天,如果还没找到解决方法就只能自写函数了,唉……
9 楼
华山论剑 [专家分:5310] 发布于 2008-01-19 18:01:00
兄弟送了我50分,可我却对此问题实在是发蒙,网上查了查,虽然也有类似问题,没一个人给出了解答。
好在我不久前刚做过一个从客户网上自动下载资料的程序,积累了一些经验,今天又好好地研究了一番,虽然没能完全照兄弟的思路解决,但也能实现,不然我会心中有愧的。
1、在VB程序中添加"Microsoft HTML Object Library"(为以后引用窗口对象做准备);
2、添加WebBrowser控件web1;
3、先调用WebBrowser控件的Navigate加载一个Docuemnt,不然就没有Window对象;
4、代码如下:
[code=c]
Private Sub Form_Load()
web1.Navigate App.Path & "\test.htm"
End Sub
Private Sub Command1_Click()
Dim win As HTMLWindow2
Set win = web1.Document.parentWindow '取得window对象,但web1
'中一定要先加载
SC1.AllowUI = True
SC1.Language = "JScript"
SC1.AddObject "window", win, True '添加对象参考,然后才能
'调用alert
SC1.Eval ("window.alert('test');")
End Sub
[/code]
10 楼
华山论剑 [专家分:5310] 发布于 2008-01-20 09:06:00
直接实现的方法也试出来了:
SC1.Eval ("window.main()")
不过:
SC1.AddObject "window", win, True
只能添加一次,也可以通过nothing判断。
我来回复