jQuery ajax многострочный ответ "скрипт" - PullRequest
3 голосов
/ 19 мая 2010

Я разрабатываю инструмент для создания шаблонов, который использует запрос 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: Неожиданный токен ILLEGAL». Очевидно, что он пытается оценить возвращаемые заголовки ответа, но останавливается при любом разрыве строки.

Итак, чтобы было ясно, когда я передаю $ html обратно, если содержимое это:

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

Работает нормально (все мои диалоги сообщений об ошибках - одна строка). Но если это:

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

Взрывается.

Я действительно не уверен, как обойти это или есть лучший способ сделать это. Для меня важно сохранить форматирование, чтобы люди могли копировать HTML-шаблон.

Я могу просто сломаться и показать файл шаблона на странице PHP, если я не могу решить эту проблему, но я действительно надеялся сохранить все в рамках HTML-страницы.

Ответы [ 4 ]

2 голосов
/ 30 мая 2010

Другой простой способ (аналог решения xml) - закодировать ответ JSON как объект. Это, естественно, поддерживается jQuery, который на самом деле декодирует JSON и для вас. Это включает использование:

  1. Заменить dataType: "script" на datatype: "json"
  2. Измените функцию успеха для замены html.
  3. Измените PHP, чтобы просто вывести json_encode($html);

Вот измененная функция успеха

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

Вот измененная функция PHP:

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

Я предпочитаю не выводить HTML напрямую, чтобы вы могли добавить дополнительные данные в вывод JSON в будущем, но вы также можете просто сделать $("#result").html(data); с PHP echo json_encode($html);

0 голосов
/ 20 мая 2010

Вы должны избежать всего, что могло бы нарушить код JavaScript:

$ html = str_replace (массив ('\\', "\ r", "\ n", ""), массив ('\\\\', '\ r', '\ n', ' \ "'), $ html);

эхо ( '$ ( "# результат") HTML (. "' $ HTML.."); ');

0 голосов
/ 21 мая 2010

Попробуйте создать функцию обработчика вывода:

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();
0 голосов
/ 19 мая 2010

Вы можете изменить dataType на 'text' или 'xml', чтобы ответ не оценивался.

dataType: ($.browser.msie) ? "text" : "xml",
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...