+ Rispondi alla Discussione
Risultati da 1 a 7 di 7

JavaScript, conteggiare click siti esterni

Ultimo Messaggio di MenteLibera il:
  1. #1
    Utente Premium
    Data Registrazione
    Mar 2009
    Messaggi
    314

    JavaScript, conteggiare click siti esterni

    Salve a tutti,
    stavo cercando un modo per conteggiare quanti click vengono fatti verso altri siti, e con una ricerca su Google ho trovato (fonte: stackoverflow. com/questions/5862781/how-to-count-clicks-with-javascript) questa soluzione:



    Codice HTML:
    <script type="text/javascript"><!--
    // This variable contains the number of clicks corresponding to the linked URLs
    var clickCount = {}
    // List of all a tags
    ,   aList = document.getElementsByTagName('a');
    // Function called every time a link is clicked on
    ,   clickCounter = function()
        {
            clickCount[this.href] = clickCount[this.href] ? clickCount[this.href]+1 : 1;
        }
    ;
    // The event is attached to every link having a "href" attribute
    for (var i=0 ; i<aList.length, a=aList[i] ; i++)
    {
        if (this.href)
        {
            a.onclick = clickCounter;
        }
    }
    // This example uses jQuery to send the data to a PHP script
    // A POST request is sent just before the window is closed
    onbeforeunload = function()
    {
        $.post('/update-external-counter.php', clickCount);
    }
    // --></script>


    Sfortunatamente jQuery non il mio forte ed ho cercato di trovare la funzione equivalente in JavaScript che permettesse di processare il form.

    Con altre ricerche ho trovato (fonte: stackoverflow. com/questions/133925/javascript-post-request-like-a-form-submit) questa funzione:



    Codice HTML:
    <script type="text/javascript"><!--
    function post_to_url(path, params, method) {
        method = method || "post"; // Set method to post by default, if not specified.
    
        // The rest of this code assumes you are not using a library.
        // It can be made less wordy if you use one.
        var form = document.createElement("form");
        form.setAttribute("method", method);
        form.setAttribute("action", path);
    
        for(var key in params) {
            if(params.hasOwnProperty(key)) {
                var hiddenField = document.createElement("input");
                hiddenField.setAttribute("type", "hidden");
                hiddenField.setAttribute("name", key);
                hiddenField.setAttribute("value", params[key]);
    
                form.appendChild(hiddenField);
             }
        }
    
        document.body.appendChild(form);
        form.submit();
        document.body.removeChild(form);
    }
    // --></script>


    Ho unito i precedenti codici nello stesso file HTML aggiungendo anche qualche indirizzo esterno al dominio, ma non sembra funzionare sostituendo

    Codice HTML:
    $.post('/update-external-counter.php', clickCount);
    presente nel primo codice di questo post con quest'altra:

    Codice HTML:
    post_to_url("/update-external-counter.php", clickCount, "post");
    Rimane sottinteso che ho creato lo script update-external-counter.php in modo che quando richiamato raccolga le variabili passate con il metodo post, e per semplicit le faccio salvare in un file di testo appendendole in coda, ma per ora non registra nulla.

    Mi sapreste cortesemente dire come fare a rendere il nuovo codice funzionante?
    Grazie in anticipo a tutti.

  2. #2
    User
    Data Registrazione
    May 2009
    Messaggi
    67
    Ti consiglio di rimanere su jQuery per rendere pi chiaro il codice, visto che il tuo obiettivo in questo momento farlo funzionare Lo script dovrebbe funzionare senza grosse modifiche...
    Anzitutto metti un alert prima di $.post per vedere se quella porzione di codice viene eseguita. Altra cosa, lo slash che precede l'url in $.post potrebbe far puntare ad un url sbagliato, se sei in una sottodirectory, ma non vorrei dire una cavolata

    Ciao

  3. #3
    Utente Premium
    Data Registrazione
    Mar 2009
    Messaggi
    314
    Grazie per questi utili suggerimenti. Mi trovo concorde nel rimanere a jQuery almeno per verificare la correttezza del codice.

    Lo slash lo avevo messo affinch lo script che eseguisse la registrazione del click fosse nella root del dominio e quindi fosse indipendente dal livello di annidamento in cui sollevato l'evento del click al sito esterno, ma come giustamente fai notare in fase di test prima necessario verificare che il codice disponibile sia funzionante.

    Per fare ci ho creato una cartella temporanea per lo scopo ed ho posto come permessi di scrittura 0777, ed ho inserito la libreria jquery-1.9.1.min.js, la pagina prova.htm a cui ho aggiunto l'alert per un po' di debug e questo il nuovo codice:

    Codice HTML:
    <html>
    <head>
    <script type="text/javascript" src="jquery-1.9.1.min.js"></script>
    <script type="text/javascript"><!--
    // This variable contains the number of clicks corresponding to the linked URLs
    var clickCount = {}
    // List of all a tags
    ,   aList = document.getElementsByTagName('a');
    // Function called every time a link is clicked on
    ,   clickCounter = function()
        {
            clickCount[this.href] = clickCount[this.href] ? clickCount[this.href]+1 : 1;
        }
    ;
    // The event is attached to every link having a "href" attribute
    for (var i=0 ; i<aList.length, a=aList[i] ; i++)
    {
        if (this.href)
        {
            a.onclick = clickCounter;
        }
    }
    // This example uses jQuery to send the data to a PHP script
    // A POST request is sent just before the window is closed
    onbeforeunload = function()
    {
        alert(clickCount);
        $.post('update-external-counter.php', clickCount);
    }
    // --></script>
    </head>
    <body>
    <a href="url_1">link 1</a><br>
    <a href="url_2">link 2</a><br>
    <a href="url_3">link 3</a>
    </body>
    </html>

    Riguardo il precedente codice sfortunatamente non viene eseguito l'alert. Una cosa di cui mi viene il dubbio sul tipo di clickCount che sia di tipo array perch nel codice appare l'istruzione:

    Codice HTML:
    clickCount[this.href] = clickCount[this.href] ? clickCount[this.href]+1 : 1;
    e quindi l'alert potrebbe avere un comportamento anomalo, ma forse sbaglio perch in JavaScript non sono particolarmente ferrato.
    Riguardo il codice update-external-counter.php anch'esso per ora pi di debug (lo raffiner in seguito prendendo solo la variabile di interesse ricevuta) che altro:

    Codice PHP:
    <?php

    foreach($_POST as $chiave => $valore)
    {
        
    $archivio .= "$chiave => $valore\n";
    }

    file_put_contents("conta-cliccati.txt"$archivioFILE_APPEND);

    ?>

    Ho fatto anche delle prove con il sito jsfiddle. net ricorrendo alla jQuery 1.6.4 e cambiando il target di $.post con l'indirizzo assoluto in cui si trova il precedente script ma anche in questo caso non sollevato l'alert.

    Ti ringrazio sinceramente per i suggerimenti.

  4. #4
    User
    Data Registrazione
    May 2009
    Messaggi
    67
    Prova questo: jsfiddle.net/paLZd/15/

    Ti basta cambiare il codice JS.

    Ciao

  5. #5
    Utente Premium
    Data Registrazione
    Mar 2009
    Messaggi
    314
    MatrixTeo, grazie per avermi prodotto il nuovo codice. In effetti viene mostrato l'alert, ma la cosa strana che poi anche l'istruzione
    Codice HTML:
    console.log(clickCount);
    riporta nuovamente il precedente alert mentre mi sarei atteso il valore in argomento, clickCount. Cosa che ho notato andando per tentativi inserendo dei commenti, che console.log(clickCount); viene eseguita solo quella presente nella funzione onbeforeunload.

    Altra cosa che ho fatto stata quella di riscrivere lo script update-external-counter.php per considerare il passaggio di un array:

    Codice PHP:
    <?php

    foreach($_POST as $chiave => $valore)
    {
        if (
    is_array($valore))
        {
            
    archivio .= "$valore  un array\n";
            foreach (
    $valore as $k => $elem)
            {
                
    $archivio .= "[$k] => $elem\n";
            }
        } else 
    $archivio .= "$chiave => $valore\n";
    }

    file_put_contents("conta-cliccati.txt"$archivioFILE_APPEND);

    ?>
    Pensavo che la precedente versione non considerasse questo caso e quindi fosse la causa della mancata scrittura del file.
    Purtroppo nonostante tutto questo c' ancora qualche problema. Per ti ringrazio per i preziosi stimoli che mi hai dato.

    Ciao.

  6. #6
    User
    Data Registrazione
    May 2009
    Messaggi
    67
    Hai ragione, avevo sbagliato perch clickCount per essere passato come parametro deve essere un oggetto, e non array, nel tuo codice iniziale era giusto
    Ho aggiornato qui: jsfiddle.net/paLZd/16/

    Ho problemi a metterti tutto il codice sul forum, quindi l'ho messo qui: pastebin.com/r12deJJM

    Ciao

  7. #7
    Utente Premium
    Data Registrazione
    Mar 2009
    Messaggi
    314
    Ho provato ad eseguire il nuovo codice, ma mi sono accorto che non siano eseguite le istruzioni console.log(clickCount);
    Ho fatto alcune ricerche e secondo alcuni necessario sostituirlo con console.info(clickCount); poich l'argomento un array, oppure ricorrendo a JSON (ma leggo che funziona solo sui moderni browser, pertanto non sembra essere la scelta migliore) invocando JSON.stringify(clickCount); oppure con un alert con una sintassi di questo tipo:

    alert(clickCount.join('\n'));

    Eppure nonostante questo l'esecuzione dello script non si interrompe visualizzando il contenuto in argomento, n viene scritto il file testuale di log.

+ Rispondi alla Discussione

^ Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •  
  • Il codice BB Attivato
  • Le faccine sono Attivato
  • Il codice [IMG] Attivato
  • Il codice [VIDEO] Attivato
  • Il codice HTML Disattivato
  • Trackbacks Attivato
  • Pingback Attivato
  • Refback Attivato

SEO by vBSEO 3.6.0 PL2 ©2011, Crawlability, Inc.