如何从电子中的webview.executeJavaScript获取返回值

bat*_*007 5 javascript preload electron

嗨,在我的项目中,我有三个js文件,main.js,browser.jsinject.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返回未定义的

ghy*_*ybs 9

不完全确定为什么要将JS代码注入WebView,但为什么不...确保它不是XY问题.

  1. webview.executeJavascript()方法不返回任何内容.您可以将回调作为第三个参数传递(下面有更多内容),但我认为它不会从执行的代码中收到任何内容.

  2. 在您注入的代码中,您创建一个将在页面就绪时执行的回调.因此,函数返回的任何内容(如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-网页视图的与电子的框架