当点击链接时,AJAX鼠标按下调用被取消

时间:2011-09-12 作者:Tom Auger

我试图跟踪注册用户的活动,特别是当他们单击指向下载文件的链接时。文件系统插件是WP Filebase。

我发现,当我通过jQuery添加click()处理程序时,它并没有发生,所以我切换到mousedown()处理程序来进行基于Ajax的跟踪。

看起来发生的情况(基于Firebug的网络活动监视器)是,如果我按下鼠标(mousedown)然后释放,生成的文件下载对话框将取消mousedown活动(网络选项卡将mousedown Ajax调用显示为“已取消”)。因此,Ajax调用从未到达服务器,因此我无法获得跟踪。

另一方面,如果我按下鼠标一段时间不释放,我会看到我的测试Ajax响应(alert())。

由于明显的原因,这是不可行的。还有其他解决方案吗?鼠标向下和锚定单击可以一起工作吗,还是一个总是取消另一个?

编辑,下面是一些我描述的代码(linkx.js):

(function($) {
    $(document).ready(function(){
        $(\'.wpfilebase-attachment a\').mousedown(function(){
            var postParams = {};
            postParams[\'action\'] = ZGAjax.TRACKING_ACTION;
            postParams[ZGAjax.FILE_ID_PARAM] = this.id;

            $.post(
                ZGAjax.ajaxurl, 
                postParams,
                function( response ) {
                    alert( response );
                }
            );

            return true;
        });

    });
})(jQuery);
php端的处理程序。。。

// Add AJAX tracking of file downloads.
// First, add the link tracking script and create a global namespace to hold the admin_url() for the AJAX call
if (!is_admin()) add_action(\'wp_enqueue_scripts\', \'gsn_add_tracking_script\');
function gsn_add_tracking_script(){
    wp_enqueue_script( \'zg-link-tracker\', SCRIPTS_URI . \'/linkx.js\', array(\'jquery\'), \'1.0\' );
    wp_localize_script( \'zg-link-tracker\', \'ZGAjax\', array( 
        \'ajaxurl\' => admin_url( \'admin-ajax.php\' ),
        \'TRACKING_ACTION\' => TRACKING_ACTION,
        \'FILE_ID_PARAM\' => FILE_ID_PARAM
    ) );
} 

 // Works in conjunction with linkx.js
 add_action( \'wp_ajax_\' . TRACKING_ACTION, \'gsn_track_downloads\' );

function gsn_track_downloads() {
    // get the submitted parameters
    $file_id = $_POST[FILE_ID_PARAM];

    // generate the response
    $response = json_encode( array( \'success\' => true, \'file_id\' => $file_id ) );

    // response output
    header( "Content-Type: application/json" );
    echo $response;

    // IMPORTANT: don\'t forget to "exit"
    exit;
}
PHP方面是很好的教科书,实际上只是给了我一个确认,证明它是有效的。

如果我按住鼠标键足够长的时间以完成整个事务,它确实会起作用。如果我发布,并允许下载开始,我永远不会得到确认。Firebug告诉我Ajax请求已被“取消”,所以这甚至不是一个在下载事务之上进行事务备份的问题(这在一开始是一个疯狂的理论)。

1 个回复
最合适的回答,由SO网友:EAMann 整理而成

最好不要混淆你的点击/鼠标操作。在过去,当面对同样的问题时,我使用了两种方法之一(取决于我当时的心情):

鼠标悬停而非使用mousedown, 使用jQuery\'s mouseup event. Mousedown 通常由click. 通过使用mouseup 相反,在释放鼠标(通常在click 或者就在之后),不应该遇到同样的问题。

直接绑定到click

这是我最常使用的一个。循环浏览页面上的锚定标记并更改其事件绑定。您可以设置click 每个链接的事件首先触发AJAX调用,然后(完成后)触发原始事件。

例如:

jQuery(document).ready(function($) {

    $(\'a\').bind(\'click\', function(e) {

        // Do your AJAX stuff

        return true;
    });

});
由于您使用的是jQuery,请确保async: false 使用AJAX时。这将强制浏览器在继续加载链接之前执行请求。

如果您使用的是表单,则可以轻松地解除绑定/重新绑定submit handler。。。不幸地click 不太合作。

结束