解决iframe 上无法捕获父页面鼠标事件-mouseup

3,242 阅读1分钟

给一个元素添加 mousedown 事件开启可拖动,给 document 添加 mousemove 事件判断位置实现该元素鼠标跟随,给 document 添加mouseup 时取消拖拽, 但是鼠标滑动到到元素中间内嵌的到 iframe 上方时,会出现鼠标抬起也无法触发mouseup,从而出现鼠标未按下也一直能拖拽的bug。

解决方式1 给 iframe 添加样式

pointer-events是css3新增的属性,它可以让设置这个属性的元素无法侦听任何事件。 mousedownpointer-events: none,这样鼠标滑到iframe上方就无法继续拖动。从而实现类似于在iframe上松手也能触发mouseup 取消拖拽的功能。

function onMouseDown() {
	document.querySelector('iframe').style['pointer-events'] = 'none'
	// ...
}

function onMouseUp() {
	document.querySelector('iframe').style['pointer-events'] = 'auto'
	// ...
}

解决方式2 监听 iframe 内部的window

这个方案的思路是先获取iframe内部的window,然后监听window的相关鼠标事件,通过postMessage传给父级页面,然后父级页面做是否可以拖动的判断。

~~我的项目这样用这种方法写起来比较麻烦所以采用了解决方式1_(:з)∠)_。