Klicks verfolgen, eine Klickmap mit PHP und jQuery erstellen

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Diese Demo und der Artikel wurden ursprünglich von Jay Salvat erstellt und sind hier auf Französisch zu sehen. Danke, Jay!

Der Plan

  • Erfassen der X- und Y-Koordinaten des Mauszeigers, wenn auf eine Webseite geklickt wird.
  • Speichern Sie diese Koordinaten in einer Datenbank
  • Wenn aufgerufen, zeigen Sie eine "Klickmap" über der Webseite an, die die Positionen dieser Klicks visuell darstellt.

Warum?

Weil es ein cooles Proof of Concept ist. Sollten Sie dies in der Produktion verwenden und wichtige Designentscheidungen darauf basieren? Vielleicht nicht, aber ich kann es mir als Werkzeug zur Untersuchung des Nutzerverhaltens in einigen Situationen vorstellen.

Demo ansehenDateien herunterladen

Die Technologien

Die Webseite wird mit PHP erstellt. Wir brauchen PHP aus mehreren Gründen. Am wichtigsten ist, dass wir eine serverseitige Sprache benötigen, um das Speichern und Abrufen aus der Datenbank zu handhaben. Außerdem werden wir diese Datenbankinteraktion in eine separate Datei auslagern, um unseren Code sauber zu halten. PHP ermöglicht es uns, Variablen zwischen diesen Dateien hin und her zu senden.

Wir verwenden JavaScript in der jQuery-Variante, um die Mausklicks zu verfolgen und diese Klickdaten an die PHP-Datei zu senden, die das Speichern in der Datenbank durchführt. jQuery hilft uns auch, die Überlagerung anzuzeigen und die kleinen Grafiken zu platzieren, die wir zur Darstellung der Klickpositionen verwenden.

Datenbank erstellen

Unser Code erstellt die notwendigen Tabellen nicht automatisch für Sie, Sie müssen eine Datenbank und die Struktur selbst erstellen. Hier ist die 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`) 
)

Für die Demo halten wir die Dinge so einfach wie möglich. Wenn Sie die Idee erweitern möchten, möchten Sie vielleicht auch zusätzliche Informationen zu dieser Tabelle hinzufügen, wie IP-Adresse und Datum/Uhrzeit, damit Sie detailliertere Informationen für jeden Klick haben.

Das Markup (zu verfolgende Seite)

Nur etwas Struktur, mit der wir arbeiten können. Wir verlinken auf eine CSS-Datei, laden jQuery, verlinken auf eine eigene JavaScript-Datei sowie richten einen Platz zum Schreiben von JavaScript hier ein und legen etwas Inhalt auf die Seite.

<!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>

Nicht viel Inhalt dort, nur ein Bild der Baywatch-Crew und ein einfacher Knopf.

Das jQuery JavaScript

Das JavaScript wird zwei Hauptaufgaben für uns erledigen: Klicks speichern und Klicks anzeigen.

Klicks speichern

Aus Effizienzgründen lagern wir dies in einige verschiedene Funktionen aus, die wir jederzeit aufrufen können. Eine, um das Speichern von Klicks zu *starten*, und eine, um es zu *stoppen*.

(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); 

Wir binden das `mousedown`-Ereignis an das Element, auf dem es aufgerufen wird (es wird das gesamte Dokument sein), und verwenden dann die `post`-Funktion von jQuery, um einige Daten (die Koordinaten) an eine spezielle Datei (clickmap.php) zu senden. Ziemlich raffiniert, die Leute werden es nie erfahren, aber jeder dieser Klicks sendet Daten zurück an den Server.

Klicks anzeigen

Auch hier zwei Funktionen. Eine ist für die Erstellung der Überlagerung und die Anzeige der Klickgrafiken zuständig (das PHP sendet alle Daten, aber das jQuery fügt sie ein). Die andere entfernt alles. Wir nutzen die `get`-Funktion von jQuery.

$.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(); 
}; 

Alles in Gang setzen

Wir werden etwas JavaScript direkt auf der Seite einfügen, um alles zu starten.

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

Das PHP

Nun haben wir Code gesehen, der sowohl POST- als auch GET-Anfragen an eine PHP-Datei sendet, die wir noch nicht gesehen haben. Diese Magie geschieht in einer Datei, die wir nennen werdenclickmap.php. In beiden Fällen müssen wir uns mit der Datenbank verbinden und diese Verbindung dann wieder schließen. Der Rest hängt davon ab, ob wir POSTen oder GETten.

<?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); 
?>

Ziemlich einfach... beim POSTen die Daten in die Datenbank speichern. Beim GETten abrufen. In dieser Demo rufen wir nur die letzten 200 Klicks ab, aber Sie können diese Einschränkung nach Bedarf ändern oder entfernen. Hier sehen Sie, wie jede der Klickgrafiken positioniert wird, wenn die Überlagerung erscheint. Die exakten Koordinatendaten, die beim Erzeugen des Klicks gespeichert wurden, werden verwendet, um CSS-Werte für "top" und "left" festzulegen.

Das CSS

Die eigentliche Klickmap-Funktionalität benötigt nicht viel in Bezug auf Styling. Nur die Überlagerung selbst, ein Ladebereich (falls es eine Weile dauert, alle Klickdaten abzurufen) und die kleinen Grafiken für die Klicks selbst.

#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; 
} 

Alles zusammen

Ich weiß, dass das Lesen all dieser Codebeispiele manchmal ganz schön anstrengend und verwirrend sein kann. Wie immer können Sie den Code gerne herunterladen und alles im Kontext sehen, damit es mehr Sinn ergibt. Besonderer Dank nochmals an Jay Salvat für die ursprüngliche Idee. Jay ist ein 35-jähriger Webentwickler, der an der französischen Riviera lebt und leitender Entwickler bei Kuantic ist. Er ist der Erfinder des sehr coolen Rich-Text-Editors markItUp! für jQuery und des neuen Projekts Sunday Morning (kommt bald).

Demo ansehenDateien herunterladen