什么是重新加载/刷新iframe的最佳方式?
我想重新加载一个<iframe>
使用JavaScript。 我发现到目前为止最好的方法是将iframe的src
属性设置为自己,但这不是很干净。 有任何想法吗?
document.getElementById('some_frame_id').contentWindow.location.reload();
要小心,在Firefox中, window.frames[]
不能被id索引,而是通过名字或索引
document.getElementById('iframeid').src = document.getElementById('iframeid').src
它将重新加载iframe
,甚至跨域! testingIE7 / 8,Firefox和Chrome。
如果使用jQuery,这似乎工作:
$('#your_iframe').attr('src', $('#your_iframe').attr('src'));
我希望它不是太难看的stackoverflow。
window.frames['frameNameOrIndex'].location.reload();
由于具有相同的来源策略 ,因此在修改指向其他域的iframe时,这将不起作用。 如果您可以定位较新的浏览器,请考虑使用HTML5的跨文档消息传递 。 您可以在这里查看支持此function的浏览器: http : //caniuse.com/#feat=x-doc-messaging 。
如果您不能使用HTML5function,那么您可以按照此处列出的技巧进行操作: http : //softwareas.com/cross-domain-communication-with-iframes 。 那个博客也很好的定义了这个问题。
对yajra的post的一个改进…我喜欢这个想法,但讨厌浏览器检测的想法。
我更喜欢ppk的使用对象检测,而不是浏览器检测,( http://www.quirksmode.org/js/support.html ),因为那么你实际上是testing浏览器的function,并采取相应的行动,而不是你当时认为浏览器是有能力的。 也不需要这么多丑陋的浏览器IDstringparsing,并不排除完全有能力的浏览器,你一无所知。
所以,而不是看navigator.AppName,为什么不做这样的事情,实际上testing你使用的元素? (如果你想更有趣,可以使用try {}块,但这对我有用。)
function reload_message_frame() { var frame_id = 'live_message_frame'; if(window.document.getElementById(frame_id).location ) { window.document.getElementById(frame_id).location.reload(true); } else if (window.document.getElementById(frame_id).contentWindow.location ) { window.document.getElementById(frame_id).contentWindow.location.reload(true); } else if (window.document.getElementById(frame_id).src){ window.document.getElementById(frame_id).src = window.document.getElementById(frame_id).src; } else { // fail condition, respond as appropriate, or do nothing alert("Sorry, unable to reload that frame!"); } }
这样,你可以尝试尽可能多的不同排列,或者是必要的,而不会导致javascript错误,如果一切都失败,做一些明智的事情。 在使用它们之前testing你的对象还有一些工作要做,但是,IMO会提供更好,更安全的代码。
在Windows上为IE8,Firefox(15.0.1),Chrome(21.0.1180.89 m)和Opera(12.0.2)工作。
也许我可以通过实际testing重载function做得更好,但现在对我来说已经足够了。 🙂
为新的url
location.assign("http:google.com");
assign()方法加载一个新文档。
重装
location.reload();
reload()方法用于重新加载当前文档。
在使用.Net的IE8中,第一次设置iframe.src
是可以的,但是第二次设置iframe.src
并不会引发iframe.src
页面的page_load
。 要解决它,我使用iframe.contentDocument.location.href = "NewUrl.htm"
。
使用jQuery thickbox时发现它,并尝试重新打开厚盒子iframe中的相同页面。 然后它只显示了打开的较早的页面。
使用重新加载IE浏览器,并为其他浏览器设置src。 (重新加载不工作在FF)在IE 7,8,9和Firefoxtesting
if(navigator.appName == "Microsoft Internet Explorer"){ window.document.getElementById('iframeId').contentWindow.location.reload(true); }else { window.document.getElementById('iframeId').src = window.document.getElementById('iframeId').src; }
我刚刚在铬中遇到了这个问题,唯一有效的工作就是删除并replaceiframe。 例:
$(".iframe_wrapper").find("iframe").remove(); var iframe = $('<iframe src="' + src + '" frameborder="0"></iframe>'); $.find(".iframe_wrapper").append(iframe);
很简单,在其他答案中没有涉及。
如果以上所有都不适合你:
window.location.reload();
由于某种原因,刷新了我的iframe,而不是整个脚本。 也许是因为它被放置在框架本身,而所有的getElemntById解决scheme,当你尝试刷新从另一个框架的框架工作?
或者我不完全理解这一点,并谈论胡言乱语,反正这对我来说就像一个魅力:)
你有没有考虑追加到一个无意义的查询string参数?
<iframe src="myBaseURL.com/something/" /> <script> var i = document.getElementsById("iframe")[0], src = i.src, number = 1; //For an update i.src = src + "?ignoreMe=" + number; number++; </script>
它不会被看到,如果你知道参数是安全的,那么它应该没问题。
如果你使用JQuery,那么有一个行代码。
$('#iframeID',window.parent.document).attr('src',$('#iframeID',window.parent.document).attr('src'));
如果你正在和同一个父母一起工作
$('#iframeID',parent.document).attr('src',$('#iframeID',parent.document).attr('src'));
简单地replaceiframe元素的src
属性在我的情况下是不令人满意的,因为在加载新页面之前会看到旧内容。 如果你想给予即时的视觉反馈,这个效果会更好:
var url = iframeEl.src; iframeEl.src = 'about:blank'; setTimeout(function() { iframeEl.src = url; }, 10);
<script type="text/javascript"> top.frames['DetailFrame'].location = top.frames['DetailFrame'].location; </script>
如果您尝试了所有其他build议,并且无法让其中任何一个人工作(如我不能),那么您可以尝试一下,这可能是有用的。
HTML
<a class="refresh-this-frame" rel="#iframe-id-0">Refresh</a> <iframe src="" id="iframe-id-0"></iframe>
JS
$('.refresh-this-frame').click(function() { var thisIframe = $(this).attr('rel'); var currentState = $(thisIframe).attr('src'); function removeSrc() { $(thisIframe).attr('src', ''); } setTimeout (removeSrc, 100); function replaceSrc() { $(thisIframe).attr('src', currentState); } setTimeout (replaceSrc, 200); });
我最初着手尝试使用RWD和跨浏览器testing节省一些时间。 我想创build一个快速的页面,内置了一堆的iframe,组织成我可以任意显示/隐藏的组。 从逻辑上讲,您希望能够轻松快速地刷新任何给定的帧。
我应该注意到,我目前正在使用的这个项目,在这个testing平台中正在使用的项目,是一个包含索引位置(如index.html#home)的单页网站。 这可能与我为什么不能得到任何其他解决scheme来刷新我的特定框架有关。
话虽如此,我知道这不是世界上最干净的事情,但它适用于我的目的。 希望这有助于某人。 现在,如果只有我可以弄清楚如何保持IFRAME滚动父页面,每次有iframe中的animation…
编辑:我意识到这并不像我希望的那样“刷新”iframe。 它会重新加载iframe的初始来源。 仍然无法弄清楚为什么我不能得到任何其他选项的工作..
更新:我无法使用任何其他方法的原因是因为我在Chrome中testing了它们,而且Chrome不允许您访问iframe的内容(说明: 未来版本的Chrome可能支持contentWindow / contentDocument当iFrame从本地HTML文件加载本地HTML文件? )如果它不是源于相同的位置(据我了解)。 经过进一步testing,我无法访问FF中的contentWindow。
AMENDED JS
$('.refresh-this-frame').click(function() { var targetID = $(this).attr('rel'); var targetSrc = $(targetID).attr('src'); var cleanID = targetID.replace("#",""); var chromeTest = ( navigator.userAgent.match(/Chrome/g) ? true : false ); var FFTest = ( navigator.userAgent.match(/Firefox/g) ? true : false ); if (chromeTest == true) { function removeSrc() { $(targetID).attr('src', ''); } setTimeout (removeSrc, 100); function replaceSrc() { $(targetID).attr('src', targetSrc); } setTimeout (replaceSrc, 200); } if (FFTest == true) { function removeSrc() { $(targetID).attr('src', ''); } setTimeout (removeSrc, 100); function replaceSrc() { $(targetID).attr('src', targetSrc); } setTimeout (replaceSrc, 200); } if (chromeTest == false && FFTest == false) { var targetLoc = (document.getElementById(cleanID).contentWindow.location).toString(); function removeSrc() { $(targetID).attr('src', ''); } setTimeout (removeSrc, 100); function replaceSrc2() { $(targetID).attr('src', targetLoc); } setTimeout (replaceSrc2, 200); } });
使用self.location.reload()将重新加载iframe。
<iframe src="https://vivekkumar11432.wordpress.com/" width="300" height="300"></iframe> <br><br> <input type='button' value="Reload" onclick="self.location.reload();" />
为了debugging目的,可以打开控制台,将执行上下文更改为他想要刷新的框架,并执行document.location.reload()
添加空白空间也会自动重新加载iFrame。
document.getElementById('id').src += '';