如何在javascript中使用GeckoFX作为XULRunner的包装器来调用c#方法
本文关键字:包装 调用 方法 XULRunner 作为 javascript GeckoFX | 更新日期: 2023-09-27 18:06:37
我使用GeckoFX16和xulrunner-16.0.2.en-US。win32在我的项目。问题是,我想在javascript中调用c#方法。
我很好奇,有办法做到这一点吗?
就像下面:
C#
部分:
private GeckoWebBrowser weBrowser;
public browser()
{
InitializeComponent();
Gecko.Xpcom.Initialize("xulrunner");
weBrowser = new GeckoWebBrowser();
weBrowser.Parent = this;
weBrowser.Dock = DockStyle.Fill;
weBrowser.Navigate("test.html");
}
public string loadData(){
//load data from local file.
return str;
}
javascript
部分:
<script type='text/javascript'>
var data = window.loadData();
alert(data);
</script>
我是这个领域的新手,如果可能的话我会很感激!
重要更新:
当前event.initMessageEvent
代码不能工作,因为该结构已在
var event = new MessageEvent('yourEventName', { 'view': window, 'bubbles': false, 'cancelable': false, 'data': 'some data' });
您可以使用MessageEvent来调用c#中的代码,但据我所知,您不能像您想要的那样返回字符串。其中一个单元测试演示了如何调用c#代码:
[Test]
public void AddEventListener_JScriptFiresEvent_ListenerIsCalledWithMessage()
{
string payload = null;
browser.AddMessageEventListener("callMe", ((string p) => payload = p));
browser.LoadHtml(
@"<!DOCTYPE html>
<html><head>
<script type='text/javascript'>
window.onload= function() {
event = document.createEvent('MessageEvent');
var origin = window.location.protocol + '//' + window.location.host;
event.initMessageEvent ('callMe', true, true, 'some data', origin, 1234, window, null);
document.dispatchEvent (event);
}
</script>
</head><body></body></html>");
browser.NavigateFinishedNotifier.BlockUntilNavigationFinished();
Assert.AreEqual("some data", payload);
}
我知道这很尴尬,但是你可以使用c#->javascript调用来将数据返回到javascript-land。如何做到这一点,请参阅这个问题。所以你的javascript会首先把这个消息发送到c# land,然后它会得到一个你需要的字符串值的回调。
希望对你有帮助。
你可以在浏览器中添加消息事件监听器,并像这样调用你的方法:
private void load()
{
browser.AddMessageEventListener("myFunction", ((string s) => this.showMessage(s)));
browser.LoadHtml
(
@"<!DOCTYPE html>
<html><head>
<meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8"">
<script type=""text/javascript"">
function fireEvent(name, data)
{
event = document.createEvent('MessageEvent');
event.initMessageEvent(name, false, false, data, null, null, null, null);
document.dispatchEvent(event);
}
</script>
</head>
<body>
<input type=""button"" onclick=""fireEvent('myFunction', 'some data');"" value=""SHOW DATA"" />
</body></html>"
);
}
…
private void showMessage(string s)
{
MessageBox.Show(s);
}
现在您可以添加更多的msg事件到您的msg侦听器(如果您需要),并以相同的方式触发它们。