4

これは短い文章にまとめるのが非常に難しい問題なので、殺してしまったら申し訳ありません。

私は最近、IE8 (IE8 標準モード、XHTML Strict) を含むすべての希望するブラウザー プラットフォーム上のローカル Web サーバーで広範囲にテストされたサイトを立ち上げました。サイトが専用の Web サーバーで公開されるまで、まったく問題はありませんでした。

このサイトでは、フォームの要素にjQuery.get()on を使用します。ここで、応答は共通の に移植されます。changeinput<div id="results"></div>

私が IE と XMLHTTPRequest で読んだキャッシングの問題にもかかわらず、私の問題は、私の ajax コールバックが実行を開始した後に発生するようです。私のコールバック ( .get()/経由で提供さ.load()れます。両方を試しました) は、サーバーから返された HTML フラグメントを受け取ります。返されたコンテンツを任意のブラウザでテストすると、期待どおりのコンテンツが明らかになります。

ただし、HTML フラグメントを の DOM ツリーに配置するとすぐに#results、IE は実際にマークアップから最初の 7 つまたは 8 つの開始タグを (それらのタグのほとんどの子と共に) 切り取ります。それはひどく奇妙です。を介して HTML コンテンツを設定することで、サイトの別の領域で修正しましたjQuery('#results')[0].innerHTML = contentが、今回はサイコロはありません。

応答例:

<div>
    <a href="#">some link</a>
    <span>stuff, blah blah</span>
    <a href="#">another link</a>

    <ul>
        <li id="item-2342">
            <img src="#" />
            <div class="info">
                <h6> ..title.. </h6>
                <a href="#">View</a>
                <span rel="stats"> ..statistics.. </span>
            </div>
        </li>

        <!-- ... and so on in a loop over items to create more <li> items ... -->
    </ul>
</div>

文字通り、その開始タグまでのすべて<span rel="stats">が切り捨てられます。その結果、IE は、返された AJAX コンテンツをテキスト ノードで始まるかのように表示します..statistics.. </span>。(以下のコメントの提案で を削除してrel="stats"、代わりに CSS クラスに変更しようとしましたが、同じ結果が発生します。)

ブラウザの URL フィールドから AJAX の URL を直接リクエストすると、返されるコンテンツは完璧です。

alert()返された AJAX コンテンツを表示するために使用すれば、完璧です。

.html()またはを介し​​て AJAX コンテンツを割り当てると、.innerHTMLすぐに切り捨てられます。

すっごく....なんてこと?IE の (安っぽい) デバッガーは、スクリプト エラーやその性質のものを何も表示しません。これまでにこの種の問題に対処したことのある人はいますか? 繰り返しますが、私の開発サーバー (127.0.0.1) では IE に問題はなく、同じ「モード」(IE8 標準) とすべてを使用しているようです。

編集:AJAXルックアップを強化するJavascriptは次のとおりです。

jQuery('.ajax-panel').live('load', function(event, request_string){
    var panel = jQuery(this).stop(true).fadeTo(100, 0.2).addClass('loading');
    var form = jQuery(panel.attr('rel'));
    jQuery.get(form.attr('action'), request_string ? request_string : form.serialize(), function(response){

        // WTF?
        // panel[0].innerHTML = response;
        panel.empty().append(response);

        // Carry on.
        panel.removeClass('loading').stop(true).fadeTo(100, 1);
    });
});
4

6 に答える 6

2

追加されたhtmlコードの一部が切り取られた同様の問題が発生しましたが、内部htmlのアラートを作成したり、スクロールを強制したりすると、それが表示されました。

その後、IE8 がペインを正しく再描画していないことを示していると思われる記事に出くわしました。 http://ajaxian.com/archives/forcing-a-ui-redraw-from-javascript

私がそれを機能させる唯一の方法は、クラスを追加し、待ってから、クラスを削除することでした。待たなかったら、実行をスキップするようです。

関数 Redraw(要素)
{
 もし ($.browser.msie)
 {
  element.addClass("見えない");
  setTimeout(関数(){
    element.removeClass("見えない");
   },1);
 }
}
于 2010-07-12T22:03:42.703 に答える
1

