我已经成功地将CefSharp嵌入到.NET 4.0应用程序中.是否可以让jQuery调用在DOM上工作
本文关键字:是否 jQuery 调用 工作 DOM 应用程序 成功 CefSharp NET | 更新日期: 2023-09-27 18:00:19
我正在努力找出这是否可能。我已经看过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("一些脚本");和webView.ExecuteScript("一些脚本");由于无法通过cefsharp 直接访问DOM
所以我想知道的是,我可以调用jQuery方法吗?如果我加载的页面已经加载了jQuery,我可以在c#中执行以下操作吗?
webView.ExecuteScript("$('"input#some_id'").val('"user@example.com'")"));
目前,这引发了一个异常。我正在努力寻找答案;我是否应该尝试使用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();
}
}
}
}
您在注释中更清楚地表明,您想要做的是将jQuery加载到一个还没有它的页面中。int0x90关于在jQuery源的本地副本上运行ExecuteScript
的建议可能对您有用。不过,我想提醒你,许多页面不会与作者从未放在那里的所有额外JS兼容。谷歌和脸书就是两大例子。这两个都定义了一个$
运算符,而不是jQuery $
,所以践踏它几乎肯定会破坏它们。
底层的CEF库公开了许多从C++直接操作DOM元素的方法,而CefSharp还没有公开这些方法,因为对它们的需求还不多。不过,这听起来确实是你想要在这里使用的。如果你看看CefSharp的消息来源,揭露它们可能不需要太多的工作,但我自己还没有尝试过。如果你想尝试,你也可以将问题发布到https://groups.google.com/forum/#!论坛/cefsharp