日前项目上遇到需要调用一个第三方的监控接口,给对方参数后,会返回一个url地址,我方系统需要根据用户在网页上点击的不同按钮,要求如下:在打开违规提醒窗口时,需要注册Callback方法(含一个字符串类型 的入参)到浏览器组件中。在该方法中,判断接收入参为“goBackEdit”, 则关闭本窗口,操作员可以继续修改之前录入的内容,修改完成后可以再 次提交审核;当接收入参为“goOn”,则关闭本窗口
触发后续不同的逻辑处理,比如停止/继续,经过网上搜索写了一个调用demo代码如下:
1:新建BrowserCallback.cs文件:// 定义一个COM可见的类,用于处理JavaScript调用
// 定义一个COM可见的类,用于处理JavaScript调用
[ComVisible(true)]
public class BrowserCallback
{
private readonly Form _hostForm;
public event Action<string> GetWebActionHandler;
public BrowserCallback(Form hostForm)
{
_hostForm = hostForm;
}
// JavaScript可调用的方法
public void HandleAction(string action)
{
// 确保在UI线程执行
if (_hostForm.InvokeRequired)
{
_hostForm.Invoke(new Action(() => HandleAction(action)));
return;
}
// 关闭当前窗口
_hostForm.Close();
//将网页上获取到的对于违规提醒窗的处理值:action传递给GetWebActionHandler事件处理程序
GetWebActionHandler(action);
}
}
2:新建一个模式弹框,要集成webBrowser显示接口返回的url:
public partial class FormWebBrower : Form
{
public bool goOn = false;
public FormWebBrower(string url)
{
InitializeComponent();
InitializeBrowser(url);
}
private void InitializeBrowser(string url)
{
// 步骤2:初始化浏览器控件
var browser = new WebBrowser
{
Dock = DockStyle.Fill,
ScriptErrorsSuppressed = true //避免脚本错误弹窗
};
Controls.Add(browser);
BrowserCallback callback = new BrowserCallback(this);
callback.GetWebActionHandler += GetWebAction;
// 步骤3:注册回调对象
browser.ObjectForScripting = callback;
// 步骤4:加载包含回调的网页
//browser.Navigate(url);
// 或加载本地HTML
browser.DocumentText = @"
<html><body>
<button onclick='window.external.HandleAction(""goBackEdit"")'>
返回修改
</button>
<button onclick='window.external.HandleAction(""goOn"")'>
继续
</button>
</body></html>";
}
/// <summary>
/// 在打开违规提醒窗口后,获取用户对于违规点击继续按钮,会触发此方法
/// </summary>
/// <param name="obj"></param>
private void GetWebAction(string obj)
{
//MessageBox.Show("回调成功,参数为:" + obj);
if (obj == "goOn")
{
goOn = true;
}
}
3.现在我们开始模拟调用:
//注意,这里给的地址只是提示作用,在第2段代码中,有模拟html的代码,用那个就可以测试
FormWebBrower f2 = new FormWebBrower("接口返回的url地址");
f2.ShowDialog();
if(f2.goOn)
{
MessageBox.Show("可以继续操作");
}
else
{
MessageBox.Show("★警告:不可以继续操作");
}
现在,运行结果如下:(这里给的地址只是提示作用,在第2段代码中,有模拟html的代码,用那个就可以测试)