CefSharp 从现有的 Javascript 函数中获取结果

Posted

技术标签:

【中文标题】CefSharp 从现有的 Javascript 函数中获取结果【英文标题】:CefSharp get result from existing Javascript function 【发布时间】:2019-06-04 12:08:32 【问题描述】:

我正在尝试通过在 Windows 窗体应用程序中使用 CefSharp 从本地 html 页面上的现有 javascript 函数获取结果。

html页面来源为:

<!DOCTYPE html>
<html>
<body>
<p id="demo">A Paragraph.</p>
<script>
function myFunction() 
    document.getElementById("demo").innerHTML = true;
    return 1 + 1;

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

我的 C# 代码是:

private void ChromeBrowser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs args)

    if (!args.IsLoading)
    
        string result = RunScriptParamAsync("myFunction").ToString();
    


public string RunScriptParamAsync(string scriptName)

    string script = "";
    script = scriptName;
    //script = string.Format("(function myFunction()  document.getElementById('demo').innerHTML = \"0\"; return 1 + 1; )();", scriptName);
    chromeBrowser.EvaluateScriptAsync(script).ContinueWith(x =>
    
        var response = x.Result;
        if (response.Success && response.Result != null)
        
            dynamic result = response.Result;
            return ((int)result).ToString();
        
        else
        
            return string.Empty;
        
    );
    return string.Empty;

如果我使用注释行

//script = string.Format("(function myFunction()  document.getElementById('demo').innerHTML = \"0\"; return 1 + 1; )();", scriptName);

然后我得到了正确的结果 (2),但想法是使用网页上已经存在的 Javascript 函数。 函数内部的断点揭示了这一点:

我也试过

chromeBrowser.GetMainFrame().EvaluateScriptAsync(script)

但结果相同。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您得到的正是您所要求的,对函数的引用。您需要附加(); 才能实际执行该函数。

//Will return a IJavascriptCallback, which is effectively a function pointer, which is what you have asked for
await browser.EvaluateScriptAsync("myFunction"); 

//To execute the function you must append (); 
await browser.EvaluateScriptAsync("myFunction();") 

【讨论】:

以上是关于CefSharp 从现有的 Javascript 函数中获取结果的主要内容,如果未能解决你的问题,请参考以下文章

如何从现有的远程分支创建本地分支?

从现有的 JAVA Spring API 生成 YAML 文件

从现有的 docker 容器中删除端口绑定

从现有的 Xcode 项目制作 CocoaPod

从现有的 SwiftUI @States 派生绑定

tcpdf - 从现有的 PDF 文档开始