Wenn ich das jetzt richtig verstanden habe. Möchtest du, wenn jemand auf den Link klickt, eine JS-Funktion aufgerufen wird die dann ein Request an ein PHP-Script sendet und dieses dann den Klick zählt. Wenn alles richtig gelaufen ist soll dann die URL, die in href steht, aufgerufen werden.
Das würde schon gehen. Bloß ist der Aufwand zum Verhältnis des Nutzens etwas groß.
Zudem hast du keine Garantie dass es zu 100% funktioniert. Wenn Javascript beim Client abgeschaltet ist, wird nichts mehr gezählt.
Dein Link müsste dann auch etwas anders aussehen. Sonst würde die Funktion und Link gleichzeitig aufgerufen werden.
Code:
<script>
function machwas(v) {
//Request an Server
return false;
}
<a onclick=”return machwas(this.href)” href=http://url>XXX</a>
So würde die URL nur aufgerufen werden, wenn JS abgeschaltet ist.
Hier mal ein Script(e) die ein Request senden und empfangene Daten verarbeitet.
Das PHP Script gibt nur den GET-Wert zurück.
Datei: xmlReq.js
Code:
/**
* Classe für XMLHttpRequest
* mit Browser Unterscheidung
*/
ajaxRequest = function(u, f, m, b, h, s) {
//Standart-Werte
this.url = u; //Zieladresse für den Request
this.wState = f || function() { }; //Funktion für Daten-Weiterverarbeitung und Stausüberwachung
this.method = m || "GET"; //Methode, die für den Request verwendet wird
this.body = b || null; //Inhalt, der bei einem Request gesendet wird
this.headers = h || false; //zusätzliche Header-Angaben als Array(key/val)
this.sync = s || true; //Art der Übertragung, Standart asynchrone Übertragung
this.abortReq = false;
//XMLHttpRequest initialisieren
this.req = (window.XMLHttpRequest) ? new XMLHttpRequest() : ((window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : false);
//Verarbeitung der Serveranfrage
this.doRequest = function() {
this.req.open(this.method,this.url,this.sync);
//zusätzlich HeaderInformationen anfügen
if(this.headers) {
for(var i=0; i<this.headers.length; i+=2)
{
this.req.setRequestHeader(this.headers[i],this.headers[i+1]);
}
}
//Anfrage senden
this.req.onreadystatechange = this.wState;
(!this.abortReq) ? this.req.send(this.body) : this.req.abort();
}
}
var ajaxSend = function(u, m, f) {
//u = Zieladresse für den Request
//m = Methode, die für den Request verwendet wird
var fworks = f || function() { };
//Neues Object definieren und URL und Methode übergeben
xmlhttp = new ajaxRequest(u, null, m);
//Status prüfen und Daten zu Weiterverarbeitung übergeben
xmlhttp.wState = function () {
//Div Box für Ladezustand einbleden
var elm = document.getElementById("load");
elm.style.display = "block";
//Status prüfen, ob abgeschloßen
if(xmlhttp.req.readyState == 4) {
//prüfen ob angeforderte Daten enthalten sind
if(xmlhttp.req.status == 200) {
//prüfen welche Document-Art zurück geliefert wurde
var r = xmlhttp.req;
var c = xmlhttp.req.getResponseHeader("Content-Type");
if(c.indexOf("xml") >-1) var xml =r.responseXML;
else var xml = r.responseText;
//Daten an Funktion übergeben
fworks(xml);
}
else {
//Header-Status auslesen
c = xmlhttp.req.status;
//Fehlermeldung ausgeben
err = new errAusg(c);
err.eInfo();
}
//Ladezustand ausblenden
elm.style.display = "none";
}
}
xmlhttp.doRequest();
}
var errAusg = function(c) {
this.err = c || 204;
this.error = "Es ist ein Fehler aufgetreten!\nWiederholen Sie bitte Ihre Auswahl.";
if(this.err == 404) this.error = "Seite nicht erreichbar.";
if(this.err == 205) this.error = "Keine Inhalte gefunden.";
this.eInfo = function() { alert(this.error); }
}
Datei: count.js
Code:
/**
* Class um URL aus zu lesen und entsprechende Daten (PHP-Seite) an die Request-Class zu übergeben
*/
counter = function() {
var verw;
//Function zum Weiterleiten nach erfolgreichem Request
var weiter = function(v) {
alert(v+" "+verw);
location.href = verw;
}
//Funktion um URL aus zu lesen
this.zaehle = function(v) {
verw = v;
ajaxSend('count.php?c=1', null, weiter); //Request aufrufen
//PHP-Seite die Daten verarbeiten soll
//Methode GET oder POST (GET = Standard)
//Funktion die nach erfolgreichem Requset aufgerufen werden soll
return false; //damit der Link nicht ausgeführt wird
}
}
Datei: link.html
Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Unbenanntes Dokument</title>
<script src="xmlReq.js" type="text/javascript"></script>
<script src="count.js" type="text/javascript"></script>
<script type="text/javascript">
zaehler = new counter();
</script>
</head>
<body>
<a onclick="return zaehler.zaehle(this.href)" href="http://selfphp.de">Web</a>
<div id="load"><img src="loading.gif" width="16" height="16" border="0" /></div>
</body>
</html>
Datei: count.php
PHP-Code:
if(!empty($_GET['c']) && is_numeric($_GET['c'])) echo $_GET['c'];
else header('HTTP/1.0 205 No Content');
In der PHP-Datei kannst du nun die Daten als Text, JSON oder XML ausgeben. Oder nur einen Header senden. Damit der Request erfolgreich war und JS zur angegeben URL weiterleitet.