Php jqueryajax多行;脚本“;响应
我正在设计一个模板创建工具,它使用jqueryajax请求将参数发布到PHP文件。PHP实际生成模板的HTMLPhp 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",
// 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”
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(数据)代码>使用PHPecho json_encode($html)代码>这当然是一种方法,不过我会根据是否出现错误(显示对话框)或是否显示模板($(“#result”).html(“…”)执行不同的操作。如果我只是回显所有响应,我将失去控制。为了避免这种情况,您可以处理异常并输出实际的HTTP错误(使用标题),这些错误将作为XHRER错误发送回ajax调用,您可以轻松处理。我还没有探讨过这一点,但听起来不错。所以基本上,如果有问题,我可以编写自己的HTTP头(我想它们只升到505?)。如果我没有弄错的话,我会添加“完整的”ajax回调,因为它得到了XMLHttpRequest对象(我想),然后从那里开始?