2

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

servlet 通过对象 HttpGet 检索请求的资源并添加标签以解决由于相关链接引起的任何问题。

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

当我单击 iframe 内页面上的任何链接时,使用 jquery 的链接操作被阻止(event.prevent()),并且将在其位置发送一个 POST 以更新 iframe 中显示的页面。

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

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

我试过:

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

与:

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

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

任何的想法?

PS对不起我的英语!

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 协同浏览之外浏览相同 - 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 的全部内容都“原始”打印在屏幕上(它没有放入嵌套在 iframe 中的 #document 中,而是在

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

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

从此时起,在第一个站点(运行良好的站点)的地址栏中也重复搜索,页面的原始 html 将打印到屏幕上。

我还尝试用$('.MyIframe) 清除getMessages 函数() 的每个新周期的iframe。空(),但我没有得到任何不同!

4

2 回答 2

0

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

$('html', $('.myIframe').contents()).load("myServlet", {someParameters});
于 2012-11-20T06:57:47.280 回答
0

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

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

谢谢大家

于 2012-12-08T19:24:30.757 回答