Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Conta click

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    107

    Conta click

    Ciao A tutti ,

    ho un testo spezzato dal plugin jQuery Expander (jquery.expander.js):

    codice:
    (function($) {
    
      $.fn.expander = function(options) {
    
        var opts = $.extend({}, $.fn.expander.defaults, options);
        var delayedCollapse;
        return this.each(function() {
          var $this = $(this);
          var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
             var cleanedTag, startTags, endTags;    
             var allText = $this.html();
             var startText = allText.slice(0, o.slicePoint).replace(/\w+$/,'');
             startTags = startText.match(/<\w[^>]*>/g);
             if (startTags) {startText = allText.slice(0,o.slicePoint + startTags.join('').length).replace(/\w+$/,'');}
             
             if (startText.lastIndexOf('<') > startText.lastIndexOf('>') ) {
               startText = startText.slice(0,startText.lastIndexOf('<'));
             }
             var endText = allText.slice(startText.length);          
             // create necessary expand/collapse elements if they don't already exist
             if (!$('span.details', this).length) {
            // end script if text length isn't long enough.
               if ( endText.replace(/\s+$/,'').split(' ').length < o.widow ) { return; }
               // otherwise, continue...    
               if (endText.indexOf('</') > -1) {
                 endTags = endText.match(/<(\/)?[^>]*>/g);
              for (var i=0; i < endTags.length; i++) {
    
                if (endTags[i].indexOf('</') > -1) {
                  var startTag, startTagExists = false;
                  for (var j=0; j < i; j++) {
                    startTag = endTags[j].slice(0, endTags[j].indexOf(' ')).replace(/(\w)$/,'$1>');
                    if (startTag == rSlash(endTags[i])) {
                      startTagExists = true;
                    }
                  }              
                  if (!startTagExists) {
                    startText = startText + endTags[i];
                    var matched = false;
                    for (var s=startTags.length - 1; s >= 0; s--) {
                      if (startTags[s].slice(0, startTags[s].indexOf(' ')).replace(/(\w)$/,'$1>') == rSlash(endTags[i]) 
                      && matched == false) {
                        cleanedTag = cleanedTag ? startTags[s] + cleanedTag : startTags[s];
                        matched = true;
                      }
                    };
                  }
                }
              }
    
              endText = cleanedTag && cleanedTag + endText || endText;
            }
               $this.html([
                 startText,
                 '<span class="read-more">',
                 o.expandPrefix,
                   '<a href="#">',
                     o.expandText,
                   '</a>',
            '</span>',
                 '<span class="details">',
                   endText,
                 '</span>'
                 ].join('')
               );
          }
          var $thisDetails = $('span.details', this),
            $readMore = $('span.read-more', this);
             $thisDetails.hide();
             $readMore.find('a').click(function() {
               $readMore.hide();
    
               if (o.expandEffect === 'show' && !o.expandSpeed) {
              o.beforeExpand($this);
                 $thisDetails.show();
              o.afterExpand($this);
              delayCollapse(o, $thisDetails);
               } else {
              o.beforeExpand($this);
                 $thisDetails[o.expandEffect](o.expandSpeed, function() {
                $thisDetails.css({zoom: ''});
                o.afterExpand($this);
                delayCollapse(o, $thisDetails);
                 });
               }
            return false;
             });
          if (o.userCollapse) {
            $this
            .find('span.details').append('<span class="re-collapse">' + o.userCollapsePrefix + '' + o.userCollapseText + '</span>');
            $this.find('span.re-collapse a').click(function() {
    
              clearTimeout(delayedCollapse);
              var $detailsCollapsed = $(this).parents('span.details');
              reCollapse($detailsCollapsed);
              o.onCollapse($this, true);
              return false;
            });
          }
        });
        function reCollapse(el) {
           el.hide()
            .prev('span.read-more').show();
        }
        function delayCollapse(option, $collapseEl) {
          if (option.collapseTimer) {
            delayedCollapse = setTimeout(function() {  
              reCollapse($collapseEl);
              option.onCollapse($collapseEl.parent(), false);
              },
              option.collapseTimer
            );
          }
        }
        function rSlash(rString) {
          return rString.replace(/\//,'');
        }    
      };
        // plugin defaults
      $.fn.expander.defaults = {
        slicePoint:       100,  // the number of characters at which the contents will be sliced into two parts. 
                                // Note: any tag names in the HTML that appear inside the sliced element before 
                                // the slicePoint will be counted along with the text characters.
        widow:            4,  // a threshold of sorts for whether to initially hide/collapse part of the element's contents. 
                              // If after slicing the contents in two there are fewer words in the second part than 
                              // the value set by widow, we won't bother hiding/collapsing anything.
        expandText:       'read more', // text displayed in a link instead of the hidden part of the element. 
                                          // clicking this will expand/show the hidden/collapsed text
        expandPrefix:     '&hellip; ',
        collapseTimer:    0, // number of milliseconds after text has been expanded at which to collapse the text again
        expandEffect:     'fadeIn',
        expandSpeed:      '',   // speed in milliseconds of the animation effect for expanding the text
        userCollapse:     true, // allow the user to re-collapse the expanded text.
        userCollapseText: '[collapse expanded text]',  // text to use for the link to re-collapse the text
        userCollapsePrefix: ' ',
        beforeExpand: function($thisEl) {},
        afterExpand: function($thisEl) {
        },
        onCollapse: function($thisEl, byUser) {}
      };
    })(jQuery);


    codice:
    <script src="js/jquery.expander.js" type="text/javascript"></script> 
    
    <script type="text/javascript">
     
    $(document).ready(function() {
        
      // simple example, using all default options
      $('div.expandable p').expander();
      
      // *** OR ***
      
      // override some default options
      $('div.expandable p').expander({
        slicePoint:       80,  // default is 100
        expandText:         '[...]', // default is 'read more...'
        collapseTimer:    5000, // re-collapses after 5 seconds; default is 0, so no re-collapsing
        userCollapseText: '[^]'  // default is '[collapse expanded text]'
        
      
      });
      
    });
    </script>
    Il testo "tagliato" viene preso da un ciclo in php che mi stampa gli " annunci " in bacheca :

    Codice PHP:
     $query =  " SELECT idannuncio, sezione, idutente,titolo, descrizione, data FROM annuncio WHERE ......";
       
    $resultscerca mysql_query($query) or die(mysql_error()); 
      
          
    while(
    $row mysql_fetch_array($resultscerca)){
    $titolo $row['titolo'];
        
    $descrizione=$row['descrizione'];
        
    $id_annuncio=$row['idannuncio'];
    echo <<<EOT
       
         <h3>
    $titolo</h3>
         <div class="expandable">
         

    $descrizione</p>
          </div>
         </p>
    EOT;

    Tutto funziona bene.

    Ora vorrei fare in modo che quando si " espande " il testo, aumenti un contatore in modo da aggiornare un campo di un record MYSQL ..

    Potete darmi una dritta??

    grazie

  2. #2
    C'è un mare di codice. Localizza il codice che "espande il testo" e mettici un aggiornamento ad una variabile globale (che so: contatore=0) e nell' aggiornamento dici:
    ++contatore;
    a quel punto ogni volta che vuoi conoscere i click, consulti la variabile contatore.

    ps se quei nomi nell' esempio non sono nomi di comodo ma i veri nomi dei campi del tuo database, modificali nell' esempio che adduci - nel senso che in linea di massima non è una mai buona idea rivelare su forum aperti al vasto puibblico quel che, essendo dal lato server, dovrebbe essere ignoto alla utenza generica.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    107
    Originariamente inviato da TrueLies
    C'è un mare di codice. Localizza il codice che "espande il testo" e mettici un aggiornamento ad una variabile globale (che so: contatore=0) e nell' aggiornamento dici:
    ++contatore;
    a quel punto ogni volta che vuoi conoscere i click, consulti la variabile contatore.

    ps se quei nomi nell' esempio non sono nomi di comodo ma i veri nomi dei campi del tuo database, modificali nell' esempio che adduci - nel senso che in linea di massima non è una mai buona idea rivelare su forum aperti al vasto puibblico quel che, essendo dal lato server, dovrebbe essere ignoto alla utenza generica.
    Ciao! grazie per il supporto!! no tranquillo sono nomi fittizi

    Ho fatto questo e funziona:

    sul codice del plugin (plugin jQuery Expande) ho modificato queste righe:

    codice:
     $this.html([
                 startText,
                 '<span class="read-more">',
                 o.expandPrefix,
                   '<a href="#" onclick="linkClick()">',
                     o.expandText,
                   '</a>',
            '</span>',
    Quindi mettendo onclick che richiama una funzione:

    codice:
    <script type="text/javascript">
     var clicks = 0;
     function linkClick(){
     document.getElementById('clicked').value = ++clicks;
     }
     </script>
    Sulla pagina PHP visualizzo il numero che cresce ogni volta che " espando " il testo:

    Codice PHP:


      Numeri di click 
    <input id="clicked" size="3" onfocus="this.blur()";>  </p

    Qual'è il mio problema:

    Sulla pagina ho tot annunci di " bacheca" letti dal DB.
    Il contatore fatto in questo modo, mi conta SEMPRE ogni click "sull'espandi" che faccio su TUTTE le descrizioni di ogni messaggio.

    Dovrei riuscire a portarmi dietro l'ID del messaggio quando clicco, cosi da differenziare i click per ogni messaggio-bacheca.

    In modo da poter rispondere alla domanda: Quante persone hanno letto il mio messaggio in bacheca?

    non so se sono stato chiaro :|

  4. #4
    Beh presumo che cliccano un link. A quel punto, siccome il link è fatto tramite php, nulal ti impedisce di metterci dentro un evento onclick che richiami una funzione cui passi anche l' id del post.

    Se vuoi calcolarli in un secondo momento crei una array globale associativa

    var clicksglobali=[];

    ogni volta che avviene un click su un ancora tipo che ne so

    espandi (75 è un ipotetico id)

    chiama boh che potrebbe essere (scrivo di getto SENZA testare)

    function boh(id){
    clicksglobali[id]=(clicksglobali[id])?++clicksglobali[id]:1;
    }

    Lo svantaggio è che non è propriamente associativa perchè c'è un id numerico (problema non da poco: se tu avessi come id 389004 si _potrebbe_ creare una array di 389004 elementi, con le conseguenze del caso se avvii un ciclo). La si potrebbe rendere facilmente associativa ma ho paura di confonderti le idee:

    function boh(id){
    id=id+'x';//ora è una stringa
    clicksglobali[id]=(clicksglobali[id])?++clicksglobali[id]:1;
    }

    A quel punto quando vuoi immagazzinare nel DB i click, consulti la variabile globale clicksglobali per ogni dato id e la invii al server (con ajax o non so cosa usi).

    ps le array associative si iterano con
    for(var i in clicksglobali){}

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    107
    Originariamente inviato da TrueLies
    Beh presumo che cliccano un link. A quel punto, siccome il link è fatto tramite php, nulal ti impedisce di metterci dentro un evento onclick che richiami una funzione cui passi anche l' id del post.
    Ecco è qui il problema.
    Il link lo crea il plugin Jquery, non riesco a passargli la variabile es: $idannuncio, perchè non me la vede.

    Praticamente dentro $descrizione c'è tutto, il testo tagliato e il link finale per espanderlo.

    Codice PHP:
    echo <<<EOT 
        
    <h3>$titolo</h3>
         
    id annuncio$idannuncio 
      
    <-------------- idannuncio lo stampa correttamente
         
    <div class="expandable"
         

    $descrizione</p
          </
    div
         </
    p
    EOT
    qui viene creato il link come ho segnato prima sul jquery plugin:

    codice:
    $this.html([
                 startText,
                 '<span class="read-more">',
                 o.expandPrefix,
                   '<a href="#" onclick="linkClick()">',
                     o.expandText,
                   '</a>',
            '</span>',
    Sull' onclick, se metto value=$idannuncio per esempio, non me lo prende, ho proprio paura che non riesce a recuperare il valore $idannuncio, o comunque non so come si fa.

  6. #6
    Non so che dirti, mi spiace, perchè $idannuncio non so dove viene creato: guarda un po' la porzione di codice che gli dovrebbe assegnare un valore e cerca di capire come mai non lo fa.

    O se lo fa e intendi dire che non riesci a passarlo a quel codice, è questo uno dei motivi per cui a me non piacciono le librerie fatte dagli altri: se una cosa non funge tocca comunque rifarti le tue!

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    107
    Originariamente inviato da TrueLies
    Non so che dirti, mi spiace, perchè $idannuncio non so dove viene creato: guarda un po' la porzione di codice che gli dovrebbe assegnare un valore e cerca di capire come mai non lo fa.

    O se lo fa e intendi dire che non riesci a passarlo a quel codice, è questo uno dei motivi per cui a me non piacciono le librerie fatte dagli altri: se una cosa non funge tocca comunque rifarti le tue!
    Si lo so hai ragione .. no $idAnnuncio lo prendo dalla query al db con il php, ma da quello che sto vedendo dal plugin jquery non riesce a beccarla ... amen se mi arriva un'illuminazione ti farò sapere

    grazie mille.

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    107
    Originariamente inviato da TrueLies
    Non so che dirti, mi spiace, perchè $idannuncio non so dove viene creato: guarda un po' la porzione di codice che gli dovrebbe assegnare un valore e cerca di capire come mai non lo fa.

    O se lo fa e intendi dire che non riesci a passarlo a quel codice, è questo uno dei motivi per cui a me non piacciono le librerie fatte dagli altri: se una cosa non funge tocca comunque rifarti le tue!
    Ciao True!! ce l'ho fatta ! Ho cambiato " plugin " utilizzando qualcosa di piu semplice riuscendo a passare gli ID degli annunci al javascript:



    codice:
    <script language="javascript" type="text/javascript">
    function jchange(o) {
    var fold_image = new Array();
    fold_image[0] = "/images/openarrow.gif";
    fold_image[1] = "/images/closedarrow.gif";
    
    if(document.getElementById(o).style.display=='none') {
    document.getElementById(o).style.display='block';
     if(document.getElementById('nfolding')) {
    document.getElementById('nfolding').src=fold_image[0];
      }
     } else {
    document.getElementById(o).style.display='none';
       if(document.getElementById('nfolding')) {
    document.getElementById('nfolding').src=fold_image[1];
       }
       }
     }
    </script>
    Qui ho fatto come mi hai detto te, mettendo tutto nell'array:

    codice:
    <script type="text/javascript">
     var clicks = 0;
     var clicksglobali=[];
      
     function linkClick(control){
      
    var pippo = 'clicked_'+control;
     
    clicksglobali[pippo]=(clicksglobali[pippo])?++clicksglobali[pippo]:1;
    ++clicks
    document.getElementById('clicked_'+control).value = clicksglobali[pippo];
     }
    </script>
    Codice PHP:
    //Effettuo il ciclo per stampare gli annunci in bacheca
    $query = ....................
    while(
    $row mysql_fetch_array($results)){

    $descrizione=$row['descrizione'];
    ........

    echo <<<
    EOT 
    <h3>$titolo</h3>


    [
    size="1"][i][b]Pubblicato da:[/b$nome $cognome il $data [/i][/size]

       
    [
    url="javascript:jchange('jdiv_$id_annuncio');"]Espandi il Testo[/url]  
      

    <
    div id="jdiv_$id_annunciostyle="display:none;">

    $descrizione [url="javascript:jchange('jdiv_$id_annuncio');"]Close (X)[/url].</p></div>



     
    Hai cliccato <input id="clicked_$id_annunciosize="3" onfocus="this.blur()" volte.  </p
    EOT;

    In questo modo , ogni volta che clicco su " espandi testo " mi incrementa il valore e me lo tiene per ogni annuncio in bacheca ESEMPIO:!!!

    -----------------------------
    titolo annuncio
    -----------------------------
    <espandi testo>
    ...........................................
    hai cliccato: 4 volte "se ad esempio ho cliccato 4 volte questo annuncio"

    -----------------------------
    titolo annuncio
    -----------------------------
    <espandi testo>
    ...........................................
    hai cliccato: 2 volte "se ad esempio ho cliccato 2 volte questo annuncio"

    In questo modo, senza fare l'aggiornamento della pagina, si riempie l'array:

    codice:
    clicksglobali[pippo]=(clicksglobali[pippo])?++clicksglobali[pippo]:1;
    Ora come faccio a passare quei numeri, al PHP per aggiornare un qualsiasi campo contatore nel DB ????

  9. #9
    beh siccome l'utente potrebbe abbandonare la pagina in qualsiasi momento, ti tocca passarli con ajax probabilmente.

    Quando un utente fa click su un link tu avvii anche un ajax che passa al server
    $id_annuncio
    e basta (così velocizzi): si intende con quello che un click è avvenuto e basterà incrementare di 1 il campo apposito nel DB indicizzato da $id_annuncio.

    Assicurati ovviamente che l' id annuncio sia numerico (presumo lo sia), con php ad esempio usando is_numeric().

    Il problema successivo che incontrerai è decidere se più click dello stesso utente sullo stesso annuncio debbano essere considerati come visualizzazioni (il che può sovraccaricare il server: non so che traffico hai o potresti avere).

    Se non lo devono, ti tocca gestire la cosa anche dal lato server (per prudenza), e potresti farlo con una array in sessione dove memorizzi tutti gli $id_annuncio già cliccati: se nella array di sessione (ogni sessione identifica un utente univoco, o almeno... un PC univoco) è presente quell' $id_annuncio, non aggiorni il db.

    Oppure puoi decidere di aggiornarlo sempre (specie se pensi di avere molte visite da pc condivisi). In tal caso difenditi, anche sul lato server, da gente che magari si mette a cliccare a ripetizione per spasso: potresti mettere una variabile in sessione che calcola il tempo dell' ultimo click

    if sessione_tempo esiste: fai differenza fra tempo attuale e tempo memorizzato
    else crea sessione_tempo con tempo attuale
    if differenza < 3 secondi, rifiuta update
    else effettua update e aggiorna sessione_tempo con tempo attuale

    è solo una idea, da testare. 3 secondi parrebbe un tempo ragionevole per individaure click sensati (detesto andare a naso ma diciamo che se uno visualizza qualcosa e non ci sta manco 3 secondi, vuol dire che nemmeno la legge e potrebbe essere un "joyrider")

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    107
    Originariamente inviato da TrueLies
    beh siccome l'utente potrebbe abbandonare la pagina in qualsiasi momento, ti tocca passarli con ajax probabilmente.

    Quando un utente fa click su un link tu avvii anche un ajax che passa al server
    $id_annuncio
    e basta (così velocizzi): si intende con quello che un click è avvenuto e basterà incrementare di 1 il campo apposito nel DB indicizzato da $id_annuncio.

    Assicurati ovviamente che l' id annuncio sia numerico (presumo lo sia), con php ad esempio usando is_numeric().

    Il problema successivo che incontrerai è decidere se più click dello stesso utente sullo stesso annuncio debbano essere considerati come visualizzazioni (il che può sovraccaricare il server: non so che traffico hai o potresti avere).

    Se non lo devono, ti tocca gestire la cosa anche dal lato server (per prudenza), e potresti farlo con una array in sessione dove memorizzi tutti gli $id_annuncio già cliccati: se nella array di sessione (ogni sessione identifica un utente univoco, o almeno... un PC univoco) è presente quell' $id_annuncio, non aggiorni il db.

    Oppure puoi decidere di aggiornarlo sempre (specie se pensi di avere molte visite da pc condivisi). In tal caso difenditi, anche sul lato server, da gente che magari si mette a cliccare a ripetizione per spasso: potresti mettere una variabile in sessione che calcola il tempo dell' ultimo click

    if sessione_tempo esiste: fai differenza fra tempo attuale e tempo memorizzato
    else crea sessione_tempo con tempo attuale
    if differenza < 3 secondi, rifiuta update
    else effettua update e aggiorna sessione_tempo con tempo attuale

    è solo una idea, da testare. 3 secondi parrebbe un tempo ragionevole per individaure click sensati (detesto andare a naso ma diciamo che se uno visualizza qualcosa e non ci sta manco 3 secondi, vuol dire che nemmeno la legge e potrebbe essere un "joyrider")
    Grazie mille!!

    ehm .. ajax non lo conosco, non ho idea di come si fa .. mi metto un po alla ricerca .. ti farò sapere ..


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.