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