bat*_*007 5 javascript preload electron
嗨,在我的项目中,我有三个js文件,main.js,browser.js和inject.js,在browser.js中,我实现了与我的webview相关的所有点击操作和许多功能,从这里我有点击动作到从在webview中加载的网页获取用户名,我在inject.js中创建了一个函数,从页面获取内容和元素,我在Inject.js文件中得到了值,但是在Browser.js文件中我得到了未定义的值
这是我的示例代码:
browser.js
var proName = webview.executeJavaScript('__myInjection.profileName()');
Run Code Online (Sandbox Code Playgroud)
inject.js
profileName : function (){
var recordArray = []
var url
var script = document.createElement("script");
script.src = require('./jquery-3.2.1.min.js');
$(document).ready(function() {
url = $("[data-control-name='identity_profile_photo']").attr("href");
alert(url)
});
return url;
},
Run Code Online (Sandbox Code Playgroud)
在inject.js中调用的值,但browser.js返回未定义的值
不完全确定为什么要将JS代码注入WebView,但为什么不...确保它不是XY问题.
webview.executeJavascript()方法不返回任何内容.您可以将回调作为第三个参数传递(下面有更多内容),但我认为它不会从执行的代码中收到任何内容.
在您注入的代码中,您创建一个将在页面就绪时执行的回调.因此,函数返回的任何内容(如url变量)都不会受到回调代码的影响.确保您了解如何从异步调用返回响应?
如果我理解正确,您将尝试废弃嵌入页面上的某些数据,并将其发送回渲染器(浏览器).
实现这一结果的更合适的方法是使用preload电子的属性<webview>:
<webview src="urlToGuestPage" preload="./inject.js"></webview>
Run Code Online (Sandbox Code Playgroud)
在inject.js,您可以require(electron)使用电子IPC方案(electron.ipcRenderer)在Webview(ipcRendrer.sendToHost())和"父"渲染器之间进行通信.你有一个简单的例子:https://electron.atom.io/docs/api/webview-tag/#event-ipc-message
// In embedder page. (parent Renderer / browser.js)
const webview = document.querySelector('webview')
webview.addEventListener('ipc-message', (event) => {
console.log(event.channel)
// Prints "pong"
})
webview.send('ping')
// In guest page. (preload script for the webview / inject.js)
const {ipcRenderer} = require('electron')
ipcRenderer.on('ping', () => {
ipcRenderer.sendToHost('pong')
})
Run Code Online (Sandbox Code Playgroud)
您应该能够在渲染器和Web视图之间找到更详细的此类通信教程,例如https://ourcodeworld.com/articles/read/201/how-to-send-retrieve-information-and-manipulate-the- DOM-从-A-网页视图的与电子的框架