Energy GUI桌面應(yīng)用開發(fā)之js和go之間交互示例
Go  /  管理員 發(fā)布于 10個月前   474
在energy開發(fā)桌面應(yīng)用中,我們想快速的實現(xiàn) JS 代碼和 Go 代碼互通,
在開發(fā)原始 web 應(yīng)用時一搬使用 http 或 websocket 達(dá)到數(shù)據(jù)交互。
在 energy 中提供了一套事件驅(qū)動機(jī)制,很容易使 JS 和 Go 交互,且不需要額外開啟接口服務(wù)。
ipc, 基于 CEF 實現(xiàn)的事件綁定機(jī)制
在 Go 中使用 ipc.On 監(jiān)聽一個事件,ipc.Emit 觸發(fā)一個事件。
在 JS 中使用 ipc.on 監(jiān)聽一個事件,ipc.emit 觸發(fā)一個事件。
Go監(jiān)聽事件
ipc.On("goOnEventName", func() {
// ....
})
JS監(jiān)聽事件
ipc.on("jsONEventName", func() {
// ....
})
Go觸發(fā)JS事件
ipc.emit("goOnEventName")
上面的事件監(jiān)聽和觸發(fā)是可以傳遞參數(shù)和接收返回值
帶有參數(shù)和返回值,我們只需要按定義規(guī)則即可傳遞和接收返回值
Go監(jiān)聽事件
ipc.On("goOnEventName", func(inArgs1 int, inArgs2 string) string {
// ....
return inArgs2
})
JS監(jiān)聽事件
ipc.on("jsONEventName", function(inargs1, inArgs2) {
// ....
return inArgs2
})
Go觸發(fā)JS事件
ipc.EmitAndCallback("jsONEventName", []any{100, "張三"}, func(result string){
//...
})
JS觸發(fā)Go事件
ipc.emit("goOnEventName", [100, '李四'], function(result){
//...
})
完整代碼示例
Go部分
package main
import (
"embed"
"fmt"
"github.com/energye/energy/v2/cef"
"github.com/energye/energy/v2/cef/ipc"
"github.com/energye/energy/v2/examples/common"
_ "github.com/energye/energy/v2/examples/syso"
"github.com/energye/energy/v2/pkgs/assetserve"
"github.com/energye/golcl/lcl"
)
//go:embed resources
var resources embed.FS
func main() {
cef.GlobalInit(nil, resources)
cefApp := cef.NewApplication()
port := common.Port()
cef.BrowserWindow.Config.Url = fmt.Sprintf("http://localhost:%d/ipc.html", port)
cef.BrowserWindow.Config.Title = "Energy IPC"
// 監(jiān)聽一個事件 goOnEventName
ipc.On("goOnEventName", func(inArgs1 int, inArgs2 string) string {
fmt.Println("JS傳遞的參數(shù):", inArgs1, inArgs2)
return inArgs2
})
// 主窗口初始化回調(diào)
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, window cef.IBrowserWindow) {
lclWindow := window.AsLCLBrowserWindow().BrowserWindow()
lclWindow.SetWidth(350)
lclWindow.SetHeight(300)
// 創(chuàng)建一個系統(tǒng)原生按鈕button, 來模擬事件觸發(fā)
button := lcl.NewButton(lclWindow)
button.SetParent(lclWindow)
button.BringToFront()
button.SetCaption("觸發(fā)JS監(jiān)聽的事件")
button.SetLeft(100)
button.SetTop(100)
button.SetWidth(150)
button.SetHeight(50)
button.SetOnClick(func(sender lcl.IObject) {
// 觸發(fā)JS監(jiān)聽的事件 jsONEventName
ipc.EmitAndCallback("jsONEventName", []any{100, "張三"}, func(result string) {
fmt.Println("JS的返回值:", result)
})
})
})
// 主進(jìn)程啟動后回調(diào)
cef.SetBrowserProcessStartAfterCallback(func(b bool) {
//通過內(nèi)置http服務(wù)加html載資源
server := assetserve.NewAssetsHttpServer()
server.PORT = port
server.AssetsFSName = "resources" //必須設(shè)置目錄名
server.Assets = resources
go server.StartHttpServer()
})
//運(yùn)行應(yīng)用
cef.Run(cefApp)
}
HTML + JavaScript 部分
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="application/javascript">
// 監(jiān)聽一個事件 jsONEventName
ipc.on("jsONEventName", function(inargs1, inArgs2) {
// ....
console.log('Go傳遞的參數(shù):', inargs1, inArgs2)
return inArgs2
})
function jsEmitGoEvent() {
// 觸發(fā)Go中監(jiān)聽的事件 goOnEventName
ipc.emit("goOnEventName", [100, '李四'], function(result){
//...
console.log('Go的返回值:', result)
})
}
</script>
</head>
<body style="margin: 0px;padding: 0px;">
<button onclick="jsEmitGoEvent()" style="margin-left: 100px;height: 50px;">觸發(fā)Go監(jiān)聽的事件</button>
</body>
</html>
運(yùn)行演示結(jié)果
123 在
Clash for Windows作者刪庫跑路了,github已404中評論 按理說只要你在國內(nèi),所有的流量進(jìn)出都在監(jiān)控范圍內(nèi),不管你怎么隱藏也沒用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最簡單的方法中評論 好久好久都沒看友情鏈接申請了,今天剛看,已經(jīng)添加。..博主 在
佛跳墻vpn軟件不會用?上不了網(wǎng)?佛跳墻vpn常見問題以及解決辦法中評論 @1111老鐵這個不行了,可以看看近期評論的其他文章..1111 在
佛跳墻vpn軟件不會用?上不了網(wǎng)?佛跳墻vpn常見問題以及解決辦法中評論 網(wǎng)站不能打開,博主百忙中能否發(fā)個APP下載鏈接,佛跳墻或極光..路人 在
php中使用hyperf框架調(diào)用訊飛星火大模型實現(xiàn)國內(nèi)版chatgpt功能示例中評論 教程很詳細(xì),如果加個前端chatgpt對話頁面就完美了..
Copyright·? 2019 侯體宗版權(quán)所有·
粵ICP備20027696號