跟踪点击,使用 PHP 和 jQuery 构建点击热图

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。从 价值 200 美元的免费积分开始!

这个演示和文章最初由 Jay Salvat 创建,可以在 此处查看法语版本。感谢 Jay!

计划

  • 记录鼠标指针在网页上点击时的 X 和 Y 坐标。
  • 将这些坐标保存到数据库。
  • 当被调用时,在网页上显示一个“点击热图”,以视觉方式显示这些点击的位置。

为什么?

因为它是一个很酷的概念验证。您应该在生产环境中使用它并以此为基础做出重大设计决策吗?也许不,但我可以看到它在某些情况下用作检查用户行为的工具。

查看演示下载文件

技术

该网站将使用 PHP 构建。我们需要 PHP 有几个原因。最重要的是我们需要一个服务器端语言来处理数据库的保存和检索。此外,我们将把数据库交互抽象到一个单独的文件中,以保持代码整洁。PHP 使我们能够在这些文件之间来回发布变量。

我们将使用 jQuery 类型的 JavaScript 来跟踪鼠标点击并将点击数据发布到执行数据库保存的 PHP 文件。jQuery 还将帮助我们显示覆盖层并放置我们将用来显示点击位置的小图形。

构建数据库

我们的代码不会自动创建您需要的表格,您需要自己创建一个数据库和结构。以下是 SQL

CREATE TABLE  `clickmap` ( 
  `id` int(10) unsigned NOT NULL auto_increment, 
  `x` smallint(4) unsigned NOT NULL, 
  `y` smallint(4) unsigned NOT NULL, 
  `location` varchar(255) NOT NULL, 
  PRIMARY KEY  (`id`), 
  KEY `location` (`location`) 
)

为了演示,我们尽可能地简化了操作。如果您想扩展这个想法,您可能还想为此表添加更多信息,例如 IP 地址和日期/时间,这样您就可以为每个点击获得更详细的信息。

标记(正在跟踪的页面)

这里只是一些我们用来工作的结构。我们将链接到一个 CSS 文件,加载 jQuery,链接到我们自己设计的 JavaScript 文件,以及在这里设置一个编写 JavaScript 的地方,并在页面中添加一些内容。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Click Map Demo</title>
    <link rel="stylesheet" type="text/css" href="style.css" />
    <script src="//www.google.com/jsapi" type="text/javascript"></script>
    <script type="text/javascript" src="js/jquery.js">
    <script type="text/javascript" src="js/clickmap.js"></script>
    <script type="text/javascript">
        $(function() {
            // do stuff
        });
    </script>
</head>
<body>
    <img src="images/baywatch.jpg" alt="baywatch" />
    <p class="button displayClicks"><a href="#demo">Display Click Map</a></p>
</body>
</html>

那里没有太多内容,只是一张海滩救护队的照片和一个简单的按钮。

jQuery JavaScript

JavaScript 将为我们做两件主要事情:保存点击显示点击

保存点击

为了提高效率,我们将抽象成两个不同的函数,我们可以随时调用它们。一个是用于开始保存点击,另一个是用于停止保存点击。

(function($) { 

$.fn.saveClicks = function() { 
    $(this).bind('mousedown.clickmap', function(evt) { 
        $.post('/examples/ClickMap/clickmap.php', {  
            x:evt.pageX,  
            y:evt.pageY,  
            l:escape(document.location.pathname) 
        }); 
    }); 
}; 
 
$.fn.stopSaveClicks = function() { 
     $(this).unbind('mousedown.clickmap'); 
};

})(jQuery); 

我们将 mousedown 事件绑定到它被调用的元素(它将是整个文档),然后使用 jQuery 的 post 函数 将一些数据(坐标)发送到一个特殊的文件(clickmap.php)。真的很棒,人们永远不会知道,但每次点击都会将数据发送回服务器。

显示点击

同样,两个函数。一个是负责创建覆盖层并显示点击图形(PHP 发送所有数据,但 jQuery 做附加操作)。另一个则删除所有内容。我们使用的是 jQuery get 函数

