jQuery Ajax возвращает данные html и json
Я не уверен, есть ли способ сделать это или нет, но это решило бы так много моих проблем, если есть простое решение этого.
что мне нужно/хочу, чтобы я мог сделать, это вернуть HTML и JSON в моем успехе ajax-запроса. Причина в том, что я хочу запросить файл и вернуть всю эту страницу, но я также хочу иметь возможность вернуть указанный набор информации со страницы в json, чтобы я мог использовать его для других вещей.
это то, что я делаю теперь:
$.ajax({
type: "POST",
url: "inc/"+page+".php",
data: "id="+encodeURIComponent(pageID),
success: function(html){
$("body > .container").html(html);
}
});
это то, что я хотел бы иметь возможность сделать:
$.ajax({
type: "POST",
url: "inc/"+page+".php",
data: "id="+encodeURIComponent(pageID),
success: function(html){
$("body > .container").html(html);
$("title").html(json.PageTitle)
}
});
на возвращаемой странице Я бы указал, каким должен быть заголовок. (Например, если это профиль, я бы вернул имя пользователя)
4 ответов
попытка смешать значение retun, чтобы содержать представление и данные, кажется, может привести к путанице. Почему бы не разделить его на два вызова и не получить данные об успехе другого?
что-то типа:
$.ajax({
type: "POST",
url: "inc/"+view_page+".php",
data: "id="+encodeURIComponent(pageID),
success: function(html) {
$("body > .container").html(html);
$.ajax({
type: "POST",
url: "inc/"+data_page+".php",
data: "id="+encodeURIComponent(pageID),
success: function(json) {
$("title").html(json.PageTitle);
}
});
});
HTML и данные, завернутые в JSON
вы можете сделать это, вернув массив JSON из 2 элементов. Первый элемент содержит HTML, а второй элемент содержит другой массив JSON с данными внутри. Вам просто нужно аккуратно развернуть его, ничего не сломав.
Serverside
$html = '<div>This is Html</div>';
$data = json_encode(array('page_title'=>'My Page'));
$response = array('html'=>$html, 'data'=>$data);
echo json_encode($response);
клиентские
//Ajax success function...
success: function(serverResponse){
$("body > .container").html(serverResponse.html);
var data = JSON.parse(serverResponse.data);
$("title").html(data.page_title)
}
Примечание 1: я думаю, что это то, что @hakre имел в виду в своем комментарии к вашему вопрос.
примечание 2: этот метод работает, но я бы согласился с @jheddings, что это, вероятно, хорошая идея, чтобы избежать смешивания презентации и данных. Кодирование кармы вернется, чтобы укусить.
У вас также есть возможность включить данные в атрибуты данных html5
например, если вы возвращаете список животных
<ul id="ZeAnimals" data-total-animals="500" data-page="2">
<li>Cat</li>
<li>Dog</li>
...
</ul>
затем вы можете собрать необходимые данные с помощью
$('#ZeAnimals').data('total-animals')
иногда разделение вашего запроса на два разных вызова ajax также имеет смысл.
вы можете использовать библиотеку, которая делает это автоматически, как http://phery-php-ajax.net. Используя
Phery::instance()->set(array(
'load' => function(){
/* mount your $html and $json_data */
return
PheryResponse::factory()
->json($json_data)
->this() // points to the container
->html($html);
}
))->process();
$(function(){
var $container = $('body > .container');
$container.phery('make', 'load'); // or $container.phery().make('load')
$container.bind('phery:json', function(event, data){
// deal with data from PHP here
});
$container.phery('remote');
});
вы также можете использовать phery.views
автоматически загружать часть сайта автоматически, без необходимости беспокоиться о специфическом коде на стороне клиента. Вам нужно будет поместить уникальный идентификатор на контейнер,container
в этом примере:
$(function(){
phery.view({
'#container': {}
});
});
Phery::instance()->views(array(
'#container' => function($data, $params){
/* do the load part in here */
return
PheryResponse::factory()
->render_view($html)
->jquery('.title')->text($title);
}
))->process();