jQuery ajax多行“脚本”响应

时间:2010-05-19 16:31:29

标签: php jquery ajax

我正在设计一个模板创建工具,它使用一个jQuery Ajax请求将参数发布到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');
    }
});
}

我的麻烦是我有ajax dataType:设置为“script”。使用它,PHP文件为任何错误生成一些jQuery对话框。但是,在生成HTML之后,我无法将其传回去。

所以我可能有100行生成的HTML和javascript,我想与之合作。 在PHP文件中,我尝试过:

echo('$("#result").html("'.$html.'");');

如果$ html中没有换行符,这确实有用。只要有任何换行符,Chrome调试器就会报告“gen.html:1 Uncaught SyntaxError:Unexpected token ILLEGAL”。很明显,它正在尝试评估返回的响应头,但是在任何换行符时停止。

所以,要清楚,当我传回$ html时,如果内容是这样的话:

$html = "<div>hi there</div>";

它工作正常(我的所有错误消息对话框都是一行)。但如果是的话:

$html = "<div>
           hi there
         </div>";

它爆炸了。

我真的不确定如何解决这个问题,或者是否有更好的方法可以解决这个问题。保留格式以便人们可以复制HTML模板对我很重要。

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

4 个答案:

答案 0 :(得分:2)

另一种简单的方法(类似于xml解决方案)是将JSON响应编码为对象。这自然得到了jQuery的支持,它实际上也为你解码了JSON。它涉及使用:

  1. dataType: "script"替换为datatype: "json"
  2. 更改成功功能以进行html替换。
  3. 将PHP更改为只输出json_encode($html);
  4. 这是改变后的成功函数

    success: function(data) {
        $("#loading").dialog('close');
        $("#result").html(data.result_html);
    }
    

    这是改变的PHP函数:

    echo json_encode(array('result_html' => $html));
    

    我不想直接输出HTML,因此您可以在将来向JSON输出添加额外的数据,但您也可以使用PHP $("#result").html(data);

    进行echo json_encode($html);

答案 1 :(得分:0)

您可以将dataType更改为“text”或“xml”,以便不评估响应。

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

答案 2 :(得分:0)

你必须逃避破坏javascript代码的所有内容:

$ html = str_replace(array('\\',“\ r”,“\ n”,'“'),array('\\\\','\ r','\ n',' \“'),$ html);

回波( '$( “#结果”)的HTML( “' $ HTML。 '”);');

答案 3 :(得分:0)

尝试创建输出处理函数:

function ob_handler($string, $flags) {
    return nl2br($string);
}

或者:

function ob_handler($string, $flags) {
    $string = str_replace(array("\r", "\n"), array('', ''), $string);
    return $string;
}

然后使用它代码:

ob_start('ob_handler');
/// all your code here
ob_end_flush();