我已成功将CefSharp嵌入到.NET 4.0应用程序中。是否有可能让jQuery调用在DOM上运行?

时间:2013-02-19 16:21:37

标签: c# jquery cefsharp

我试图找出这是否可能。我已经通过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(\"user@example.com\")"));

目前这会引发异常。我想找出来;我是否应该尝试使用cefsharp DLL中的jQuery,或者我是否必须坚持标准的旧学校JavaScript,这将花费我5倍的时间来写...?

我希望堆叠器有答案。我已经为cefsharp尝试了wiki和论坛,但是他们并没有提供太多的线索;我发现的唯一例子是旧式JavaScript。

2 个答案:

答案 0 :(得分:6)

是的,您可以使用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();
            }
        }
    }
}

答案 1 :(得分:1)

您在评论中更明确地说,您要做的是将jQuery加载到尚未拥有它的页面中。 int0x90关于在jQuery源的本地副本上运行ExecuteScript的建议可能对你有用。我想提醒你,很多页面都不会兼容他们的作者从未放过的所有额外的JS。两个很好的例子是谷歌和Facebook。这两个都定义了一个不是jQuery $的{​​{1}}运算符,因此踩踏它几乎肯定会破坏它们。

底层CEF库暴露了许多直接操作C ++中DOM元素的方法,CefSharp尚未公开,因为对它们的需求还不多。听起来这真的是你想要在这里使用的东西。如果你看一下CefSharp源代码,那么暴露它们可能不是太多的工作,但我还没有尝试过。如果您想尝试,也可以将问题发布到https://groups.google.com/forum/#!forum/cefsharp