我试图找出是否有可能。我遍历了GitHub示例https://github.com/chillitom/CefSharp,该示例为我提供了类的源代码(尽管我无法从此GITHUB构建CefSharp本身。

但是,我确实尝试了从该链接https://github.com/downloads/ataranto/CefSharp/CefSharp-1.19.0.7z下载二进制文件,然后通过引用这些示例构建了C#win32应用程序,运行相当顺利,大约8个小时后,我有了一个可以工作的嵌入式浏览器yipeee。但是,现在我要操纵DOM了-我读到您只能使用webView.EvaluateScript(“some script”);来完成此操作。和webView.ExecuteScript(“some script”);因为不能通过cefsharp直接进行DOM访问

所以我想找出的是。我可以调用jQuery方法吗?如果我已经加载的页面已经加载了jQuery,我可以在C#中执行以下操作吗?

webView.ExecuteScript("$(\"input#some_id\").val(\"[email protected]\")"));

当前,这引发了异常。我试图找出答案;我是否应该甚至尝试使用cefsharp DLL中的jQuery,还是必须坚持使用标准的老式JavaScript,这样我才能花5倍的时间来编写...?

我希望堆高机能提供一个答案。我已经尝试过针对cefsharp的Wiki和论坛,但是它们并没有提供很多线索。我发现的唯一示例是老式JavaScript。

最佳答案

是的,您可以使用jQuery,但是只有在DOM完全加载后才能使用它。为此,您需要使用WebView的PropertyChanged事件来检查IsLoading属性是否已更改为false以及IsBrowserInitialized属性是否设置为true。

下面是我在一个项目中的操作方式摘要。如您所见,一旦IsLoading属性更改,我便调用一些方法来设置WebView中的内容,这是通过在执行操作时通过ExecuteScript调用jQuery来完成的。

/// <summary>
/// Initialise the WebView control
/// </summary>
private void InitialiseWebView()
{
    // Disable caching.
    BrowserSettings settings = new BrowserSettings();
    settings.ApplicationCacheDisabled = true;
    settings.PageCacheDisabled = true;

    // Initialise the WebView.
    this.webView = new WebView(string.Empty, settings);
    this.WebView.Name = string.Format("{0}WebBrowser", this.Name);
    this.WebView.Dock = DockStyle.Fill;

    // Setup and regsiter the marshal for the WebView.
    this.chromiumMarshal = new ChromiumMarshal(new Action(() => { this.FlushQueuedMessages(); this.initialising = false; }));
    this.WebView.RegisterJsObject("marshal", this.chromiumMarshal);

    // Setup the event handlers for the WebView.
    this.WebView.PropertyChanged += this.WebView_PropertyChanged;
    this.WebView.PreviewKeyDown += new PreviewKeyDownEventHandler(this.WebView_PreviewKeyDown);

    this.Controls.Add(this.WebView);
}

/// <summary>
/// Handles the PropertyChanged event of CefSharp.WinForms.WebView.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The event arguments.</param>
private void WebView_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    // Once the browser is initialised, load the HTML for the tab.
    if (!this.webViewIsReady)
    {
        if (e.PropertyName.Equals("IsBrowserInitialized", StringComparison.OrdinalIgnoreCase))
        {
            this.webViewIsReady = this.WebView.IsBrowserInitialized;
            if (this.webViewIsReady)
            {
                string resourceName = "Yaircc.UI.default.htm";
                using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
                {
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        this.WebView.LoadHtml(reader.ReadToEnd());
                    }
                }
            }
        }
    }

    // Once the HTML has finished loading, begin loading the initial content.
    if (e.PropertyName.Equals("IsLoading", StringComparison.OrdinalIgnoreCase))
    {
        if (!this.WebView.IsLoading)
        {
            this.SetSplashText();
            if (this.type == IRCTabType.Console)
            {
                this.SetupConsoleContent();
            }

            GlobalSettings settings = GlobalSettings.Instance;
            this.LoadTheme(settings.ThemeFileName);

            if (this.webViewInitialised != null)
            {
                this.webViewInitialised.Invoke();
            }
        }
    }
}

关于c# - 我已经成功将CefSharp嵌入到.NET 4.0应用程序中。是否可以在DOM上使用jQuery调用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14962287/

10-13 06:26