最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

electron的webview和內(nèi)嵌網(wǎng)頁通信的方法

 更新時(shí)間:2024年04月15日 10:56:18   作者:yezi__626  
在 Electron 的世界里,webview 標(biāo)簽相當(dāng)于一個(gè)小盒子,里面可以裝一個(gè)完整的網(wǎng)頁,就像一個(gè)迷你瀏覽器,這篇文章主要介紹了electron的webview和內(nèi)嵌網(wǎng)頁如何通信,需要的朋友可以參考下

在 Electron 的世界里,webview 標(biāo)簽相當(dāng)于一個(gè)小盒子,里面可以裝一個(gè)完整的網(wǎng)頁,就像一個(gè)迷你瀏覽器。當(dāng)你想和這個(gè)小盒子里的內(nèi)容說話時(shí)(也就是進(jìn)行通信),這里有幾個(gè)方法可以幫你做到:
這里只寫了兩種方式,如果要是來找方案的客官。那直接看2就好。

1. 使用 preload 腳本

通過在 webview 標(biāo)簽中使用 preload 屬性來指定一個(gè)腳本,該腳本在網(wǎng)頁加載之前執(zhí)行,但在網(wǎng)頁的 JavaScript 環(huán)境中運(yùn)行。這允許在不暴露全部 Node.js API 的情況下,向網(wǎng)頁注入特定的 API 或者設(shè)置監(jiān)聽函數(shù)來實(shí)現(xiàn)雙向通信。

<webview id="foo" src="http://example.com" preload="path/to/preload.js"></webview>

在 preload 腳本中,你可以使用 ipcRenderer 和 contextBridge 來安全地暴露功能:

const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('electronAPI', {
    sendMessage: (message) => ipcRenderer.send('message-from-webview', message)
});
window.addEventListener('DOMContentLoaded', () => {
  // 從主進(jìn)程接收消息
  ipcRenderer.on('message-to-webview', (event, data) => {
    console.log(data);
  });
});

【該方法目前遇到問題如下:】
webview內(nèi)部頁面加載報(bào)錯(cuò):

2.postMessage

由于webview 標(biāo)簽創(chuàng)建了一個(gè)獨(dú)立的渲染進(jìn)程,它和主應(yīng)用的渲染進(jìn)程是隔離的。因此,webview 內(nèi)部的頁面擁有自己的全局 window 對(duì)象,你不能直接從外部的渲染進(jìn)程訪問 webview 內(nèi)的 window 對(duì)象。

當(dāng)你調(diào)用 webviewEl.executeJavaScript 方法時(shí),你實(shí)際上是在 webview 內(nèi)的上下文中執(zhí)行 JavaScript 代碼,因此可以通過注入腳本進(jìn)行交互。

(1)electron的App.tsx模塊發(fā)消息給webview內(nèi)的頁面:

const handleSendMessage = () => {
    if (webview.current) {
      const message = { type: 'messageFromElectron', text: '這里是electron發(fā)送的消息:electron->view' };
      const script = `window.postMessage(${JSON.stringify(message)}, '*')`;
      webview.current.executeJavaScript(script);
    }
  };

在webview內(nèi)的頁面接收:

mounted(){
  const handleWebviewMessage = (event) => {
    const message = event.data;
    if (typeof message === 'object' && message !== null) {
      switch (message.type) {
        case 'messageFromElectron':
          console.info('Electron的消息', message);
          break;
        default:
          console.warn('接收到未知類型的消息', message);
      }
    }
  };
  window.addEventListener('message',handleWebviewMessage); 
},

(2)webview內(nèi)的頁面發(fā)送消息給electron

 sendMessageToElectron(){
      window.postMessage({ type: 'messageFromView', text: 'Hello from Vue!' }, '*');
    },

electron的App.tsx接收:

const handleWebviewMessage = (event) => {
    const message = event.data;
    if (typeof message === 'object' && message !== null) {
      switch (message.type) {
        case 'messageFromView':
          console.info('這里是webview的消息:webview->electron', message);
          break;
        default:
          console.warn('接收到未知類型的消息', message);
      }
    }
  };
    useEffect(() => {
    	const webviewEl = webview.current;
   		const handleDomReady = () => {
      		// 為 webview 內(nèi)的 window 對(duì)象添加 message 事件監(jiān)聽器
      		webviewEl.executeJavaScript(`
     		 window.addEventListener('message', ${handleWebviewMessage.toString()})
    `);
    	};
    	if (webviewEl) {
      		webviewEl.addEventListener('dom-ready', handleDomReady);
   		 }
     // 清理工作
    	return () => {
      	if (webviewEl) {
        	// 移除之前添加的事件監(jiān)聽器,避免內(nèi)存泄漏
        	webviewEl.removeEventListener('dom-ready', handleDomReady);
      	}
    	};
  	}, []);

知識(shí)科普:
executeJavaScript

executeJavaScript 方法的主要作用是在瀏覽器環(huán)境中異步執(zhí)行 JavaScript 代碼。這個(gè)方法是 Electron 中
webContents 對(duì)象提供的一個(gè)功能,允許開發(fā)者在 web 頁面的上下文中運(yùn)行任意的 JavaScript 代碼字符串。

由于我使用的是react框架的ref來引用webview組件的,因此需要通過這個(gè)引用來獲取 webview 的 webContents,進(jìn)而使用 executeJavaScript 方法。
使用場(chǎng)景:
● 與頁面交互:你可以使用 executeJavaScript 來注入和執(zhí)行自定義腳本,從而與網(wǎng)頁中的 DOM 進(jìn)行交互,修改網(wǎng)頁內(nèi)容,或者觸發(fā)在網(wǎng)頁中定義的 JavaScript 函數(shù)。

