electron 添加事件,可用于监听< webview>上的鼠标和滚动事件,

t1rydlwq  于 6个月前  发布在  Electron
关注(0)|答案(8)|浏览(76)

您的功能请求是否与问题相关?请描述。

从Electron 3.0.0 beta 6开始,鼠标、键盘和滚动事件等不再能够被监听。然而,在那个问题中,"bpasero"使用了"before-input-event"事件来创建一个模拟的按键。由于已经存在一个输入事件。

描述您希望的解决方案

我建议添加"before-mouse-event"和"before-scroll-event",以便有一个一致的解决方案来解决这个回归问题。

rseugnpd

rseugnpd1#

关于这个问题,我越想越觉得,没有内置的方法来捕获这些常见的DOM事件,反而鼓励了一种不安全的做法,即向第三方网站注入代码以获取访问权限。这些DOM事件应该提供给electron,以减少可利用的electron应用程序的数量。
在我看来,ipcRenderer/executeJavascript应该只在应用程序构建器对网页内容有100%控制的情况下使用。对于其他情况没有安全选项,只会加剧安全问题。
@buffet-time 你对你的PR有任何反馈吗?

yfjy0ee7

yfjy0ee72#

这是如何让我的渲染器与主线程通信的方式:

// main.js where new BrowserView
webPreferences: {
        preload: 'absolute/path/to/preload.js',
        contextIsolation: true
}
const session = webContents.session
session.setPreloads(_.uniq([ ...session.getPreloads(), sPathPreload ]))

ipcMain.on('chanel', (ipcEvent)=>{
  ipcEvent.sender // has good stuff
})

// preload.js
const { ipcRenderer, contextBridge } = require('electron')
ipcRenderer.send('chanel', data)
contextBridge.exposeInMainWorld('$main', someApiToMain) // thats only for local pages not external websites

window.addEventListener('blur', () => {
  ipcRenderer.send('blur')
})

window.addEventListener('focus', () => {
  ipcRenderer.send('focus')
})

尽管我确实同意这种方式感觉有些hacky,但是在预加载脚本中注入它,我还是稍微放心了一些。我的第一种方法是在webContents上寻找'blur'或'focus'事件。那里并没有这些事件,这让我觉得有些奇怪,因为有.isFocused()方法。我花了几个小时才弄明白基本的DOM事件。

jljoyd4f

jljoyd4f3#

你好!感谢在这里发布第一个问题!如果你在报告一个🐞 bug,请确保你包括重现它的步骤。我们在这个仓库里收到了很多问题,所以请耐心等待,我们会尽快回复你。
为了帮助我们更容易地调查你的问题,请按照 contributing guidelines 进行操作。

jaql4c8m

jaql4c8m4#

你好,由于仍然只有'before-input-event',你是否找到了一种不同的方法来监听鼠标和滚动事件?
我正在尝试监听BrowserView内部的内容的鼠标事件,但陷入了困境。任何指导或帮助都将不胜感激。

cig3rfwq

cig3rfwq5#

很遗憾,不行。我尝试使用ipcRenderer.sendToHost()和eventListeners代理它们,但没有成功。
以下是我在预加载中放入的内容,但不幸的是,这不起作用。
对我来说,能够找到一个解决鼠标和滚动事件的绕过方法会非常有益...

zaq34kh6

zaq34kh66#

在@buffet-time,我成功地使用注入到BrowserView的webPreference中的预加载脚本捕获了鼠标事件。然后我使用IPC将其传输到主进程。

document.addEventListener('click', (event) => {
  ipcRenderer.send('some-key', {event.clientX, event.clientY});
});

现在剩下的问题是安全性。即使将nodeIntegration设置为false,使用预加载脚本的做法仍有争议。你知道这是一种好方法吗?

lsmepo6l

lsmepo6l7#

@kevinsawicki@poiru
@zcbenz@codebytere@MarshallOfSound

是否合理地模拟 a3b65ad,并制作 "before-mouse-event" 和 "before-scroll-event" 事件,以便在通过 webcontents 从 webviews 中获取滚动和鼠标事件时,无需在预加载中手动代理事件。也就是说,我是否可以做到这一点,并提交 PR 以将此功能引入 Electron?

puruo6ea

puruo6ea8#

对于我正在进行的一个项目,我想在JavaScript可能被禁用的沙箱环境中跟踪webContents中的鼠标/手势事件。出于安全原因,我完全不使用预加载,也不希望这样做。

当JavaScript在视图中启用时,我可以使用webContents.executeJavaScript(..)来跟踪某些元素上的鼠标事件。然后我在事件上发送一个控制台日志并捕获它以获取事件。我这样做是为了避免在安全视图中引入ipcRenderer/remote。

但这是一个非常丑陋的“hack”,也是对控制台作为通信媒介的滥用。我尝试在MouseEvent上分派一个KeyboardEvent,以便不使用控制台,但似乎无法通过“before-input-event”捕获,因为分派的KeyboardEvent不受信任。无论如何,我不喜欢以这种方式将脚本注入第三方网站,当然,如果视图中的JavaScript被禁用,它也不会起作用。

相关问题