Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

鼠标进入信息卡片时,动态窗口被关闭 #96

Open
eligarfzzz opened this issue Dec 24, 2023 · 4 comments
Open

鼠标进入信息卡片时,动态窗口被关闭 #96

eligarfzzz opened this issue Dec 24, 2023 · 4 comments

Comments

@eligarfzzz
Copy link

2023-12-24.10.56.53-1.mov

从用户体验上说,鼠标进入信息卡片时保持动态窗口打开可能更合理

@gaogaotiantian
Copy link
Owner

是的,从功能上说是这样没错。但是实现上可能比较有难度,因为动态那个弹出框的判断是B站的逻辑,然后你进入信息卡片的时候可能就判断出那个框了。

@F-park
Copy link
Contributor

F-park commented Dec 30, 2023

是的,从功能上说是这样没错。但是实现上可能比较有难度,因为动态那个弹出框的判断是B站的逻辑,然后你进入信息卡片的时候可能就判断出那个框了。

解决方案

只完成了阻止弹出框收回,在弹出框外触发弹出框的 mouseleave 事件还是个问题。

let stopPropagation = ev => {ev.stopPropagation();}; // 阻止事件传播的函数
let dynamicPopup = document.querySelectorAll(".right-entry .v-popover-wrap")[3] // 找到动态弹出框的位置
dynamicPopup.addEventListener("mouseleave", stopPropagation, true) // 增加阻止弹出框触发 "mouseleave" 的事件

dynamicPopup.removeEventListener("mouseleave", stopPropagation, true) // 恢复弹出框的 "mouseleave" 事件

待解决的问题

如果离开 biliscope 卡片时在弹出框的外面,那就无法触发弹出框的 mouseleave 事件,导致弹出框无法收回。需要再用鼠标进去弹出框再出来才能触发收回,影响了用户体验。

待讨论的想法

我觉得可以在找到的 v-popover-wrap 里用绝对定位增加一个比 biliscope 卡片大一点的遮罩,那就可以正常触发弹出框的 mouseleave 事件了。

@eligarfzzz
Copy link
Author

eligarfzzz commented Jan 4, 2024

是的,从功能上说是这样没错。但是实现上可能比较有难度,因为动态那个弹出框的判断是B站的逻辑,然后你进入信息卡片的时候可能就判断出那个框了。

解决方案

只完成了阻止弹出框收回,在弹出框外触发弹出框的 mouseleave 事件还是个问题。

let stopPropagation = ev => {ev.stopPropagation();}; // 阻止事件传播的事件
let dynamicPopup = document.querySelectorAll(".right-entry .v-popover-wrap")[3] // 找到动态弹出框的位置
dynamicPopup.addEventListener("mouseleave", stopPropagation, true) // 增加阻止弹出框触发 "mouseleave" 的事件

dynamicPopup.removeEventListener("mouseleave", stopPropagation, true) // 恢复弹出框的 "mouseleave" 事件

待解决的问题

如果离开 biliscope 卡片时在弹出框的外面,那就无法触发弹出框的 mouseleave 事件,导致弹出框无法收回。需要再用鼠标进去弹出框再出来才能触发收回,影响了用户体验。

待讨论的想法

我觉得可以在找到的 v-popover-wrap 里用绝对定位增加一个比 biliscope 卡片大一点的遮罩,那就可以正常触发弹出框的 mouseleave 事件了。

如果可以直接删除v-popovermouseleave事件,会简单很多,在DevTool里手动删掉,popup确实就不关闭了
image

查了一下,chrome extension提供了chrome.debuggerDOMDebugger.getEventListeners, 可以获取到DOM的EventListeners

另一种获取EventListener的方式是修改DOM的prototype,把Listener缓存下来,不过需要在bilibili页面加载前执行
https://stackoverflow.com/a/6434924/14124032

@F-park
Copy link
Contributor

F-park commented Jan 5, 2024

查了一下,chrome extension提供了chrome.debuggerDOMDebugger.getEventListeners, 可以获取到DOM的EventListeners

getEventListeners 这个函数,浏览器扩展是用不了的,因为它只能在浏览器的控制台(devtools)里使用。

另一种获取EventListener的方式是修改DOM的prototype,把Listener缓存下来,不过需要在bilibili页面加载前执行 https://stackoverflow.com/a/6434924/14124032

在 b 站页面加载之前, 目标 DOM 元素都不存在,怎么缓存 Listener ?这个方案看起来不可行。


感觉最好的方式还是我写的这三行代码,可以实现动态阻止事件运行。

let stopPropagation = ev => {ev.stopPropagation();}; // 阻止事件传播的函数
let dynamicPopup = document.querySelectorAll(".right-entry .v-popover-wrap")[3] // 找到动态弹出框的位置
dynamicPopup.addEventListener("mouseleave", stopPropagation, true) // 增加阻止弹出框触发 "mouseleave" 的事件

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants