jquery $.post не работает в некоторых браузерах

#jquery #post

#jquery #Публикация

Вопрос:

  $(document).ready(function(){
     $("#btnc").click(function(){
            $.post("php/snova_campanha.php", {campanha : $("#campanha").val() },
                function(data){
                    if(data == "1" )
                    {
                        alert(data);
                    }
                    else
                        alert(data);
                });
     });
});
  

php имеет только:

 <?php
echo 0;
return;
?>
  

HTML:

 <div id="corpo" align="center">
    <br/><br/>
    <h1 align="center" style="color:#F8F8F8">Nova Campanha</h1>
    <br/><br/><br/>
    <form id="novacamp">
        <label style="color:#F8F8F8" for="campanha">Nome</label>
        <input align="middle" size="35" type="text" name="campanha" id="campanha"/>
        <br/>
        <input type="submit" id="btnc" value="OK"/>
    </form>
</div>
  

Я использую этот php только для тестов, я осуществлю вставку в базу данных и верну 1 с успехом или 0.

Ну, у меня есть две страницы, другая работает нормально:

РАБОЧИЕ СТРАНИЦЫ ВХОДА:

  $(document).ready(function(){
     $("#login").click(function(){
        $("#login").attr("disabled", "disabled");
                $.post("php/slogin.php", {usuario : $("#usuario").val(), senha : $("#senha").val()},
                function(data){
                    if(data != "1" amp;amp; data != "0")
                    {
                        alert(data);
                        $("#login").removeAttr("disabled");
                    }
                    else
                        window.location = "principal.php";
                });
     });
});
  

HTML

 <div id="bar">
    <div id="container">
        <!-- Login Starts Here -->
        <div id="loginContainer">
            <img id="logoNetradio" src="../images/logonetradio3.png"/>
            <br/><br/><br/>
                <form id="formLogin">
                    <label for="usuario">Usuário</label>
                    <input align="middle" size="35" type="text" name="usuario" id="usuario"/>
                    <br/><br/>
                    <label for="senha">Senha</label>
                    <input align="middle" size="35" type="password" name="senha" id="senha" />
                    <br/>
                    <input type="submit" id="login" value="Login"/>
                </form>
        </div>
        <!-- Login Ends Here -->
    </div>
</div>
  

Я не вижу никакой разницы………
Когда я запускаю нерабочий код, адрес в моих браузерах меняется на www.myaddress.com/current_page.php?campanha=value_on_textfield
похоже, что $.post отправляет запрос GET на текущей странице…
Оба кода работают в IExplore
и рабочие страницы работают в Chrome и IE, но не в firefox….
Есть идеи?

Комментарии:

1. какую версию jQuery вы используете?

2. Кроме того, чтобы проверить, действительно ли .post() не работает, вы должны поместить alert (typeof data); в качестве первой строки в вашей функции обратного вызова. И если у вас есть firebug, возможно, стоит использовать консоль. журнал вместо предупреждения.

3. если я добавлю какое-либо предупреждение (что угодно) в свой метод обратного вызова, оно никогда не появится

4. Правильный способ переключить отключенный атрибут — вызвать $(«#login»).prop(«отключено», true); — в настоящее время предполагается использовать логические атрибуты .prop(), как описано в журнале изменений jquery 1.6.1.

5. Я только что открыл firebug и увидел, что запрос и ответ от php в порядке ……. функция обратного вызова, которая не вызывается

Ответ №1:

На самом деле, return false имеет некоторые побочные эффекты в обработчиках событий jQuery, о которых большинство людей не знают. Если все, что вы хотите сделать, это запретить отправку формы, тогда вам следует использовать event.preventDefault() .

Чтобы облегчить вам жизнь, я бы рекомендовал изменить ваш PHP-файл, чтобы возвращать json, вот так:

 <?php
echo "{'status':'0'}";
?>
  

Затем укажите ‘json’ при выполнении post:

 $(document).ready(function(){
     $("#btnc").click(function(evt){
            $.post(
                "php/snova_campanha.php", 
                {campanha : $("#campanha").val() },
                function(data){
                   alert(data.status);
                },
                "json"
            );
            // Keep the form from submitting
            evt.preventDefault();
     });
});
  

Кроме того, я посоветую заглянуть в отличный плагин jQuery form от malsup, который выполняет большую часть того, что вы пытаетесь здесь сделать.

Наконец, вы можете попробовать использовать полный $.ajax вызов вместо $.post :

 $('#btnc').click(function(evt) {
   $.ajax({
       method: 'POST',
       url: 'php/snova_campanha.php',
       data: {
           campanha: $('#campanha').val()
       },
       dataType: 'json',
       success: function(data, status) {
           alert(data);
       },
       error: function(jqXHR, status, err) {
           alert('ERROR');
           alert(String(err));
       }
   });
   evt.preventDefault();
});
  

Вероятно, происходит то, что $.post вызов выдает ошибку. Использование $.ajax указанного выше способа позволит вам перехватить эту ошибку.

Комментарии:

1. он больше не выполняет GET, но post по-прежнему не выполнял post

2. отличный плагин, я попробую его только сейчас

3. Я изменил код, открыл firebug и увидел, что запрос и ответы работают, но функция обратного вызова не вызывается

Ответ №2:

click Событие вашей кнопки должно вернуться false , если намерение состоит в том, чтобы не разрешить кнопке отправлять форму.

Комментарии:

1. Я хочу, чтобы кнопка выполняла запрос post… Я попытался добавить ‘return false’ в событие click, но это не сработало

2. @fredcrs вы уверены, что возврат был последней строкой обратного вызова? Возврат остановит выполнение этой функции после этой точки.

3. @fredcrs Нет, я не думаю, что вы понимаете. Кнопка запустит инициированную вами команду $.post, но все это происходит внутри формы, которая публикует саму форму. И мой ответ неверен… Я забыл об этом, поскольку я не использую input [type=submit] при запуске ajax-команды. Брайан Росс прав, используя event.preventDefault(), чтобы остановить отправку самой формы.

4. хорошо, я понял. Запрос выполняется нормально, в firebug я получил ответ из PHP, теперь в JSON, как сказал Брайан Росс …. но по-прежнему функция обратного вызова не вызывается…