jQuery - 将POST响应加载到iframe中

时间:2012-11-20 00:50:18

标签: jquery servlets post iframe

我提出的问题让我失去理智。 我需要开发一个用于cobrowsing的servlet,其逻辑是: “master”在地址栏中键入一个地址,POST方法(表单)将此信息发送到servlet。

通过对象HttpGet的servlet检索所请求的资源并添加一个标记来解决由于相对链接引起的任何问题。

然后返回的资源显示在IFRAME中(搜索栏的形式为iframe的目标)

当我点击iframe页面上的任何链接时,链接的动作(带有jquery)被阻止(event.prevent())并且在其位置将发送一个更新iframe中显示的页面的POST

更新正常,servlet正常工作,事实上POST响应包含所请求页面的html。

现在问题是:如何在iframe中显示它?

我尝试过:

$('.myIframe').contents().load("myServlet", {someParameters}); 

和:

$.post("myServlet", {someParameters}).success(function(data) {
$(".myIframe").contents().html(data);});

但在这两种情况下我都会收到正确的回复(html),但iframe为空。 而且,在这些情况下,浏览器无法解析相对链接(使用firebug不满足相关链接引用的资源要求,并收到404响应),尽管第一次调用(地址栏)工作。

有什么想法吗?

P.S。对不起我的英文!

HTML代码是:

<div id="searchbar">
<form action="myServlet" target="navigation" name="form" method="POST">
<input type="text" name="goTo" id="addressbar">
</form></div>
<div id="iframe"><iframe class="myIframe" scrolling="no" name="navigation"></iframe>

并且,当加载iframe时,链接上的每次点击都会被识别:

$('.myIframe').load(function() {
   $('.myIframe').contents().find('a').click(function(event) {  
      $('html', $('.myIframe').contents()).load("myServlet", {someParameters});
   });
}); 

在post响应中获得的数据类型是一个典型的Web资源(你可以在servlet cobrowsing外面浏览相同的内容 - html,asp,php等)。

@Yevgeniy:嗨,它有效,但现在,当以这种方式加载页面时,未启用识别链接上的点击事件(iframe load()事件未被触发?)

一些更新 我通过GET分离POST(更新会话共同浏览)的操作(而不是异步检索资源会话并应显示iframe)

POST方面没问题,

异步GET是使用AsyncContext和这个JS(oracle教程)实现的:

var messagesWaiting = false;          
function getMessages(){
    if(!messagesWaiting){
        messagesWaiting = true;
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange=function(){
            if (xmlhttp.readyState==4 && xmlhttp.status==200) {
                messagesWaiting = false;
                var iframe = $(".browser")[0].contentWindow.document;
                iframe.open();
                iframe.write(xmlhttp.responseText);
                iframe.close();
            } 
        }
        xmlhttp.open("GET", "CoBroServlet?t="+new Date()+"&type=UPDATE&sharedSessionId="+ document.getElementById("ssid").innerHTML, true);
    xmlhttp.send();
    }
}
setInterval(getMessages, 1000);
奇怪的是,在某些情况下它工作正常,但在其他情况下,包含远程资源的GET的全部内容在屏幕上打印为“raw”(它不会放入嵌套在iframe中的#document但是在之间)

更好地解释: 有时(总是在地址栏中的第一次搜索)firebug显示iframe的内容是预期的内容。 通过iframe与servlet和输出交互来浏览网站是可以的。

突然(在地址栏中进行新搜索)iframe打印GET响应的内容。

从这时起,在第一个网站的地址栏中重复搜索(效果良好的地址栏)也会在屏幕上显示页面的原始html。

我还尝试使用$('。MyIframe)清除每个新的getMessages函数()循环iframe。空(),但我没有任何不同!

2 个答案:

答案 0 :(得分:0)

请修改您的javascript,然后重试:

$('html', $('.myIframe').contents()).load("myServlet", {someParameters});

答案 1 :(得分:0)

我通过传递编码为请求路径的参数来解决它,只需要替换iframe的src属性:

$(".myIframe").attr('src', "myServlet/"+encodedParam);

感谢所有