目录
前言
提示:这里可以添加本文要记录的大概内容:
在我们新的需求中,需要用到一个外部的界面用于实现数据可视化监控功能,通过嵌入外部的grafana界面实现。需要对这个iframe的url和内部DOM进行操作。iframe的url通过第一次进入界面,请求后端接口拿到。
提示:以下是本篇文章正文内容,下面案例可供参考
1、iframe的url是动态变化的,我在vue界面怎么拿到这个动态的url
用户在当前iframe界面操作之后,url会随之变化,那我们怎么拿到这个动态的url尼?
首先,需要明白的是,iframe嵌入的界面,我们想拿到里面的动态变化的url,是需要访问iframe的location.href,但是由于同源策略,我们这个地方是跨域的,所以拿不到,第一个问题就是解决跨域,后端通过配置将iframe的地址改为和我们当前项目,同源的。解决跨域。
html
<iframe
ref="iframeRef"
:src="iframeUrl"
frameborder="0"
height="100%"
onLoad="this.height=100"
scrolling="auto"
@load="handleIframeLoad"
></iframe>
js
let iframeRef = ref();
加载完成之后可以通过以下代码拿到动态的url
js
let getCurIframeUrl = iframeRef.value.contentWindow.location.href;
1、iframe内部的DOM是动态生成的,我如何隐藏DOM或者删除或者后续追加兄弟节点
js
const handleIframeLoad = () => {
console.log("监听iframe加载完成");
if (timer.value) {
console.log("clear");
clearInterval(timer.value);
timer.value = null;
}
timer.value = setInterval(() => {
try {
// 确保iframe加载完成且同源
const iframeDoc =
iframeRef.value.contentDocument ||
iframeRef.value.contentWindow.document;
const op = iframeDoc.querySelectorAll(".css-exd1zr"); // 假设你想要删除的按钮有一个唯一的标识符或选择器
const op_1 = iframeDoc.querySelectorAll(".css-kg0g4j-toolbar-button");
console.log("op", op);
console.log("op_1", op_1);
const btn_get_cur_url = document.createElement("button");
btn_get_cur_url.className = "css-1krr5n3-toolbar-button";
btn_get_cur_url.innerHTML = "获取当前页面url";
const btn_set_url = document.createElement("button");
btn_set_url.className = "css-1krr5n3-toolbar-button";
btn_set_url.innerHTML = "将当前查询设置为默认页面";
btn_get_cur_url.onclick = (data) => {
getCurUrl();
};
btn_set_url.onclick = (data) => {
setUrl();
};
if (op_1[0]) {
// 删除按钮
op_1[0].style.cssText = "visibility:hidden";
op_1[0].parentNode.removeChild(op_1[0]);
}
if (op[1] && op.length == 4) {
// 删除按钮
// op[1].parentNode.removeChild(op[1]);
setTimeout(() => {
op[1].style.cssText = "order: 1; visibility: hidden;";
op[0].insertAdjacentElement("beforebegin", btn_get_cur_url);
op[0].insertAdjacentElement("beforebegin", btn_set_url);
op[0].parentNode.removeChild(op[0]);
op[1].parentNode.removeChild(op[1]);
clearInterval(timer.value);
timer.value = null;
});
}
setTimeout(() => {
flag.value = true;
}, 200);
} catch (error) {
// 处理跨域错误或其他异常
console.error("操作iframe内部DOM元素时发生错误:", error);
}
}, 200);
};
onMounted(() => {
console.log("111")
if(iframeRef.value) {
handleIframeLoad()
}
})
总结
提示:这里对文章进行总结:
对嵌入的iframe进行操作总结,注意的是需要同源,不然拿不到里面的东西!!!