如何制作iframe点击,但是iframe的正文仍然可以点击?
我试过了:
iframe.style.width = '100%'
iframe.style.height = '100%'
iframe.style.display = 'block'
iframe.style.position = 'fixed'
iframe.style.backgroundColor = 'transparent'
iframe.style.pointerEvents = 'none'
iframe.style.border = '0'
iframe.frameborder = '0'
iframe.scrolling = 'no'
iframe.allowTransparency = 'true'
在我的I帧内部我正在使用以下css:
html, body {
/* background:none transparent; */
pointer-events:auto;
}
这导致身体可见(这就是我想要的),但它像iframe的其余部分一样是点击式的。我希望iframe的主体可以点击,但实际的iframe元素的其余部分应该是点击式的。
iframe总是比它里面的身体大。
不幸的是我无法从主站点访问iframe内容(因此无法访问scrollHeight等),我只能更改其实际的源代码。
答案 0 :(得分:7)
免责声明: OP大约在两年前就提出了这个问题,在我回答伊恩·怀斯(Ian Wise)提出问题并对其进行详细阐述之后(见评论)。
您在此处描述的内容涉及文档和子文档之间的逻辑:“如果单击事件在子文档中没有任何作用,请将该单击事件应用于父文档”,因此无法使用使用HTML / CSS。
iframe是不同的文档。它们确实与容器具有子代关系,但iframe中发生的事件将由iframe处理。
需要一些代码但可以起作用的想法:
function clickOnCover(e, i) {
if(e && e.preventDefaule) e.preventDefault();
if(i && i >= iframes.length) {
console.log("No action.");
return;
}
var iframe = iframes[i || 0];
if(iframe.contentWindow && iframe.contentWindow.postMessage) {
iframe.contentWindow.postMessage({ x: e.clientX, y: e.clientY, i: i });
}
}
function iframeResponse(e) {
var response = e.data, iframeIndex = response.i;
if(response.success)
console.log("Action done on iframe index -> " + iframeIndex);
else
clickOnCover({ clientX: response.x, clientY: response.y }, iframeIndex+1);
}
clientX, clientY
并检查该位置可能的活动的函数(可能很棘手!)。
window.addEventListener("message", function(e) {
// Logic for checking e.x & e.y
e.success = actionExists; // Some indicator if an action occurred.
if(window.parent && window.parent.postMessage) {
window.parent.postMessage(e);
}
});
此解决方案将继续在父文档中管理事件,并且仅需要遍历任意数量的堆叠iframe。
找到了一个相关的特殊问题,以进一步支持我的主张:Detect Click in Iframe
答案 1 :(得分:6)
这在CSS中是不可能的。
最简单的方法是正确调整iframe的大小。假设您有权访问iframe内容,则可以采用以下解决方案:
您可以添加一些JS,以允许父页面知道iframe的高度
mainpage.js
var iframe = getIframe();
setIntervalMaybe(() => {
// ask for size update
iframe.contentWindow.postMessage({action: "getSize"}, document.location.origin);
}, 100)
window.addEventListener("message", function receiveMessage(event) {
switch(event.data.action) {
case "returnSize":
// updateIFrameSize(event.data.dimensions);
console.log(event.data.dimensions);
break;
}
}, false);
iframe.js
window.addEventListener("message", function receiveMessage(event) {
switch(event.data.action) {
case "getSize":
event.source.postMessage({action: "returnSize", dimensions: {
width: document.body.offsetWidth,
height: document.body.offsetHeight
}}, event.origin);
break;
}
}, false);