問題を確認できます。元の送信者に対して同様の AJAX 応答を生成しました。いくつかの初期情報、次にデータをループして、8 つの異なる div に相当するコンテンツを作成します。ページを実行すると、ロードが行われますが、IE は一部のデータしか表示しません。1 つの小さな変更でこれが修正されました。

各 div 内のページに (ビデオ タグのセット用に) スパンを設定して、テキストが長すぎる場合はテキストを切り捨て、タイトル属性を含むスパンをホバーチップとして使用できるようにしました。タグ スパンが次のようにフォーマットされている場合:

<div>Tags: <span title="Miller, Jackson, Brown">Miller, Jackson...</div>

それは機能しませんが、次の場合:

<div>Tags: Miller, Jackson, Brown</div>

うまくいきました。もちろん、span 終了タグがないというエラーに気付きました。これを修正することもできましたが、私が気づいた重要なことは、IE が AJAX でのフォーマット エラー、またはより正確には AHAH でのフォーマット エラーを非常に許容できないように見えることです。

これを確認した後、戻り文字列にわずかに不正な形式の HTML があることを保証します。あなたがしたのとまったく同じエラー、javascriptによって返された情報の断片があり、エラーを修正すると修正されました。

于 2010-08-18T21:12:03.290 に答える
1

を削除するとどうなりますrel="stats"か?

MSDNによると、このrel属性を含めることは許可されていません。stats

于 2010-06-08T16:51:25.740 に答える
0

これは大雑把な推測ですが、IEの問題で一度役に立ちました:

の代わりに$('your_container').html( your_content )、コンテナ オブジェクトを完全に空にしてから、 を使用してappend()ください。そう:

$('your_container').empty().append( your_content );

IEです。あなたは、決して知らない。

于 2010-06-08T16:56:47.020 に答える
0

まったく同じ問題がありました。サーバーからの応答を挿入するために jQuery の .html() を使用していました。応答テキストの先頭は、いくつかの php で始まり、その後に改行、そしていくつかの HTML が続きます。改行を削除するだけで、切り捨てが停止しました。

から:

<?php 
$this->load->helper('stdclass_helper');
?>

<div id="expense_entry" class="element_record" style="padding:20px;" 

に:

<?php 
$this->load->helper('stdclass_helper');
?>
<div id="expense_entry" class="element_record" style="padding:20px;" 

いくつかの実験の後、問題の原因をファイルの先頭にある改行に切り分けることができました。

たとえば、ファイルの先頭で切り捨てが発生します (改行を示すために引用符が追加されています)。

"



<div id="expense_entry" class="element_record" style="padding:20px;" saveHandler="Accounting.Expenses.saveExpense">
<!-- BEGIN EXPENSE ENTRY FORM -->
<?php 
$this->load->helper('stdclass_helper');
?>
"

これらの最初の改行を削除すると、切り捨てがなくなります。

これは、Windows 7(VMWare仮想Windowsマシンを使用)でjquery-1.6.4.min.jsとIE 9(IE 8エミュレーションモード)を使用していました

更新: 私はすでに jquery .html() 関数のラッパーを使用してカスタム要素を見つけて登録しているので、徹底的な人であるため、先に進み、文字列であるデータをトリミングすることで IE の問題に対処しました。これはうまくいきます:

// Override jQuery's html() method, so that we can register any special elements in new html.
(function( $, oldHtmlMethod ){

    // Override the core html method in the jQuery object.
    $.fn.html = function(data){
        // Execute the original HTML method using the
        // augmented arguments collection.
        //trim whitespace that could cause IE to truncate returned content
        **if(typeof data == 'string'){
            data = data.trim();
        }**
        var results = oldHtmlMethod.apply( this, arguments );
        return results;

    };

})( jQuery, jQuery.fn.html );

これは私にとってはうまくいきます。

于 2013-01-30T20:11:30.487 に答える
0

すべてのメソッドを POST に変更します。デフォルトはGETです。

jQuery.ajax({
    url: form.attr('action'), 
    success: function(){
        panel.empty().append(response);

        // Carry on.
        panel.removeClass('loading').stop(true).fadeTo(100, 1);
    }
});

それはそれを行う必要があります...私はあなたの機能からいくつかのものが欠けていることを知っていますが、これはそれの要点です.

于 2011-04-19T16:27:29.120 に答える