回 帖 发 新 帖 刷新版面

主题:求教:用ScriptControl运行JS脚本时如何引用window对象?

我创建了一个ScriptControl,设置其语言为"JScript",但是发现在运行的脚本中连alert函数都用不了。应该是缺少window对象所致。
问题:如何把window对象加入Scriptcontrol对象集中,或是在脚本能否自己创建一个window对象。


[em13]

回复列表 (共11个回复)

沙发

试试先设置:

ScriptControl1.AllowUI = True

板凳

[quote]试试先设置:

ScriptControl1.AllowUI = True[/quote]
這一條在初始化時已經加入。
這一條只能讓VBS中的Msgbox可以正常執行。但JS中的還是不行。

3 楼

謝謝二樓的回答,剛剛忘記加分了。呵呵。
雖然問題仍未解決。但還是多謝二樓的兄弟。
[em1]

也希望能有更多的高手來幫我一起來想想。在此先謝過。

4 楼

能否把代码贴出来,这样不好判断?

5 楼

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 楼

没有实际的调试环境,看了还是发蒙。

仅仅有个推测,是否将上面的名字"Main"换一个再试试,Sub Main默认是VB的模块级启动入口,是否有冲突?

7 楼

[quote]没有实际的调试环境,看了还是发蒙。

仅仅有个推测,是否将上面的名字"Main"换一个再试试,Sub Main默认是VB的模块级启动入口,是否有冲突?[/quote]

不是Main的名字问题。因为我注释掉 alert("窗口对象输入方法");的话就不会出错。
比如说我如果用这个的话就没问题了:
function Main(){
  var I;  
  I=100;
}

8 楼

此帖再挂三天,如果还没找到解决方法就只能自写函数了,唉……

9 楼


兄弟送了我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 楼

直接实现的方法也试出来了:

SC1.Eval ("window.main()")

不过:

SC1.AddObject "window", win, True    

只能添加一次,也可以通过nothing判断。

我来回复

您尚未登录,请登录后再回复。点此登录或注册