как получить возвращаемое значение из webview.executeJavaScript в электронном виде

1

Привет всем в моем проекте у меня есть три js файла, main.js, browser.js и inject.js, в browser.js я реализовал все действия с кликом, связанные с моим веб-просмотром и многими функциями, из этого у меня есть действие click получить имя пользователя с веб-страницы, загружаемой в веб-просмотр, для того, что я создал функцию в файле inject.js, чтобы получить содержимое и элементы со страницы, я получил значение в файлах Inject.js, но в файлах Browser.js я получаю неопределенные значения

здесь мой пример кода:

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 возвращает Undefined values

Теги:
electron
preload

1 ответ

4
Лучший ответ

Не совсем понятно, почему вы прибегаете к внедрению JS-кода в WebView, но почему бы и нет... Убедитесь, что это не проблема XY.

  1. webview.executeJavascript() ничего не возвращает. Вы можете передать обратный вызов как третий аргумент (подробнее об этом ниже), но я не думаю, что он получил что-либо из исполняемого кода.

  2. В введенном коде вы создаете обратный вызов, который будет выполнен на странице готов. Поэтому все, возвращаемое вашей функцией (например, ваша переменная url), не будет затронуто кодом обратного вызова. Убедитесь, что вы понимаете, как вернуть ответ от асинхронного вызова?

Если я правильно понимаю, вы пытаетесь отменить некоторые данные на своей внедренной странице и отправить их обратно в свой Renderer (браузер).

Более подходящим способом достижения этого результата было бы использовать атрибут preload для электрона <webview>:

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

В inject.js вы можете require(electron) и использовать электронную схему IPC (electron.ipcRenderer) для связи между Webview ( ipcRendrer.sendToHost()) и "родительским" Renderer. У вас есть простой пример: 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')
})

Вы должны уметь находить более подробные учебные пособия для такой коммуникации между Renderer и веб-просмотром, например https://ourcodeworld.com/articles/read/201/how-to-send-retrieve-information-and-manipulate-the- дом-с-а-WebView-с-электрон-структуры

Ещё вопросы

Сообщество Overcoder
Наверх
Меню