1

用户完成一个测验表格并点击“分数测验”链接。想要的是计算分数,通过 jQuery ajax 调用将结果发送到服务器,以及呈现用户通知的花式框。

正在发生的事情是计数完成并启动 ajax 调用并重新加载页面。如果我注释掉 ajax 调用,fancybox 会根据需要出现。使用 WordPress 3.4.2。

可能会发生什么?

    jQuery('#checkQuiz').click(function(){
        var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
        // tally correct answers
        var quizData = tallyScore();
        // display user notice
        jQuery('a#hiddenAnchor').trigger('click');
        // store the data while the user is reading the results display
        jQuery.ajax({
            type:"post", 
            url:ajaxurl, 
            data:quizData
        });
        return false;
    });

注意 1:我能够在 Firebug 控制台中发现一个错误:

NS_ERROR_XPC_NOT_ENOUGH_ARGS: Not enough arguments [nsIDOMLocation.replace]

报告的文件是 jQuery.js,似乎是 1.7.2 版本。我注意到 jQuery 当前版本是 1.8.1。我想知道这是否是问题的一部分。

注意 2:我忘了提到此代码是子主题中页面模板的一部分。在 Web 应用程序的其他页面上进行的类似 ajax 调用工作正常。我在Wordpress.org 故障排除论坛上添加了一个帖子,以防有人不访问 stackoverflow。

注意 3:我使用 wordpress “twentyeleven”的标准主题对此进行了测试。发生了同样的错误。我用完了可供测试的选项。

4

2 回答 2

2

你应该试试:

jQuery('#checkQuiz').click(function(e){
    var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
    // tally correct answers
    var quizData = tallyScore();
    // display user notice
    jQuery('a#hiddenAnchor').trigger('click');
    // store the data while the user is reading the results display
    jQuery.ajax({
        type:"post", 
        url:ajaxurl, 
        data:quizData
    });
    e.preventDefault()
    return false;
});

使用e.preventDefault应该阻止页面重新加载。

请注意,我对您的代码进行了两次更改。我添加e到您的回调函数的参数列表和e.preventDefault该函数的末尾。

于 2012-09-18T20:49:35.183 回答
1

经过测试和分解涉及的代码,发现错误是在传入ajax调用的数据数组中。为了帮助任何寻求类似错误答案的人,这是我在代码中找到的。

quizData 是为 WordPress ajax 处理程序构建的数组。

找到的代码

var quizData = {
    action: 'save_quiz',
    item: invoice_item,
    lesson: jQuery("#lesson"),
    score: ratio };

这段代码有两个问题。首先,jQuery 调用将一个 jQuery对象分配给数组值元素“课程”。这会在创建错误条件的数组中产生一个“未定义”值。这里缺少的是“.val()”函数调用。

第二个可能是项目的代码架构,但似乎数组汇编块中的 jQuery 调用无法按预期工作。在我的测试中,数据数组包含一个空值。

解析度

var lesson_id = jQuery("#lesson").val();
var quizData = {
    action: 'save_quiz',
    item: invoice_item,
    lesson: lesson_id,
    score: ratio };

我希望这可以帮助别人。

于 2012-09-22T16:17:03.137 回答