Таким образом, я несколько раз ударяю головой о стол, и я никуда не уйду, поэтому помощь будет действительно оценена.
В приведенном ниже коде есть два обработчика событий jquery, которые сбрасывают запрос ajax. Первый использует GET, а данные, которые он возвращает с сервера, кодируется JSON – он работает нормально. Второй («button # addTx») возвращает причину возникновения ошибки Firebug:
неперехваченное исключение: приглашение [Exception … ", прерванное пользователем" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" местоположение: "JS frame :: resource: //gre/components/nsPrompter.js :: openTabPrompt :: строка 468": нет]
Строка 0
что совсем не помогает. Сценарий на стороне сервера печатает необработанный html на экране, и цель заключается в том, что вместо jquery html replace будет обновлена страница, которая инициирует запрос. Данные корректно добавляются после обновления базы данных, но помимо этого я не знаю. Я переписал его, чтобы попробовать GET и по-прежнему производить ту же ошибку 🙁
Помощь будет потрясающей – спасибо, Саймон
$(document).ready(function(){ $("button.delete").click(function(){ var txid = this.id; var amountID = "#amount" + txid; var amount = $(amountID).html(); // <![CDATA[ var url = "delete.php?txid=" + txid + "&am=" + amount; $.ajax({ type: "GET", url: url, success: function(msg){ txid = "ul#" + txid; $(txid).hide(); var values = msg; var e = "#" + values.category + "AmountLeft"; var a = values.amount; $(e).html(a); } }); }); $("button#addTx").click(function(){ // <![CDATA[ var url = "addTran.php"; //var dataV = var data = "category=" + document.getElementById("category").value + "&what=" + document.getElementById("what").value + "&amount=" + document.getElementById("amount").value + "&date=" + document.getElementById("date").value; $.ajax({ type: "POST", url: "addTran.php", //async: false, data: "category=Groceries&what=Food&amount=2.33&date=2/3/2011", success: function(msg){ $("transList").replaceWith(msg); } }); }); });
и вот скрипт на стороне сервера
<?php session_start(); include('functions.php'); //if the user has not logged in if(!isLoggedIn()) { header('Location: index.php'); die(); } $category = $_POST['category']; $what = $_POST['what']; $amount = $_POST['amount']; $date = $_POST['date']; $category = mysql_real_escape_string($category); $what = mysql_real_escape_string($what); $amount = mysql_real_escape_string($amount); $date = mysql_real_escape_string($date); $date = convertDate($date); //add trans to db include('dbcon.php'); $query = "INSERT INTO transactions ( category, what, amount, date) VALUES ( '$category','$what','$amount','$date');"; mysql_query($query); //grab the remaining amount from that budget $query = "SELECT amount_left FROM cards WHERE category = '$category';"; $result = mysql_query($query); $row = mysql_fetch_array($result, MYSQL_ASSOC); $oldAmountLeft = $row["amount_left"]; //update the amount left $amountLeft = $oldAmountLeft - $amount; mysql_free_result($result); //add new value to db $query = "UPDATE cards SET amount_left = '$amountLeft' WHERE category = '$category';"; mysql_query($query); //generate the list of remaining transactions, print to screen to send back to main page $query = "SELECT txid, what, amount, date FROM transactions WHERE category = ('$category');"; $result = mysql_query($query); while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { $d = convertDateReverse($row["date"]); $what = $row["what"]; $amount = $row["amount"]; $txid = $row["txid"]; ?> <li><ul class="trans" id="<? echo $txid; ?>"><li class="date"><? echo $d; ?></li><li class="what"><? echo $what; ?></li><li class="amount" id="amount<? echo $txid; ?>"><? echo $amount; ?></li><button class="delete" id="<? echo $txid; ?>">Delete</button><li></li></ul></li> <? } mysql_free_result($result); mysql_close(); header("Content-type: application/x-www-form-urlencoded"); //do I need this? I have a " header("Content-type: application/json"); " in the working one ?>
в<?php session_start(); include('functions.php'); //if the user has not logged in if(!isLoggedIn()) { header('Location: index.php'); die(); } $category = $_POST['category']; $what = $_POST['what']; $amount = $_POST['amount']; $date = $_POST['date']; $category = mysql_real_escape_string($category); $what = mysql_real_escape_string($what); $amount = mysql_real_escape_string($amount); $date = mysql_real_escape_string($date); $date = convertDate($date); //add trans to db include('dbcon.php'); $query = "INSERT INTO transactions ( category, what, amount, date) VALUES ( '$category','$what','$amount','$date');"; mysql_query($query); //grab the remaining amount from that budget $query = "SELECT amount_left FROM cards WHERE category = '$category';"; $result = mysql_query($query); $row = mysql_fetch_array($result, MYSQL_ASSOC); $oldAmountLeft = $row["amount_left"]; //update the amount left $amountLeft = $oldAmountLeft - $amount; mysql_free_result($result); //add new value to db $query = "UPDATE cards SET amount_left = '$amountLeft' WHERE category = '$category';"; mysql_query($query); //generate the list of remaining transactions, print to screen to send back to main page $query = "SELECT txid, what, amount, date FROM transactions WHERE category = ('$category');"; $result = mysql_query($query); while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { $d = convertDateReverse($row["date"]); $what = $row["what"]; $amount = $row["amount"]; $txid = $row["txid"]; ?> <li><ul class="trans" id="<? echo $txid; ?>"><li class="date"><? echo $d; ?></li><li class="what"><? echo $what; ?></li><li class="amount" id="amount<? echo $txid; ?>"><? echo $amount; ?></li><button class="delete" id="<? echo $txid; ?>">Delete</button><li></li></ul></li> <? } mysql_free_result($result); mysql_close(); header("Content-type: application/x-www-form-urlencoded"); //do I need this? I have a " header("Content-type: application/json"); " in the working one ?>
в<?php session_start(); include('functions.php'); //if the user has not logged in if(!isLoggedIn()) { header('Location: index.php'); die(); } $category = $_POST['category']; $what = $_POST['what']; $amount = $_POST['amount']; $date = $_POST['date']; $category = mysql_real_escape_string($category); $what = mysql_real_escape_string($what); $amount = mysql_real_escape_string($amount); $date = mysql_real_escape_string($date); $date = convertDate($date); //add trans to db include('dbcon.php'); $query = "INSERT INTO transactions ( category, what, amount, date) VALUES ( '$category','$what','$amount','$date');"; mysql_query($query); //grab the remaining amount from that budget $query = "SELECT amount_left FROM cards WHERE category = '$category';"; $result = mysql_query($query); $row = mysql_fetch_array($result, MYSQL_ASSOC); $oldAmountLeft = $row["amount_left"]; //update the amount left $amountLeft = $oldAmountLeft - $amount; mysql_free_result($result); //add new value to db $query = "UPDATE cards SET amount_left = '$amountLeft' WHERE category = '$category';"; mysql_query($query); //generate the list of remaining transactions, print to screen to send back to main page $query = "SELECT txid, what, amount, date FROM transactions WHERE category = ('$category');"; $result = mysql_query($query); while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { $d = convertDateReverse($row["date"]); $what = $row["what"]; $amount = $row["amount"]; $txid = $row["txid"]; ?> <li><ul class="trans" id="<? echo $txid; ?>"><li class="date"><? echo $d; ?></li><li class="what"><? echo $what; ?></li><li class="amount" id="amount<? echo $txid; ?>"><? echo $amount; ?></li><button class="delete" id="<? echo $txid; ?>">Delete</button><li></li></ul></li> <? } mysql_free_result($result); mysql_close(); header("Content-type: application/x-www-form-urlencoded"); //do I need this? I have a " header("Content-type: application/json"); " in the working one ?>
ПРОБЛЕМА РЕШЕНА: поэтому в разметке html форма, в которой хранятся поля данных, должна иметь
onsubmit="return false;"
в этом!
Спасибо всем парням за помощь, я внедрил все ваши предложения, и мой код теперь намного меньше и проще в управлении!
ура
Саймон
Thx для публикации решения. Точно так же ударило головой, пытаясь решить подобную проблему с NS_ERROR_NOT_AVAILABLE без везения. Полезно для людей, использующих Django <-> Javascript для выполнения XMLHttpRequests. На стороне Джанго есть
error: [Errno 32] Broken pipe
…, который соответствует NS_ERROR, который появляется в консоли Firebug для сбоя JS. (googleBait) Трудно узнать, с чего начать трассировку проблемы – на стороне сервера или на стороне клиента.
Thx снова.