#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, как сказал Брайан Росс …. но по-прежнему функция обратного вызова не вызывается…