2

私は正気を失うような問題を提起します。コブラウジング用のサーブレットを開発する必要があります。そのロジックは、「マスター」がアドレスバーにアドレスを入力し、POST メソッド (フォーム) がこの情報をサーブレットに送信します。

オブジェクト HttpGet を介したサーブレットは、要求されたリソースを取得し、タグを追加して相対リンクによる問題を解決します。

返されたリソースは IFRAME に表示されます (検索バーのフォームは iframe をターゲットとして持っていました)。

iframe 内のページのリンクをクリックすると、jquery を使用したリンクのアクションが防止され (event.prevent())、その代わりに、iframe に表示されるページを更新する POST が送信されます。

更新は機能し、サーブレットは適切に機能します。実際、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});
   });
}); 

投稿応答で取得されるデータのタイプは、典型的な Web リソースです (サーブレットのコブラウジング以外でブラウジングする場合と同じです - html、asp、php など)。

@Yevgeniy: こんにちは、動作しますが、この方法でページをロードすると、リンクのクリックを認識するイベントが有効になりません (iframe load() イベントが発生しませんか?)

いくつかの更新 POST (セッションのコブラウジングを更新する) のアクションを GET で分離しました (代わりに、リソース セッションを非同期に取得し、iframe を表示する必要があります)。

POST側はOK、

非同期 GET は、AsyncContext とこの JS (オラクル チュートリアル) を使用して実装されます。

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 には入れられませんが、間に入れられます)。

よりよく説明するために:時々(常にアドレスバーの最初の検索に対して)firebugは、iframeのコンテンツが期待されるものであることを示します。サーブレットおよび出力との iframe 対話によるサイトの閲覧は問題ありません。

突然 (アドレスバーで新しい検索を行うと)、iframe は GET 応答の内容を出力します。

今回からも最初のサイト(うまくいったサイト)のアドレスバーで検索を繰り返すと、そのページの生のhtmlが画面に出力されます。

また、getMessages 関数 () の新しいサイクルごとに iframe を $ ('. MyIframe) でクリアしようとしました。空 () ですが、違いはありません。

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 に答える