首页 > 解决方案 > 在 OnContextCreated 事件中使用 ExecuteJavaScriptAsync() API 动态添加 javascript 删除 HTML HEAD 标记中的元素 (wpf cefsharp 83.4.20.0)

问题描述

我有一个进行 ActiveX 调用的网页。目前该页面是在 IE 嵌入式浏览器中加载的。现在我打算开始使用 CEF 作为嵌入式网络浏览器。我想在不修改现有代码的情况下实现这一点。

我的示例网页代码:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>Test ActiveXObject</title>
</head>
<body onload="myFunction()">

<script type="text/javascript" >

function CallSampleApi()
  {
    var obj = new ActiveXObject("Global.Pref");
    var prefs = obj.Create("Pref.myPref");

    if (prefs != null ) {
        return prefs.SampleAPI();
      }
      else {
        return 'not caught';
      }

}

function myFunction() {

        var message = "<h1 align='center'>Browser is Chrome </h1>" +
                       "<table border='1' width=500>" +
                         "<tr bgcolor='grey'><th width=300>Function Name</th><th width=200>Result</th></tr>" +
               "<tr><td>Call Sample Api</td><td align='center'>" + CallSampleApi() + "</td></tr>" +
                   "</table>" ;

        document.write(message);

}
    
</script>
</body>
</html>

我正在为嵌入式 Web 浏览器使用 WPF cefsharp 库。在我的 WPF 代码中,我为此 ActiveXObject 编写了一个包装器,并在 OnContextCreated 事件中使用 ExecuteJavaScriptAsync() API 动态添加了 javascript。这工作正常。但问题是,这段代码以某种方式删除了我的 html 文件中的所有标签,这很奇怪。

public void OnContextCreated(IWebBrowser browserControl, IBrowser browser, IFrame frame)
{

            if (_script != null && frame.IsMain)
            {
                
                if (frame.Url.Contains("dev")) // avoid dev tools call

                string script = @"class ActiveXObject {
                                           constructor(name) {
                                        }

                                    Create(nativeObj) {
                                        switch (nativeObj) {
                                            case 'Pref.myPref':
                                                return new Preferences();
                                            default:
                                                return null;
                                        }

                                    }
                                }

                                class Preferences { 
                                    constructor() {
                                    }

                                SampleAPI() {
                                    return 'I am caught';
                                }

                            }";

            frame.ExecuteJavaScriptAsync(script);
    }
}

在cef嵌入式浏览器中加载的页面来源:

<html>
<head></head>
<body>
<h1 align="center">Browser is Chrome </h1>
<table border="1" width="500"><tbody><tr bgcolor="grey"><th width="300">Function Name</th><th width="200">Result</th></tr><tr><td>Call Sample Api</td><td align="center">I am caught</td></tr></tbody></table>
</body>
</html>

不确定如何删除 HEAD 元素。如果我从 html 页面中删除 onload 事件并在 SCRIPT 标记中移动内容,它工作正常。

标签: cefsharp

解决方案


推荐阅读