2017-10-27 3 views
-1

hallo alle in meinem Projekt i drei js Dateien haben, main.js, browser.js und inject.js, in browser.js i habe alle Click-Aktionen im Zusammenhang mit meinem Webview und vielen Funktionen implementiert, von diesem habe ich eine Click-Aktion, um Benutzername von der Webseite zu erhalten, die in Webview geladen wird, für die ich eine Funktion in inject.js erstellt habe, um Inhalte und Elemente zu erhalten die Seite Ich habe den Wert in Inject.js Dateien, aber in Browser.js Dateien ich bekomme g undefinierte Wertewie Rückgabewert von webview.executeJavaScript in Elektron bekommen

hier mein Beispielcode:

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; 


}, 

Werte in inject.js genannt zu werden, aber browser.js gibt undefiniert Werte

Antwort

2

Nicht ganz sicher, warum Sie JS-Code in ein WebView greifen zu injizieren, aber warum nicht ... Achten Sie darauf, es nicht ein XY problem ist.

  1. webview.executeJavascript() Methode gibt nichts zurück. Sie können einen Callback als 3. Argument übergeben (mehr dazu unten), aber ich denke nicht, dass es irgendetwas vom ausgeführten Code erhält.

  2. In Ihrem injizierten Code erstellen Sie einen Rückruf, der auf Seite bereit ausgeführt wird. Daher ist alles, was von Ihrer Funktion zurückgegeben wird (wie Ihre url Variable), noch nicht vom Rückrufcode betroffen. Stellen Sie sicher, dass Sie verstehen How to return the response from an asynchronous call?

Wenn ich richtig verstehe, Sie versuchen, einige Daten auf eingebettete Seite verschrotten, und schicken Sie es zurück zu Ihrem Renderer (Browser).

Ein geeigneter Weg, um dieses Ergebnis zu erreichen, wäre das preload Attribut des Elektrons verwenden <webview>:

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

In inject.js können Sie require(electron), und verwenden Sie das Elektron IPC-Schema (electron.ipcRenderer) zwischen dem kommunizieren Webview (ipcRendrer.sendToHost()) und der "Eltern" -Renderer. Sie haben ein einfaches Beispiel gibt: 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') 
}) 

sollten Sie in der Lage sein, mehr detaillierte Anleitungen für eine solche Kommunikation zwischen einem Renderer und einem Webview zu finden, zum Beispiel https://ourcodeworld.com/articles/read/201/how-to-send-retrieve-information-and-manipulate-the-dom-from-a-webview-with-electron-framework