Php jqueryajax多行;脚本“;响应

Php jqueryajax多行;脚本“;响应,php,jquery,ajax,Php,Jquery,Ajax,我正在设计一个模板创建工具,它使用jqueryajax请求将参数发布到PHP文件。PHP实际生成模板的HTML // Send for processing. Expect JS back to execute. function generate() { $.ajax({ type: "POST", url: "generate.php", data: $('#genform :input').serialize(), dataType: "script",

我正在设计一个模板创建工具,它使用jqueryajax请求将参数发布到PHP文件。PHP实际生成模板的HTML

// Send for processing. Expect JS back to execute.
function generate() {
$.ajax({
    type: "POST",
    url: "generate.php",
    data: $('#genform :input').serialize(),
    dataType: "script",
    beforeSend: function() {
        $("#loading").html("<img src='images/loadbar.gif' />");
        $("#loading")           
        .dialog({
            height: 80,
            width: 256,
            autoOpen: true,
            modal: true
        });
    },
    success: function(data) {
        $("#loading").dialog('close');
    }
});
}
如果$html中没有换行符,这实际上是可行的。一旦有任何换行符,Chrome调试器就会报告“gen.html:1 Uncaught SyntaxError:Unexpected token-liked”。很明显,它正在尝试评估返回的响应头,但在任何换行时都会停止

因此,要明确的是,当我传回$html时,如果内容如下:

$html = "<div>hi there</div>";
$html=“你好”;
它工作正常(我所有的错误消息对话框都是一行)。但如果是:

$html = "<div>
           hi there
         </div>";
$html=”
你好
";
它爆炸了

我真的不知道该如何解决这个问题,或者是否有更好的方法。保留格式对我来说很重要,这样人们就可以复制HTML模板了


如果我不能解决这个问题,我可能会将模板文件分解并显示在PHP页面上,但我真的希望将所有内容都限制在HTML页面的范围内。

您可以将数据类型更改为“text”或“xml”,以便不评估响应

dataType: ($.browser.msie) ? "text" : "xml",

您必须避开一切可能破坏javascript代码的因素:

$html=str\u replace(数组(“\\\”、“\r”、“\n”、““”)、数组(“\\\\”、“\r'、“\n'、“\”)、$html)


echo(“$(“#结果”).html(“.$html.”;”)

尝试创建输出处理程序函数:

function ob_handler($string, $flags) {
    return nl2br($string);
}
echo json_encode(array('result_html' => $html));
或:

然后将其用于您的代码:

ob_start('ob_handler');
/// all your code here
ob_end_flush();
另一种简单的方法(类似于xml解决方案)是将JSON响应编码为对象。jQuery自然支持这一点,它实际上也为您解码JSON。它涉及使用:

  • dataType:“script”
    替换为
    dataType:“json”
  • 更改success函数以进行html替换
  • 将PHP更改为只输出
    json\u encode($html)
  • 下面是已更改的成功函数

    success: function(data) {
        $("#loading").dialog('close');
        $("#result").html(data.result_html);
    }
    
    以下是更改后的PHP函数:

    function ob_handler($string, $flags) {
        return nl2br($string);
    }
    
    echo json_encode(array('result_html' => $html));
    

    我不希望直接输出HTML,这样将来可以向JSON输出中添加额外的数据,但也可以简单地执行
    $(“#result”).HTML(数据)使用PHP
    echo json_encode($html)

    这当然是一种方法,不过我会根据是否出现错误(显示对话框)或是否显示模板($(“#result”).html(“…”)执行不同的操作。如果我只是回显所有响应,我将失去控制。为了避免这种情况,您可以处理异常并输出实际的HTTP错误(使用标题),这些错误将作为XHRER错误发送回ajax调用,您可以轻松处理。我还没有探讨过这一点,但听起来不错。所以基本上,如果有问题,我可以编写自己的HTTP头(我想它们只升到505?)。如果我没有弄错的话,我会添加“完整的”ajax回调,因为它得到了XMLHttpRequest对象(我想),然后从那里开始?