jan*_*nko 13 javascript c# internet-explorer webbrowser-control
我试图在System.Windows.Forms.WebBrowser控件中显示带有嵌入式JavaScript代码的HTML页面.期望JavaScript代码通过window.external对象与嵌入环境交互.在调用方法之前window.external,JavaScript应该检查方法是否存在.如果不存在,代码应该调用通用的回退方法.
// basic idea
if (typeof(window.external.MyMethod) != 'undefined') {
window.external.MyMethod(args);
} else {
window.external.Generic("MyMethod", args);
}
Run Code Online (Sandbox Code Playgroud)
但是,检查无参数方法typeof似乎已经调用了该方法.也就是说,如果MyMethod接受任何正数的参数,上面的代码将完美地工作; 但是,如果MyMethod是无参数方法,则表达式typeof(window.external.MyMethod)不会检查其类型,而是调用它.
这种行为有没有解决方法?我可以以某种方式逃避表达式,window.external.MyMethod以防止方法调用发生?
我没有调试你的确切情况,但我相信我的精神力量可以解决这里发生的事情.
JScript语言区分了函数的使用和仅提及它.当你说
x = f;
Run Code Online (Sandbox Code Playgroud)
这表示"将由f标识的函数的引用赋给变量x".它提到了 f.相比之下,
x = f();
Run Code Online (Sandbox Code Playgroud)
使用 f.它表示"调用f标识的函数并将返回的值赋给x".
简而言之,JScript中的函数基本上是我们所认为的C#中委托类型的属性.
有些语言没有这种区别.在VBScript中,如果你说x = f和f是一个函数,那就意味着调用函数,就像x = f().VBScript在函数的使用和提及之间没有语法上的强烈区别.
实现这一切的方式是我们使用COM; 具体来说,我们使用OLE自动化.当调度对象的字段以获取其值时,JScript引擎会传递表示"property get"或"method invoke"的标志,具体取决于它是使用还是提及.
但是假设您调度的对象是在期望它将从VB调用的情况下编写的.也许它是用VB编写的.VB对象说"哦,我看到你问我这个方法的价值是完全合理合法的.因为我不明白提到一个方法和使用它之间的区别,我只是调用无论你通过哪个国旗".
我不知道是否有一个解决方法,但我愿意下注多达一美元,发生的事情是被调用的对象假设调用者想要VB语义.
小智 6
我找到了这个
if ('MyMethod' in window.external)
Run Code Online (Sandbox Code Playgroud)
不会调用MyMethod
| 归档时间: |
|
| 查看次数: |
4081 次 |
| 最近记录: |