0

私はFirefox 14.0.1と最新のjqueryを使用しています。アンパサンドがエスケープされていないため、アプリケーションで次のコード エラーが発生します。ここまでは順調ですね。ただし、ページ ソースをファイルにコピーして Web サーバーにそれを提供させると、コードは正常に動作します。ここで何が起こっているのか、何か考えはありますか?!

あたたかく

ジョン

function create_dialog () {

    var new_dialog = $('<div id="new_dialog"/>');

    new_dialog.dialog({ autoOpen: true, modal: true, open: foo, height: 400 });

    function foo() {

        $.ajax({
           url:      'http://localhost:8010/ecomm/?ajax=1&state=pop_pl_cst',
           cache:    false,
           success:  function (data, textStatus, jqXHR) 
                         { new_dialog.append('<div>' + 'foo A&E' + '</div>'); },
           dataType: 'xml',
           error:    function(jqXHR, textStatus, fred ) {alert('oops ' + textStatus);},
        });

    }; // foo

}

編集:上記は、エラーを再現するための私のコードの単純なバージョンです。以下が実際のバージョンです。アンパサンドなどをエスケープすることはできますが、同じコードが同じページのように見えるものとは異なる理由を説明していません。どこか違うところがあるはず…

function create_dialog ( ) {

    var new_dialog = $('<div id="new_dialog"/>');

    new_dialog.dialog({ autoOpen: true, modal: true, open: foo, height: 400 });

    function foo() {

        $.ajax({
            url:      'http://localhost:8010/ecomm/?ajax=1&state=pop_pl_cst',
            cache:    false,
            success:  success,
            dataType: 'xml',
            error:    function(jqXHR, textStatus, fred ) {alert('oops ' + textStatus);},
        });

        function success(data, textStatus, jqXHR) {

//             alert(data);
            $(data).find('row').each(process_row);
            function process_row () {
                console.log($(this).attr('pop_text'));
                new_dialog.append($('<div>' + $(this).attr('pop_text') + '</div>'));
//                 new_dialog.append('<div>' + 'foo' + '</div>');
            }

        } // success

    }; // foo

}

私が気づいたことの 1 つは、データ型がテキストの場合、jquery はスタンドアロン ページ (機能するページ) でそれを xml に解析しますが、アプリ ページでは解析しないことです。

4

2 に答える 2

2

HTML はかなり寛大です。問題が発生したときにすべてをドロップするわけではありません。しかし、サーバーから悪いコードをフィードしたときに機能するからといって、それが正しいとは限りません。

エスケープされていないエンティティは、あなたが経験しているものと同じように問題を引き起こします。そのため、それらをエスケープする必要があります。ルールに従い、HTML をエスケープすれば準備完了です。

mustache.jsには非常にきれいな例があります。

var entityMap = {
  "&": "&amp;",
  "<": "&lt;",
  ">": "&gt;",
  '"': '&quot;',
  "'": '&#39;',
  "/": '&#x2F;'
};

function escapeHtml(string) {
  return String(string).replace(/[&<>"'\/]/g, function (s) {
    return entityMap[s];
  });
}
于 2012-12-23T18:54:28.710 に答える
0

次に、それをエスケープします。

new_dialog.append('<div>' + 'foo A&amp;E' + '</div>');
于 2012-12-23T18:53:05.423 に答える