Несколько ответов от одного запроса AJAX - PullRequest
7 голосов
/ 04 мая 2009

На самом деле здесь нет примеров кода, только концепции.

У меня есть три раздела на странице, которые обновляются с помощью трех отдельных вызовов AJAX для PHP-скриптов, которые возвращают JSON. Что было бы самым простым способом объединить эти три вызова в один больший вызов и получить ответы обратно на клиенте в JSON? Как бы я разделил ответы на клиенте, чтобы я мог манипулировать данными ответов на основе того, какая информация отправлена ​​обратно?

Ответы [ 5 ]

4 голосов
/ 04 мая 2009

Мне нравится метод Криса, но я думаю, что могу немного улучшить. Поскольку у вас уже есть 3 отдельных объекта, чтобы уменьшить потребность в перекодировании, вы можете сделать что-то вроде объединения PHP в один файл с помощью include 'page.php' и отправки объекта обратно через JSON со свойствами, названными для каждого из них. (скажем, «имена», «даты» и «нечеткие вещи»). Ваш клиентский код для отправки запроса будет просто содержать все аргументы, которые отправляются вашими 3 функциями по отдельности и отправляются в одном запросе. Возвращенный JSON будет выглядеть примерно так (поместите ваши объекты / массивы / что угодно в закомментированные области):

{
    "names" : {/*stuff needed for names goes in here*/},
    "dates" : {/*stuff needed for dates goes in here*/},
    "fuzzyThings" : {/*all fuzzy things goes in here*/}
}

Как только вы получите это на стороне клиента, так как я предполагаю, что у каждого из них уже может быть функция (или набор функций) для обработки возвращаемых данных, вы сможете вызывать их следующим образом:

function handler(retText) {
    var returnedObject = eval(retText);

    doStuffWithNames(returnedObject.names);
    doStuffWithDates(returnedObject.dates);
    playWithFuzzyThings(returnedObject.fuzzyThings);
}

Кроме того, на стороне PHP вы можете создать единую страницу PHP (без надежды на перекодировку) с помощью:

<?php
    echo '{';
        echo '"names":{';
        include 'names.php';
        echo '},';

        echo '"dates":{';
        include 'dates.php';
        echo '},';

        echo '"fuzzyThings":{';
        include 'fuzzyThings.php';
        echo '}';
    echo '}';
?>

Примечание: Возможно, вам придется отредактировать 3 страницы php, чтобы они правильно проверяли $ _POST и не влияли на функциональность других страниц, если вы этого еще не сделали, я предпочитаю метод if(isset($_POST['whatever'])) { ... }, чтобы проверить, что все было отправлено правильно, таким образом, вы можете включить столько, сколько хотите, и если нет никакого отношения к файлу php (т.е. вы не используете этот раздел на этой странице), то он будет верните пустое свойство, и вы просто не будете его использовать (по сути, делая его "универсальным").

Надеюсь, у тебя все получится!

3 голосов
/ 04 мая 2009

Вы можете отформатировать JSON следующим образом:

"user" : [ {
    "name" : "Harry",
    "hobby" : "Skating"
}, {
    "name" : "Dave",
    "hobby" : "Scuba Diving"
} ],
"news" : [ {
    "date" : "3/13/05",
    "title" : "Blah",
    "postedby" : "Mike",
} ]

А теперь в вашем ответе AJAX:

var data = eval('('+ xhr.responseText +')'); // Ajax response
var user = data.user[0].name; // Harry
var user2 = data.user[1].name; // Dave
var title = data.news[0].title;

Вы можете использовать цикл for для прохождения данных. В приведенном выше примере вы теперь должны увидеть, как вы можете использовать PHP для форматирования JSON с несколькими категориями (пользователь, новости и т. Д.) И возвращать все обратно одним вызовом. Если вы хотите более сложный пример, пожалуйста, обратитесь к этой статье, а также этой .

0 голосов
/ 17 мая 2012

это работа для меня
php код:

//for test
$categoryName = "category";
$idcategory = "1";

 $json = "{'productcategory':[{'categoryname':'".$categoryName."','idcategory':'".$idcategory."'}]}";           
 echo $json; 

JavaScript:

var str = xmlhttp.responseText.trim();
var json = JSON.stringify(eval("(" + str + ")"));
var obj = JSON.parse(json);
alert(obj.productcategory[0].idcategory);
alert(obj.productcategory[0].categoryname);
0 голосов
/ 04 мая 2009

Мне лично нравится метод json, но если вы новичок в json или вам по каким-либо причинам не нравится работать с ним, есть плагин jQuery, разработанный специально для этой цели, под названием jQuery Taconite Plugin

В сообществе Rails есть третий способ, называемый RJS, который не так уж и популярен в наше время и немного устарел, но все еще имеет своих поклонников. Мне интересно, кто-нибудь портировал RJS на PHP или нет?

0 голосов
/ 04 мая 2009

Я думаю, что вы должны сделать JSON-формат в соответствии с этими 3 разделами на странице, идентифицировать их, чтобы после ответа вы могли заполнить их для этих разделов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...