我提出了一个让我失去理智的问题。我需要开发一个用于协同浏览的 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。空(),但我没有得到任何不同!