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

}

我注意到的一件事是,当数据类型是文本时,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 回答