$.displayClicks = function(settings) { 
    $('<div id="clickmap-overlay"></div>').appendTo('body'); 
    $('<div id="clickmap-loading"></div>').appendTo('body'); 
    $.get('/examples/ClickMap/clickmap.php', { l:escape( document.location.pathname) },  
        function(htmlContentFromServer) { 
            $(htmlContentFromServer).appendTo('body');     
            $('#clickmap-loading').remove(); 
        } 
    ); 
}; 
 
$.removeClicks = function() { 
    $('#clickmap-overlay').remove(); 
    $('#clickmap-container').remove(); 
}; 

启动所有内容

我们将在页面上包含一些 JavaScript 来启动所有内容。

<script type="text/javascript">
    $(function() {
        $(document).saveClicks(); 
    
        $('.displayClicks').click(function() {
            $.displayClicks();
            $('#clickmap-overlay').click(function() {
                 $.removeClicks();
                 $(document).saveClicks();
            });
            $(document).stopSaveClicks();
            return false;
        });
    });
</script>

PHP

现在,我们看到了 POST 和 GET 来自我们尚未看到的 PHP 文件的代码。这种神奇的操作发生在一个名为clickmap.php的文件中。无论哪种情况,我们都需要连接到数据库,然后关闭该连接。其余部分取决于我们是在 POST 还是 GET。

<?php 
    $DB = mysql_connect("localhost", "db_user", "db_password"); 
    mysql_select_db("db_name", $DB);     
    
    if (isset($_POST['l'])) { 
        $query = sprintf("  INSERT INTO clickmap  
                            SET x = '%s', y = '%s', location = '%s'",  
                            $_POST['x'], $_POST['y'], $_POST['l']);        
        $result = mysql_query($query);
    };
        
    if (isset($_GET['l'])) { 
        $query = sprintf("  SELECT x, y FROM clickmap  
                            WHERE location = '%s' 
                            ORDER BY id DESC
                            limit 200",  
                            $_GET['l']); 
        $results = mysql_query($query); 
             
        $html = '<div id="clickmap-container">'; 
        while ($row = mysql_fetch_array($results)) { 
        $html .= sprintf('<div style="left:%spx;top:%spx"></div>', $row['x'] - 10, $row['y'] - 10); 
    } 
        $html .= '</div>'; 
         
        echo $html; 
    };  
   
    mysql_close($DB); 
?>

相当直接……当 POST 时,将数据保存到数据库。当 GET 时,检索数据。在这个演示中,我们只获取了最近的 200 个点击,但您可以根据需要更改或删除此限制。在这里,您可以看到覆盖层出现时每个点击图形如何定位自身。点击产生时保存的确切坐标数据用于设置 CSS 的“top”和“left”值。

CSS

实际的点击热图内容在样式方面不需要太多。只有覆盖层本身、一个加载区域(如果获取所有点击数据需要一段时间)以及点击本身的小图形。

#clickmap-overlay { 
    position:fixed; 
    top:0; left:0; 
    width:100%; height:100%;  
    background-color:#000; 
    filter:alpha(opacity=70); opacity: 0.7; 
} 

#clickmap-loading { 
    position:fixed; 
    top:0; left:0; 
    width:100%; height:100%;  
    background:transparent url(images/loading.gif) no-repeat center center; 
} 

#clickmap-container div { 
    position:absolute; 
    width:20px; height:20px; 
    background:transparent url(images/click.png) no-repeat center center; 
} 

综合

我知道有时阅读所有代码示例可能会让人觉得很头疼和困惑。与往常一样,欢迎您下载代码并查看所有内容的上下文,这样会更容易理解。再次特别感谢 Jay Salvat 为这个想法的最初创作做出的贡献。Jay 是一位 35 岁的网页开发人员,住在法国里维埃拉,是 Kuantic 的首席开发人员。他是非常酷的 markItUp! jQuery 富文本编辑器和新项目 Sunday Morning(即将推出)的创建者。

查看演示下载文件