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

时间:2017-10-27 06:06:53

标签: javascript electron preload

大家好我的项目中我有三个js文件, main.js browser.js inject.js ,在 browser.js 我已经实现了与我的webview和许多功能相关的所有点击操作,从这里我有一个点击动作来从webview中获取用户名,因为我在 inject.js 从页面获取内容和元素我在 Inject.js 文件中获得了值但在 Browser.js 文件中我得到了未定义的值< / p>

这里是我的示例代码:

  

browser.js

var proName = webview.executeJavaScript('__myInjection.profileName()');
  

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;


},

在inject.js中调用的值,但browser.js返回未定义

1 个答案:

答案 0 :(得分:7)

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

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

  2. 在您注入的代码中,您创建一个将在页面就绪时执行的回调。因此,函数返回的任何内容(如url变量)都不会受到回调代码的影响。确保您了解How to return the response from an asynchronous call?

  3. 如果我理解正确,您正在尝试废弃嵌入式页面上的某些数据,并将其发送回渲染器(浏览器)。

    实现此结果的更合适方法是使用电子<webview>的{​​{3}}属性:

    <webview src="urlToGuestPage" preload="./inject.js"></webview>
    

    inject.js中,您可以require(electron),并使用电子IPC计划(electron.ipcRenderer)在Webviewpreload)和&之间进行通信#34;父&#34;渲染器。你有一个简单的例子:ipcRendrer.sendToHost()

    // 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')
    })
    

    您应该能够在渲染器和网页浏览之间找到更详细的教程,例如: https://electron.atom.io/docs/api/webview-tag/#event-ipc-message