gpt4 book ai didi

javascript - JS 持续加载直到img src改变

转载 作者:行者123 更新时间:2023-12-03 12:07:33 27 4
gpt4 key购买 nike

我想监控我的 NAS 上的卸载事件。它有一个单独的页面来卸载所有 USB 驱动器。我已通过 iframe 包含它,并希望保持网站加载,直到图像源更改为特定源(绿色条,表明它已完成卸载)。我想保持它加载的原因是因为我通过另一个站点的 jquery.get 函数调用它,并且我希望它等到卸载过程完成。如果这只能在纯 javascript 中实现,那就太好了,但如果需要,我也可以包含 jquery。这是我到目前为止所得到的:

<script type="text/javascript">
function check(){
if (!(document.getElementById("uiView_TestPic").src == "/css/default/images/finished_ok_green.gif")){
window.setTimeout(check(), 2000);
}else{
alert("Done!");
}}
window.onload(check());
</script></head>
<body>
<iframe seamless width="100%" frameborder="0" height="80%" src="http://fritz.box/usb/usb_diskcut.lua?usbdev=all"></iframe>

即使我在运行检查之前添加超时,我也会立即收到元素“uiView_TestPic”不存在的错误。

一旦所有图像加载完毕,包含的 iFrame 网站就会停止加载,而不是在整个过程完成后停止加载。

最佳答案

首先,两个框架必须在同一域上运行,因为如果它们是不同的域,浏览器将阻止一个框架中的代码访问另一个框架中的任何内容。如果两个框架不在同一域中,则 iframe 将必须监视自身并在完成使用类似 window.postMessage() 的内容时通知另一个框架。 .

如果它们位于同一域中,则情况会稍微复杂一些。您必须获取 iframe 元素(位于主文档中)。您必须等待其准备就绪(因为它必须加载自己的内容)。然后,您必须获取 iframe 中的文档。然后就可以在iframe中找到想要的图片了。然后你就可以观察它的内容了。当然,只有当 iframe 与您的主页处于同一域时(由于安全限制),您才能执行上述操作。

首先,向 iframe 添加一个 id:

<iframe id="myFrame" seamless width="100%" frameborder="0" height="80%" src="http://fritz.box/usb/usb_diskcut.lua?usbdev=all"></iframe>

然后,你可以使用这个:

    // put this code in your document AFTER the iFrame tag
// or only run it after the DOM is loaded in your main document

function checkImageSrc(obj) {
if (obj.src.indexOf("/finished_ok_green.gif") !== -1) {
// found the green gif
// put whatever code you want here
} else {
// check repeatedly until we find the green image
setTimeout(function() {
checkImageSrc(obj);
}, 2000);
}
}

// get the iframe in my documnet
var iframe = document.getElementById("myFrame");
// get the window associated with that iframe
var iWindow = iframe.contentWindow;

// wait for the window to load before accessing the content
iWindow.addEventListener("load", function() {
// get the document from the window
var doc = iframe.contentDocument || iframe.contentWindow.document;

// find the target in the iframe content
var target = doc.getElementById("uiView_TestPic");
checkImageSrc(target);
});

仅供引用,这里有有关等待 iframe 准备就绪的更多详细信息:How can I access the DOM elements within an iFrame

<小时/>

如果您控制 iframe 中的代码,那么实现此目的更简洁的方法是使用 window.postMessage()当 iframe 中的代码完成其操作时,将消息发送到父窗口。然后父窗口可以只监听该单个消息,并且它会知道操作何时完成。

看起来可能是这样的。将此代码放入 iframe 中:

    // put this code in your document AFTER the relevant image tag
// or only run it after the DOM is loaded in your iframe

// if you can hook into the actual event that knows the unmount
// is done, that would be even better than polling for the gif to change

function checkImageSrc(obj) {
if (obj.src.indexOf("/finished_ok_green.gif") !== -1) {
// found the green gif
// notify the parent
window.parent.postMessage("unmount complete", "*");
} else {
// check repeatedly until we find the green image
setTimeout(function() {
checkImageSrc(obj);
}, 2000);
}
}

// find the target in the iframe content
var target = document.getElementById("uiView_TestPic");
checkImageSrc(target);

然后,在主窗口中,您将监听已发布的消息,如下所示:

    window.addEventListener("message", function(e) {
// make sure this is coming from where we expect (fill in the proper origin here)
if (e.origin !== "http://example.org:8080") return;
if (e.data === "unmount complete") {
// unmount is complete - put your code here
}
});

关于javascript - JS 持续加载直到img src改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25114498/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com