webview.executeJavaScript('document.getElementById("myButton").click()');

● 獲取頁面信息:通過執(zhí)行返回值的 JavaScript 代碼,你可以獲取網(wǎng)頁中的數(shù)據(jù),比如頁面標(biāo)題、選定的文本或其他 DOM 元素的屬性。

webview.executeJavaScript('document.title')
  .then(title => {
    console.log(`The page title is ${title}`);
  });

● 網(wǎng)頁自動(dòng)化:可以用它來自動(dòng)化測(cè)試網(wǎng)頁的行為,例如自動(dòng)填充表單、點(diǎn)擊按鈕等。

webview.executeJavaScript(`
  document.getElementById('username').value = 'exampleUser';
  document.getElementById('password').value = 'examplePass';
  document.getElementById('login-form').submit();
`);

到此這篇關(guān)于electron的webview和內(nèi)嵌網(wǎng)頁通信的方法的文章就介紹到這了,更多相關(guān)electron webview通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript中的class類詳解

    JavaScript中的class類詳解

    JavaScript?中的類(Class)是一種新的語言特性,它讓我們可以使用面向?qū)ο缶幊痰乃枷雭砀臃奖愕亟M織和管理代碼。在本文中,我們將詳細(xì)介紹?JavaScript?中的類特性,感興趣的同學(xué)可以借鑒閱讀
    2023-05-05
  • JS實(shí)現(xiàn)unicode和UTF-8之間的互相轉(zhuǎn)換互轉(zhuǎn)

    JS實(shí)現(xiàn)unicode和UTF-8之間的互相轉(zhuǎn)換互轉(zhuǎn)

    需要將PC送過來的UTF-8轉(zhuǎn)換成UNICODE才能將內(nèi)容通過短信發(fā)送出去,同樣,接收到的短信為unicode編碼,也許轉(zhuǎn)換成UTF-8才能在PC端軟件顯示出來
    2017-07-07
  • JavaScript中Array.find()方法的使用與技巧

    JavaScript中Array.find()方法的使用與技巧

    在JavaScript中,Array.find是一個(gè)高效且易用的數(shù)組查找方法,和其他遍歷方法相比,Array.find不僅能更簡(jiǎn)潔地找到符合條件的第一個(gè)元素,返回的元素是原數(shù)組中的引用,本文給大家介紹了JavaScript中Array.find()方法的使用與技巧,需要的朋友可以參考下
    2025-02-02
  • js DOM的事件常見操作實(shí)例詳解

    js DOM的事件常見操作實(shí)例詳解

    這篇文章主要介紹了js DOM的事件常見操作,結(jié)合實(shí)例形式詳細(xì)分析了JavaScript DOM事件概念、原理及DOM操作常見實(shí)現(xiàn)技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • 如何寫一個(gè)通用的JavaScript效果庫!(2/2)

    如何寫一個(gè)通用的JavaScript效果庫!(2/2)

    如何寫一個(gè)通用的JavaScript效果庫!(2/2)...
    2007-04-04
  • JavaScript中apply方法的應(yīng)用技巧小結(jié)

    JavaScript中apply方法的應(yīng)用技巧小結(jié)

    這篇文章給大家總結(jié)了在js中apply方法的一些應(yīng)用技巧,通過這些技巧對(duì)大家日常的使用相信會(huì)有幫助,有需要的朋友們下面來一起看看吧。
    2016-09-09
  • 詳細(xì)聊聊瀏覽器是如何看閉包的

    詳細(xì)聊聊瀏覽器是如何看閉包的

    閉包實(shí)質(zhì)上是函數(shù)作用域的副產(chǎn)物,下面這篇文章主要給大家介紹了關(guān)于瀏覽器是如何看閉包的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • 判斷目標(biāo)是否是window,document,和擁有tagName的Element的代碼

    判斷目標(biāo)是否是window,document,和擁有tagName的Element的代碼

    判斷目標(biāo)是否是window,document,和擁有tagName的Element的代碼,需要的朋友可以參考下。
    2010-05-05
  • JavaScript編寫的網(wǎng)頁小游戲,很給力

    JavaScript編寫的網(wǎng)頁小游戲,很給力

    這篇文章主要介紹了JavaScript編寫的網(wǎng)頁小游戲,附上全部代碼供大家查看,實(shí)現(xiàn)了網(wǎng)頁的小游戲頁面,需要的朋友可以參考下
    2017-08-08
  • jszip插件實(shí)現(xiàn)圖片打包下載的方法分析

    jszip插件實(shí)現(xiàn)圖片打包下載的方法分析

    這篇文章主要介紹了jszip插件實(shí)現(xiàn)圖片打包下載的方法,結(jié)合實(shí)例形式分析了JavaScript使用jszip插件依據(jù)圖片列表打包下載zip壓縮文件的相關(guān)操作技巧,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

古浪县| 莱州市| 武山县| 景东| 苏尼特左旗| 科技| 日照市| 玉屏| 金山区| 鹤峰县| 九寨沟县| 清丰县| 两当县| 深州市| 安吉县| 嫩江县| 芜湖市| 鄂托克前旗| 牡丹江市| 枞阳县| 长子县| 白银市| 罗定市| 呼图壁县| 福贡县| 个旧市| 驻马店市| 新民市| 瓦房店市| 潼关县| 诸暨市| 麟游县| 彭泽县| 英吉沙县| 金平| 万州区| 周宁县| 太和县| 江油市| 宜黄县| 夹江县|