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

时间:2011-11-10 16:27:06

标签: javascript iframe safari

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

<iframe id="oIframe" ...src='somePage>' <form ... /> </iframe>

当您单击表单中的某个按钮时,会调用一些构建网址的javascript,然后我想执行以下操作:

frame.src = 'somePage?listId=1';

这在IE中用于“重新加载”具有新内容的帧。 但是,在Safari中,这不起作用。

我有jQuery可用,但我不想替换现有的iframe,因为附加了事件。我也无法修改iframe的id,因为它在整个应用程序中被引用。

我已经看到了一些类似的问题,但似乎没有解决方案似乎适用于我的确切问题。

任何人都可以提供任何帮助都很棒!

6 个答案:

答案 0 :(得分:5)

某些浏览器在直接从javascript层次结构调用javascript对象时不使用“src”,而其他浏览器使用“location”或“href”而不是“src”来更改url。您应该尝试使用这两种方法来使用新网址更新iframe。

要防止浏览器缓存,请向网址添加数字和时间戳等伪随机字符串,以防止缓存。例如,将“new Date()。getTime()”添加到您的网址。

一些调用示例:

document.getElementById(iframeId).src = url;

window.frames[iframeName].location = url;  

我推荐使用document.getElementById

的第一个选项

您也可以使用

强制iframe重新加载页面
document.getElementById(iframeId).reload(true);

答案 1 :(得分:5)

所以答案很简单:
1.在页面上放置<div id="container"> </div>
2.当需要重新加载时使用jQuery:

$("#container").empty();
$("#container").append("<iframe src='" + url + "' />");

就是这样。 当然,有更优雅的方式使用jQuery创建DOM,但这提供了“刷新”iframe的想法。 适用于FF18,CH24,IE9,O12(它的jQuery,所以它几乎总是可以工作:)

答案 2 :(得分:3)

我使用jQuery.ajax找到了一个更好的解决方案(虽然不是特别雄辩):

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

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

答案 3 :(得分:0)

试试这个

form.setAttribute('src', 'somePage?listId=1');

答案 4 :(得分:0)

好吧,我能够找到一个看似可行的解决方案 - 这是一项正在进行中的工作,但这基本上就是我最终要做的事情:

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

答案 5 :(得分:0)

我使用React遇到了这个问题,因为key解决了问题时传递了props.src

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