- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用的是 <webview>
标记而不是 iFrame,但在 NWJS docs 上找不到更多详细信息, Electron docs , 也不是实际的 <webview>
docs围绕访问其中的内容。
我想检索 document.title
来自 <webview>
,并将其发送回主进程。
最佳答案
我使用的基本解决方案是在主进程和 <webview>
内部进行通信, 就是用Webview的 ContentWindow.postMessage()
方法。这与 window.postMessage()
非常相似.通过使用 postMessage()
—专门跟踪event.source
—我们在主进程和 <webview>
之间创建了一个通信桥梁.
const webview = document.getElementById('your-webview-element');
// <webview> Content is loaded
function contentload() {
// The following will be injected in the webview
const webviewInjectScript = `
var data = {
title: document.title,
url: window.location.href
};
function respond(event) {
event.source.postMessage(data, '*');
}
window.addEventListener("message", respond, false);
`;
webview.executeScript({
code: webviewInjectScript
});
}
// <webview> Loading has finished
function loadstop() {
webview.contentWindow.postMessage("Send me your data!", "*"); // Send a request to the webview
}
// Bind events
webview.addEventListener("contentload", contentload);
webview.addEventListener("loadstop", loadstop);
window.addEventListener("message", receiveHandshake, false); // Listen for response
function receiveHandshake(event) {
// Data is accessible as event.data.*
// This is the custom object that was injected during contentload()
// i.e. event.data.title, event.data.url
console.log(event.data)
// Unbind EventListeners
removeListeners();
}
// Remove all event listeners
function removeListeners() {
webview.removeEventListener("contentload", contentload);
webview.removeEventListener("loadstop", loadstop);
window.removeEventListener("message", receiveHandshake);
}
它是如何工作的(至少是我发现的一种方式):
<webview>
和窗口(稍后收听来自 <webview>
的消息)<webview>
元素加载一个 URL,它触发 contentload()
contentload()
将向 <webview>
中注入(inject)一个 EventListener并设置我们想要从 <webview>
内部获取的数据/DOM 元素.<webview>
完成加载,它触发 loadstop()
loadstop()
将向 <webview>
发送消息建立一座桥梁。重要的是要注意,这里我使用 webview.contentWindow.postMessage()
而不是 window.postMessage()
.<webview>
响应我们在第 1 步设置的数据<webview>
的响应(通过 EventListener“消息”) , 它会触发 receiveHandshake()
receiveHandshake()
内部您现在可以访问来自 <webview>
内部的数据.这可以是页面标题——或者您在 webviewInjectScript
中配置的任何内容.removeListeners()
删除我们设置的所有 EventListener,但您可以继续来回发送消息。仅供引用——在 Electron 和 NWJS 的上下文中,<webview>
标记允许您呈现网站(如 iframe),其好处是它在单独的进程中运行。这比一堆 iframe 的性能要好得多。 <webview>
包含一个标准的 HTML 文档,比 iframe 更复杂的是因为它在一个单独的进程中运行。
还有 another thread与其他一些解决方案一起使用,例如使用 IPC 消息和使用 preload
标签。
还有另一种方法更适合 Electron。在下面的代码中,我使用了 Vue (2) 和 Webpack,但与上述实现的主要区别是:
ipcRenderer
和 ipcMain
发送消息,而不是 postMessage
preload
加载注入(inject)脚本Webview 的属性,而不是使用 executeScript()
.我绑定(bind)了 :preload
Vue 计算属性 ( injectScript
) 的值,它返回外部 injectWebPageScript.js
的路径文件。组件/myComponent.vue
<template>
<webview ref="frame" class="frame" :preload="injectScript"/>
</template>
<script>
export default {
computed: {
injectScript() {
const appPath = require("electron").remote.app.getAppPath();
return `file://${require("path").resolve(
__dirname,
"../../mixins/injectWebPageScript.js"
)}`;
}
},
methods: {
mySiteLoaderScript(url) {
const frame = this.$refs.frame;
// Initialize event listeners on the Webview
addListeners();
// Set the URL, start loading
frame.setAttribute("src", url);
// Bind events
function addListeners() {
frame.addEventListener("dom-ready", contentloaded);
frame.addEventListener("ipc-message", receiveHandshake);
}
// Remove all event listeners
function removeListeners() {
frame.removeEventListener("dom-ready", contentloaded);
frame.removeEventListener("ipc-message", receiveHandshake);
}
// Once webview content is loaded, request its data
function contentloaded() {
frame.send("requestData");
}
// Triggered when we receive a response from the Webview
// This is the `ipc-message` event
function receiveHandshake(event) {
// Only listen to replyData messages
if (event.channel !== "replyData") return false;
const data = event.args[0];
const title = data.title;
const favicon = data.favicon;
// Remove listeners once data has been received
removeListeners();
}
}
},
mounted() {
this.mySiteLoaderScript("https://stackoverflow.com");
}
};
</script>
mixins/injectWebPageScript.js
const { ipcRenderer } = require("electron");
// Once the Webview's document has been loaded, notify the ipcRenderer
document.addEventListener("DOMContentLoaded", () => {
ipcRenderer.on("requestData", () => {
ipcRenderer.sendToHost("replyData", {
title: document.title,
url: window.location.href
});
});
});
关于webview - 如何访问 <webview> (Electron/NW.JS) 的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54155507/
随着 Chrome 网上应用店应用程序即将停用,我已经成功地将我的应用程序转换为 nw.js 我对它的简单性和第一次运行的方式感到惊讶。我遇到的唯一棘手的事情是如何让我的应用程序图标在 mac 上显示
我想在一个世界中构建多个随机子图。因为,一般来说,子图的数量是不固定的,我不想为每个子图使用不同的品种。到目前为止,我对“手工”随机网络使用了一种非常粗鲁的方法(见下文),将“我的组”变量分配给海龟。
我知道 nw.js 通常是为了在客户端加载 html,但它也可以指向一个网站并显示吗?当我将 package.json 中的“main”值设置为 google.com 之类的值时,它不起作用。 我正在
在 nwjs 中构建 Web 应用程序会导致无法访问位于程序目录中的文件(以及 app.nw 文件),并且将所有文件添加到 nw 包中并不是一个好主意,因为某些文件可能需要在运行时通过 IO 进行更改
如果这是一个愚蠢的问题,我预先道歉。 当调用 nw:weighted-path-to 时,会返回一个链接列表,描述起始海龟和目标海龟之间的最短路径。 类似地,调用 nw:turtles-on-weig
我原以为 Node Webkit 会让打包并作为单个可执行文件添加到 Windows 变得简单,但它似乎并没有,他们建议使用 https://github.com/evshiron/nwjs-buil
我觉得我错过了一些简单的东西。 我正在 nw.js 中开发一个“托盘”应用程序。为此,我将 "main" 设置为 package.json 中的 "main.js" 文件。在 main.js 中,我实
稍微简化一下,NW.js和Electron包含浏览器(Webkit,Chromium或其他)的一部分,并结合了JavaScript引擎(node.js,io.js或其他)。 我的问题是:里面有多少份V
在我的主脚本中: var renderer = require('./templates/renderTemplates.js'); function show(json){ renderer
我正在尝试使用 module.exports()在我的 NW.js 应用程序中创建一个新模块。 我有两个正在使用的文件: 索引.js const gkm = require('gkm'); //Thi
我很感兴趣,当我处于控制台模式时,如何在 emacs 中调整拆分窗口的大小? 我打开我的文件: emacs myfilename.txt -nw 现在,当我将窗口拆分为: C-x 2 或者 C-x 3
我的应用程序是使用占位符构建的,单击“加载”时会直接读取文件。 Load showthefile() 执行一些操作,然后调用... var keyMapLoc = '\\path\\to\\file.
我正在将 NW.js v0.12.3 迁移到新的 NW.js v0.17.3。在我的旧应用程序中,我曾经打开一个窗口来显示来电通知。如果用户接听电话或挂断电话,我会根据特殊的事件监听器关闭窗口。 这是
下面的代码可以使用F11热键,让浏览器窗口全屏,如何实现第二次按F11热键,恢复原来的窗口大小? nw.App.registerGlobalHotKey(new nw.Shortcut({
环境 NW.js v0.12.3(32 位) Windows 8 Webchimera.js (播放器)VLC 构建 (2.2.1) require-new 问题 新窗口从父窗口打开。 Webchim
我在使用 nw.js 时遇到了一些问题。我已经“谷歌化”了很多天(几周),但我找不到任何解决方案。因此,我使用 nw.js 作为客户端来连接到内部服务器。它的工作方式就像一个经典的网站。我们可以使用网
我正在使用 Node Webkit 创建桌面应用程序。我现在需要创建一个可执行文件,因此安装了以下文件:https://github.com/nwjs/nw-builder 我很难理解说明,尤其是命令
我需要从包围地面叠加层的矩形中获取 NW LatLng。使用 mOverlay.getBounds() 将使我在旋转之前得到我需要的点(getBounds 忽略旋转)。 这是地面叠加层,我需要的确切
讨论 NetWeaver 7.4 (CD261) 中新的 ABAP 编程功能的 SAP 官方演示文稿对表表达式进行了大量讨论,替换了从内部表读取的旧语法: READ TABLE lt_aufk INT
在我的 NW.js 应用程序中,我将一些数据存储在本地存储中。现在我想删除应用程序和本地存储数据。我将应用程序移至垃圾箱并清理它。此外,我删除了与位于 /Users//Library/Caches/
我是一名优秀的程序员,十分优秀!