AJAX POST 处理程序导致“未捕获的异常”

Posted

技术标签:

【中文标题】AJAX POST 处理程序导致“未捕获的异常”【英文标题】:AJAX POST handler causing "uncaught exception" 【发布时间】:2011-07-29 13:40:51 【问题描述】:

因此,我已经在办公桌上撞了几个小时,但我无处可去,因此非常感谢您的帮助。

下面的代码有两个触发 ajax 请求的 jquery 事件处理程序。第一个使用 GET 并且它从服务器返回的数据是 JSON 编码的 - 它工作正常。第二个(“button#addTx”)返回导致 Firebug 产生这个错误:

未捕获的异常:[异常... “提示被用户中止” nsresult: “0x80040111(NS_ERROR_NOT_AVAILABLE)” 位置:“JS框架:: 资源://gre/components/nsPrompter.js :: openTabPrompt :: 第468行”数据: 没有]

第 0 行

这根本没有帮助。服务器端脚本将原始 html 打印到屏幕上,目的是使用 jquery html 替换来更新到发起请求的页面。随着数据库的更新,数据被正确发布,但除此之外我一无所知。我已经重写它以尝试 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

?>

【问题讨论】:

您不使用jQuery's ajax 有什么原因吗?它会让你的生活更轻松。此外,最后的 header() 调用不应该在那里。如果要设置,请将其放在顶部,并且 Content-type 应为 text/html 也许是个愚蠢的问题,但如果你使用 jQuery,为什么不直接使用 jQuery 的 ajax 函数呢?这样可以省去很多麻烦。 哦,输入所有这些数据的 html 是:
&lt;select id="category"&gt; &lt;option&gt;Groceries&lt;/option&gt; &lt;option&gt;Petrol&lt;/option&gt; &lt;option&gt;Life&lt;/option&gt; &lt;/select&gt; What: &lt;input type="text" id="what" /&gt; Amount: &lt;input type="text" id="amount" /&gt; Date: &lt;input type="text" id="date" /&gt; &lt;button id="addTx"&gt;Add&lt;/button&gt; &lt;/form&gt;
您好 Jeroen 和 Jesse,感谢您的回复 - 我没有使用这些功能,因为我昨天才开始使用 jquery,所以没有研究它 - 我会研究它。可能有助于解决错误。我还将在最后删除标题类型。谢谢 您在 Firebug 中看到的错误是来自请求的响应选项卡吗?如果没有,“响应”选项卡中有什么?当您同步导航到页面(或者更确切地说,将表单发布到页面)时会发生什么?在不使用 Ajax 的情况下转到有问题的页面有助于确保它是可靠的,然后再添加异步调用的复杂性。 【参考方案1】:

问题已解决:因此在 html 标记中,包含数据字段的表单应该有一个

onsubmit="return false;"

在里面!

感谢所有帮助人员,我已经实施了您的所有建议,我的代码现在变得更小更易于管理!

干杯

西蒙

【讨论】:

提交时,wtf?嗯,谢谢你发布这个,你拯救了我的一天! jQuery("#form").submit(function() return false; ); 最糟糕的是,当您执行 jQuery.ajax POST 请求时,Mozilla 中会显示错误。但是,如果您执行 jQuery.get GET 请求,它不会显示,但是当您实现此代码时,它会纠正两种方式。在 IE 中,它只是表明您有错误。我没试过 Chrome。 通过这样做,您不需要阻止提交(以防表单上的其他事情需要调用提交),而是阻止 AJAX 事件中的默认行为只打电话。我不确定这段代码是否适用于所有人... jQuery("#").click(function(e) e.preventDefault(); );【参考方案2】:

感谢您发布解决方案。同样地,我试图用 NS_ERROR_NOT_AVAILABLE 解决类似的问题,但没有运气。对于使用 Django javascript 来执行 XMLHttpRequests 的人也很有用。在 Django 方面,有一个

   error: [Errno 32] Broken pipe 

...对应于 NS_ERROR 出现在 JS 故障的 firebug 控制台中。(googleBait) 很难知道从哪里开始跟踪问题 - 服务器端或客户端。

再次感谢。

【讨论】:

以上是关于AJAX POST 处理程序导致“未捕获的异常”的主要内容,如果未能解决你的问题,请参考以下文章

Winform 全局异常捕获

osx上的c ++未捕获异常

WPF捕获全局未处理异常

Android视图:未捕获的处理程序:线程主因未捕获的异常而退出

在 Chrome 中超时 Ext.Ajax.request 后未捕获的异常

20172322 2017-2018-2 《程序设计与数据结构》第九周学习总结