微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaScript JQuery Ajax问题:POST在Firefox,IE,Safari中运行良好,但不适用于Chrome

我是 JavaScript的新手,并与一些开发人员一起开展业余爱好项目.我们有一个简单的页面,用于向数据库提交请求.

我决定尝试学习JQuery,并开始在这个请求页面中实现一些AJAX功能.它在FireFox,IE和Safari中运行良好,但由于一些奇怪的原因,我无法在Chrome中使用它.

我现在已经调试了几个小时,我不知道为什么它不起作用.这是HTML表单的相关部分(由于JavaScript而删除了帖子操作):

<form method="POST">
            <input type="text" name="amount" value="0" size="7" />
            <input type="submit" value="Fulfill!" /><br />
            <input type="hidden" name="index" value="69" />
            <input type="hidden" name="item" value="Iron Ore" />
        </form>

这是它发布的PHP表单:

<?PHP
require_once("../classes/Database.PHP");
$database = new Database();

$amount = $database->sanitizeString($_POST['amount']);
$index = $database->sanitizeString($_POST['index']);
$username = $database->sanitizeString($_POST['username']);
$item =  $database->sanitizeString($_POST['item']);
$database->connect();
$database->setRequest($amount,$index,$username,$item);
$database->setKarma($username,$amount,$item);
?>

最重要的是,这是我的新手JavaScript代码,它只是在HTML文件中:

<script language="JavaScript">
    var amount = 0;
    var index = 0;
    var item = 0;
    var username = "";
    var data = "";
    $(document).ready(function(){
        $("form input[type=submit]").click(function(){
            amount = $(this).siblings("input[name=amount]").val();
            index = $(this).siblings("input[name=index]").val();
            item = $(this).siblings("input[name=item]").val();
            username = "<?=$_SESSION['username']; ?>";
            //var stuff = $.post("pages/ajaxfulfill.PHP",{amount:amount,index:index,item:item,username:username},function(data){alert(data)},"html");
            var stuff = $.ajax(
                                    {
                                        url: "pages/ajaxfulfill.PHP",type: "POST",data:"amount=" + amount + "&index=" + index + "&item=" + item + "&username=" + username,success: function(data)
                                        {
                                            alert("Success")
                                        },error: function (XMLHttpRequest,textStatus,errorThrown)
                                        {
                                            alert("error" + XMLHttpRequest.status);
                                            alert("error" + XMLHttpRequest.responseText);
                                        }
                                    }
                               )
            $(this).parents("td").text("Submitted");

        });

    });

</script>

起初,我使用了注释掉的$.post函数,该函数适用于上述浏览器.我试图在调试过程中切换到$.ajax函数,并发现FF,IE和Safari总是返回“成功”警报,而Chrome返回状态为0且空白响应的错误.

作为一个JavaScript新手,我完全迷失了为什么会失败.如果有人能指出我正确的方向,你会得到我深深的敬意和祝福.谢谢.

解决方法

您似乎没有阻止提交按钮上的认操作.因此,在单击函数触发后,表单仍然会提交,可能会取消您的XMLHttpRequest.

(这里的跨浏览器可能会有所不同,在函数结束时通过调用text()函数页面删除表单.是否应该停止提交表单?不知道……某些浏览器可能,但没有说明这么说.)

使用event.preventDefault();在传递给处理函数(event){…}的参数上停止按钮点击进行提交表单.

但是不要将表单提交代码绑定到输入按钮.您的脚本可能(取决于浏览器和表单的其他属性)无法触发其他类型的提交,例如Enter press.始终使用表单上的submit事件绑定验证和AJAX表单替换. event.preventDefault();仍然适用.

省略< form>的action属性是无效的;浏览器通常会选择要提交的现有页面的URL.如果您想要没有表单的表单字段提交(并且您不需要无线电输入),只需省略< form>元件.但实际上你应该使用渐进增强:首先使用普通的HTML,使用正确的方法=“POST”action =“ajaxfulfill.PHP”使表单工作,然后在其上构建一个简单的AJAX函数.

username = "<?=$_SESSION['username']; ?>";

脚本注入.代替:

username= <?= json_encode($_SESSION['username'],JSON_HEX_TAG); ?>

和:

data:"amount=" + amount + "&index=" + index + "&item=" + item + "&username=" + username,

您需要对URL-encoded-form-submission中的每个值使用encodeURIComponent(…),否则特殊字符会破坏它.最好让jQuery为您做到这一点:

data: {amount: amount,index: index,item: item,username: username},

甚至更简单,删除field.val()的所有手动读取,只需使用现有的serialize功能为您完成所有操作:

data: $(this).serialize(),

(假设现在这是你正在处理提交的形式……如果它是提交按钮,你必须说$(this.form).)

你真的想从用户提交的POST数据中获取用户名吗?除非用户名是故意无安全的,否则从会话中获取它似乎更好.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