JS保持加载直到img src改变

7 浏览
0 Comments

JS保持加载直到img src改变

我想监视我的NAS上的卸载事件。\n它有一个单独的页面来卸载所有USB驱动器。\n我通过iframe包含了它,并希望保持网站加载,直到图像源被更改为特定的源(一个绿色的条形,表示已完成卸载)。\n我之所以想保持加载是因为我通过jquery.get函数从另一个网站调用它,我希望它等待卸载过程完成。\n如果可能的话,最好只用纯JavaScript实现,但如果需要的话,我也可以包含jquery。\n以下是我目前的代码:\n\n\n\n我立即收到一个错误,说元素\"uiView_TestPic\"不存在,即使我在运行check之前添加了一个超时。\n包含的iframe网页在所有图像加载完成时停止加载,而不是在整个过程完成时停止。

0
0 Comments

问题的原因是因为通过document.getElementById("uiView_TestPic")获取到的元素不在同一个文档中,无法找到该元素。解决方法是等待iframe加载完成后,从iframe中获取文档,然后再从文档中获取元素,最后判断是否是正确的图片。

以下是解决该问题的示例代码:

function check() {
    var iframe = document.getElementById("myIframe");
    var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
    var img = iframeDoc.getElementById("uiView_TestPic");
    if (img && !(img.src == "/css/default/images/finished_ok_green.gif")) {
        setTimeout(check, 2000);
    } else {
        alert("Done!");
    }
}
window.onload = function() {
    check();
};

在以上示例代码中,通过获取iframe元素并使用contentDocument或contentWindow.document获取到iframe的文档对象。然后再从文档对象中获取到需要检查的图片元素。如果图片元素存在且src属性不等于指定的图片路径,则延迟2秒后再次执行check函数。直到图片加载完成后,弹出"Done!"的提示框。

通过以上的代码调整,解决了原始代码中图片未加载完成就弹出"Done!"提示框的问题。

0
0 Comments

JS Keep loading till img src changed这个问题的出现原因是两个框架必须运行在同一个域名下,因为如果它们属于不同的域名,浏览器会阻止一个框架中的代码访问另一个框架中的任何内容。如果两个框架不在同一个域名下,那么iframe必须自行监控并在完成后通知另一个框架,可以使用window.postMessage()实现。

如果两个框架在同一个域名下,解决方法稍微复杂一些。首先,给iframe添加一个id属性。然后,通过获取iframe元素(在主文档中),等待iframe准备就绪后获取iframe中的文档,接着可以在iframe中找到目标图片并观察其内容。当然,只有在iframe与主页面属于相同域名时才能实现这些操作(出于安全限制)。

解决方法如下:

首先,给iframe添加一个id属性:


然后,在文档中添加以下代码(在iframe标签之后或者在主文档的DOM加载完成后运行):

function checkImageSrc(obj) {
    if (obj.src.indexOf("/finished_ok_green.gif") !== -1) {
        // 找到绿色的GIF
        // 在这里添加你想要的代码
    } else {
        // 持续检查,直到找到绿色图片
        setTimeout(function() {
            checkImageSrc(obj);
        }, 2000);
    }
}
// 获取主文档中的iframe
var iframe = document.getElementById("myFrame");
// 获取与该iframe关联的窗口
var iWindow = iframe.contentWindow;
// 等待窗口加载完毕后再访问内容
iWindow.addEventListener("load", function() {
    // 获取iframe中的文档
    var doc = iframe.contentDocument || iframe.contentWindow.document;
    // 在iframe内容中找到目标
    var target = doc.getElementById("uiView_TestPic");
    checkImageSrc(target);
});

如果你能够控制iframe中的代码,那么更简洁的解决方法是使用window.postMessage()在iframe完成操作时向父窗口发送消息。然后,父窗口只需监听该消息,就可以知道操作何时完成。

在iframe中添加以下代码:

// 将此代码放在相关图片标签之后(或者在iframe的DOM加载完成后运行)
// 如果能够连接到知道unmount完成的实际事件,那么比轮询gif是否改变更好
function checkImageSrc(obj) {
    if (obj.src.indexOf("/finished_ok_green.gif") !== -1) {
        // 找到绿色的GIF
        // 通知父窗口
        window.parent.postMessage("unmount complete", "*");
    } else {
        // 持续检查,直到找到绿色图片
        setTimeout(function() {
            checkImageSrc(obj);
        }, 2000);
    }
}
// 在iframe内容中找到目标
var target = document.getElementById("uiView_TestPic");
checkImageSrc(target);

然后,在主窗口中监听接收到的消息:

window.addEventListener("message", function(e) {
    // 确保消息来自预期的来源(在这里填入正确的来源)
    if (e.origin !== "http://example.org:8080") return;
    if (e.data === "unmount complete") {
        // unmount完成 - 在这里添加你的代码
    }
});

需要注意的是,如果两个框架不属于相同的域名,是无法从外部访问iframe的DOM的。我认为你无法从外部监控GIF的变化。

0