PHP-скрипт получает два ajax-запроса, возвращает только один? - PullRequest
0 голосов
/ 24 июня 2009

Начну с самого начала. Я создаю плагин для WordPress, который выполняет двойную функцию, так как его можно вставить в сообщение с помощью шорткода или добавить в качестве виджета боковой панели. Все, что он делает, это выводит некоторые js для выполнения запросов jquery.post в локальный php файл. Локальный php-файл запрашивает данные у веб-службы. (Я должен был сделать это таким образом, вместо того, чтобы напрямую запрашивать веб-сервис с помощью jquery.ajax, потому что URL содержит лицензионный ключ, который был бы общедоступным, если бы он был помещен в js).

В любом случае, когда я просматриваю страницу в блоге WordPress, на которой есть виджет боковой панели и вывод плагина с помощью шорткода, работает только один из запросов. Я имею в виду, что это работает в том, что он получает ответ от сценария php. Когда страница загружена, они оба работают нормально, когда вручную сообщают.

Просмотр веб-страницы -> отправить 2 почтовых запроса в мой php-скрипт -> оба элемента должны быть заполнены, но только один из них.

Мой PHP-скрипт просто:

<?php
    if(isset($_POST["zip"])) {
         // build a curl object, execute the request, 
         // and basically just echo what the curl request returns.
    }
?>

Довольно простой.

вот некоторые js, которые некоторые хотели увидеть:

function widget_getActivities( zip ){
    jQuery("#widget_active_list").text("");
    jQuery.post("http://localhost/wordpress/wp-content/ActiveAjax.php", { zip: zip}, 
        function(text) {
            jQuery(text).find("asset").each(function(j, aval){
                var html = "";
                html += "<a href='" + jQuery(aval).find("trackback").text() + "' target='new'> " +  jQuery(aval).find("assetName").text() + "</a><b> at </b>";

                jQuery("location", aval).each(function(i, val){
                    html += jQuery("locationName", val).text() + " <b> on </b>";
                });

                jQuery("date", aval).each(function(){
                    html += jQuery("startDate", aval).text();
                <!--jQuery("#widget_active_list").append("<div id='ActivityEntry'>" + html + " </div>");-->
                jQuery("#widget_active_list")
                    .append(jQuery("<div>")
                        .addClass("widget_ActivityEntry")
                        .html(html)
                        .bind("mouseenter", function(){
                            jQuery(this).animate({ fontSize: "20px", lineHeight: "1.2em" }, 50);  
                        })
                        .bind("mouseleave", function(){
                            jQuery(this).animate({ fontSize: "10px", lineHeight: "1.2em" }, 50);  
                    })
                    );

                });
            });
        });
}

Теперь представьте, что есть другая функция, идентичная этой, за исключением того, что все, что предшествует 'widget_', не добавлено. Эти две функции вызываются отдельно через:

jQuery(document).ready(function(){
    w_zip = jQuery("#widget_zip").val();
    widget_getActivities( w_zip );
    jQuery("#widget_updateZipLink").click(function() { //start function when any update link is clicked
        widget_c_zip = jQuery("#widget_zip").val();
        if (undefined == widget_c_zip || widget_c_zip == "" || widget_c_zip.length != 5)
            jQuery("#widget_zipError").text("Bad zip code");
        else
            widget_getActivities( widget_c_zip );

    });
})

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

РЕДАКТИРОВАТЬ: Я пришел к неоптимальному решению. У меня есть виджет, который определяет, используется ли плагин на странице, и если это так, то он ждет 3 секунды, прежде чем выполнить запрос. Но я чувствую, что это произойдет, если несколько клиентов одновременно выполнят запрос страницы, который вызовет один из запросов к моему php-скрипту, потому что я считаю, что проблема в php-скрипте, который страшен.

1 Ответ

1 голос
/ 24 июня 2009

Не достаточно информации для меня, чтобы что-то выяснить ...

Однако стоит попробовать получить firebug и посмотреть, каков ответ на каждый из запросов.

Другой вопрос может быть ... вы заполняете по id? Если это так, то это может быть связано с тем, что у вас есть один и тот же идентификатор дважды на одной странице, и это все портит. Если он у вас есть в Интернете, вам будет намного легче помочь.


Edit:

Несколько комментариев ... Я не уверен, что это что-то решит ... однако ...

 <!--jQuery("#widget_active_list").append("<div id='ActivityEntry'>" + html + " </div>");-->

Насколько мне известно, тип используемого вами комментария эффективен только при использовании в html и может испортить ваш Javascript. Заменить его на //

jQuery("#widget_active_list").append(jQuery("<div>")
                                     .addClass("widget_ActivityEntry")
                                     .html(html)
                                     .bind("mouseenter", function(){
                                          jQuery(this).animate({ fontSize: "20px", lineHeight: "1.2em" }, 50);  
                                     })
                                     .bind("mouseleave", function(){
                                          jQuery(this).animate({ fontSize: "10px", lineHeight: "1.2em" }, 50);  
                                     })
                             );

Во-вторых, весь этот блок вложен в последний .each, который, кажется, не оказывает влияния, однако, не исключено, что он возится с ним.

И наконец, хотя это может и не иметь значения, вам, вероятно, следует установить тип ответа xml. Использование обоих заголовков http в php и использование последнего аргумента функции. т.е.

header("Content-Type: application/xml");

и

jQuery.post("http://localhost/wordpress/wp-content/ActiveAjax.php", { zip: zip}, thefunctionhere, xml);

Если это не поможет, я предлагаю неоптимальное решение - вместо этого использовать запрос get и добавить случайный параметр, который не учитывается в обоих запросах, однако сделайте его одинаковым для каждого запрос, но разные каждый раз, когда вы идете на страницу. Таким образом, браузер будет кэшировать запрос для первого и не будет запрашивать сервер во второй раз, но он не будет кэшировать его, когда человек снова заходит на страницу.

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