【问题标题】:Is Javascript the only choice for DOM interaction when embedding a web browser?嵌入网络浏览器时,Javascript 是 DOM 交互的唯一选择吗?
【发布时间】:2015-01-11 11:34:58
【问题描述】:

我研究了将 Web 浏览器嵌入到应用程序中的各种方法(例如通过特定于操作系统的方式的 IE 或 Safari,或通过 XULRunner 的 Firefox/Mozilla,或通过 Chromium 嵌入式框架的 Chrome)并且我已经管理将 CEF 与我的应用程序集成到我确信它会按预期工作的程度。现在,在我看来,每当我想修改 DOM(例如添加或删除元素)时,我都必须通过 Javascript 来执行此操作,即我的应用程序调用实际工作完成的 Javascript。

我想知道为什么会这样。我的(天真?)信念是,例如,如果我在 Javascript 中调用 appendChild,附加孩子的实际“工作”最终将由 C/C++ 函数执行,因为浏览器本身是用 C/C++ 编写的,而不是在 Javascript 中。所以,我想知道为什么在嵌入式网络浏览器中我不能直接调用这个 C/C++ 函数而不是通过 Javascript。我知道对于一般脚本,出于安全原因,您不需要除 Javascript 之外的其他语言,但如果浏览器嵌入到我可以控制的应用程序中,这不应该是原因,不是吗?

我错过了什么?

【问题讨论】:

  • 例如在 IE 中,您可以在 BHO 中编写代码,使用 C++ 和 C# 以及任何其他 .net 语言与 DOM 交互。在 Chrome 中,您可以通过 Native Client 使用 C 和 C++。不要期望其中任何一个会更快 - 毕竟 DOM 在 JavaScript 中非常快,并且有一些库可以像 React 一样快速维护虚拟 dom 并进行批量更新。
  • 你这样做的目的是什么?
  • 你真的以为,研究各个浏览器的C++源码,阅读规范,调用函数(每个浏览器不同,每个版本的浏览器可能会有变化),比调用JS容易吗? ,所有浏览器都一样吗?就像你想在商店里买东西,而你的房子在商店后面,所以你希望老板让你从窗户爬进来,而不是绕着商店走。
  • @IvanKuckir:DOM 是一种与语言无关的标准。以this Java package 为例。

标签: javascript dom xulrunner chromium-embedded


【解决方案1】:

CEF 实现为 Chromium 的 content api 和您的应用程序之间的层。使用 CEF 时,Chromium 是 CEF 中的一个库,您只能访问 CEF 的公共 API,它或多或少受限于任何 chromium 内容 api 所利用的内容(请记住,没有浏览器被创建为可嵌入插件,然后演变成应用程序,总是相反)。内容 API 是谷歌工程师必须将某些形式的内省形式化的方式,但它们并没有完成,因为浏览器本身并不是完全模块化的。铬代码的工作正在进行中,以将特定的“全能”组件分离为您可以随意选择的更通用的组件。

因此,在使用 CEF 时,您不能简单地挂钩 chromium 的实现细节:您需要对其进行修补以实现它自身不公开的东西。 CEF 实现了一个用于 DOM 遍历的类(请参阅here),但您只能选择 DOM,而不能更改它。

也就是说,在 C++ 方面,您可以执行一些任意操作,例如检查/修改 http 请求(例如,这允许您将 javascript 注入页面),以及直接从 C++ 运行任意 javascript 代码,这可以通过轮到自己了,通过不同的路径异步回调 C++ 代码(ajax -> C++ 中的 http 处理,或您可以直接在 C++ 中编码的 V8 扩展。

更多详情请见https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration

可以自定义 CEF 或直接使用 chromium 源代码,但那东西很大。我听说的其他解决方案在 API 限制方面或多或少相似,即AwesomiumMozilla's Gecko 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2013-12-25
    • 2011-03-15
    相关资源
    最近更新 更多