Javascript 重新加载iframe src/location,新url在Safari中不起作用

Javascript 重新加载iframe src/location,新url在Safari中不起作用,javascript,iframe,safari,Javascript,Iframe,Safari,我有一个页面,最初只加载iframe中的一个表单,如下所示: 试试这个 form.setAttribute('src', 'somePage?listId=1'); 一些浏览器在直接从javascript层次结构调用javascript对象时不使用“src”,而其他浏览器使用“location”或“href”而不是“src”来更改url。您应该尝试这两种方法以使用新的url更新iframe 要防止浏览器缓存,请在url中添加一个伪随机字符串,如数字和时间戳,以防止缓存。例如,将“new Dat

我有一个页面,最初只加载iframe中的一个表单,如下所示:

试试这个

form.setAttribute('src', 'somePage?listId=1');
一些浏览器在直接从javascript层次结构调用javascript对象时不使用“src”,而其他浏览器使用“location”或“href”而不是“src”来更改url。您应该尝试这两种方法以使用新的url更新iframe

要防止浏览器缓存,请在url中添加一个伪随机字符串,如数字和时间戳,以防止缓存。例如,将“new Date().getTime()”添加到url

一些典型的例子:

document.getElementById(iframeId).src = url;

我建议使用document.getElementById使用第一个选项

您还可以使用以下命令强制iframe重新加载页面:

document.getElementById(iframeId).reload(true);

嗯,我找到了一个看似可行的解决方案——这是一项正在进行的工作,但这基本上就是我最终所做的:

var myFrame = document.getElementById('frame'); // get frame  
myFrame.src = url; // set src attribute of original frame  
var originalId = myFrame.id; // retain the original id of the frame  
var newFrameId = myFrame.id + new Date().getTime(); // create a new id  
var newFrame = "<iframe id=\"" + newFrameId + "\"/>"; // iframe string w/ new id  
myFrameParent = myFrame.parentElement; // find parent of original iframe  
myFrameParent.innerHTML = newFrame; // update innerHTML of parent  
document.getElementById(newFrameId).id = originalId; // change id back
var myFrame=document.getElementById('frame');//获得框架
myFrame.src=url;//设置原始帧的src属性
var originalId=myFrame.id;//保留框架的原始id
var newFrameId=myFrame.id+new Date().getTime();//创建一个新的id
var newFrame=“”;//带新id的iframe字符串
myFrameParent=myFrame.parentElement;//查找原始iframe的父级
myFrameParent.innerHTML=newFrame;//更新父对象的innerHTML
document.getElementById(newFrameId).id=originalId;//把身份证换回来
我使用jQuery.ajax找到了一个更好的解决方案(尽管不是特别有说服力):

jQuery.ajax({
   type: 'GET',
   url: "/somePage?someparms",
   success: function() {
      frameObj.src = "/somePage?someparms";
   }
});

这将强制在frame对象中读取DOM,并在服务器准备好响应后重新加载它。

因此答案非常简单:
1.在页面上放置一个

2.需要重新加载时,请使用以下jQuery:

$("#container").empty();
$("#container").append("<iframe src='" + url + "' />");
$(“#容器”).empty();
$(“#容器”)。附加(“”);
就这样。 当然,使用jQuery创建DOM有更优雅的方法,但这提供了“刷新”iframe的想法。
在FF18、CH24、IE9、O12中工作(它是jQuery,所以几乎总是可以工作:)

我使用React遇到这个问题,将
键作为
道具传递。src
解决了它

const KeyedIframe = ({children, ...props}) => <iframe key={props.src} { ...props}>
  {children}
</iframe>
constkeyediframe=({children,…props})=>
{儿童}

不必使用“setAttribute()”来更新框架元素的“src”属性,事实上它在某些浏览器中可能不起作用。修改属性有几种方法—setAttribute就是其中之一。我的想法是,safari可能不支持frame.src='newURI here'符号;我试过了,但没用。。。我看过一些关于safari缓存iframe的东西。src属性实际上得到了更新,但发送的请求(我使用fiddler进行监视)不是更新的src url,而是首次加载到框架中的任何内容。您可以尝试执行以下操作来测试缓存:form.src='somePage?listId=1&random=552435'浏览器应按url进行缓存,尝试修改url以查看它是否正常工作,因此frame.src应该只重新加载目标帧。还有3个不应重新加载的框架。框架URL是否与外部(主页)页面位于同一个域中?是的,框架URL与主页位于同一个域中。我尝试了这两种方法,并且更新了src属性,但当框架加载时,它仍然是原始内容。我投票支持这一方法,因为它在一个方面有所帮助
const KeyedIframe = ({children, ...props}) => <iframe key={props.src} { ...props}>
  {children}
</iframe>