Retour

Utilisez les événements !

Exemple n° 4

Vous pouvez choisir la durée du programme (1000 ms par défaut) et le déclencher en cliquant sur le bouton "Afficher".

À l'ouverture, la table est triée en ordre ascendant sur le TimeStamp exprimé en millisecondes.

$(function(){
	
	// l'utilisateur peut appeler plusieurs fois le programme, mais il ne doit y avoir qu'un objet « contrôleur »
	var objTotal = null;
	
	// l'utilisateur crée et initialise l'objet « contrôleur » en cliquant sur le bouton « Afficher »
	// l'objet « contrôleur » se charge du bon fonctionnement du programme et de l'affichage des résultats
	// l'affichage des résultats nécessite le plugin jquery.tablesorter.min.js et la feuille de style trierTable.css
	$("#btn").click(function(){
		
		if (objTotal != null) {
			objTotal = null;
		}
		
		objTotal = new Total($("#choix").val(), "affiche");
	});
});

Le fichier testEvent4Modele.js contient les objets Pair et Impair :

(function($){
    Pair = function(){
        this.number = 0;
    }
    
    Pair.prototype = {
        add:function(obj){
            this.number++;
            
            if ((this.number % 2 == 0) &&
                (obj != null) && (obj != undefined) && 
                (obj.eventName != null) && (obj.eventName != undefined)){
                    
                var objEvent = new $.Event(obj.eventName);
                
                objEvent.dvjh = {
                    length:1,
                    p1Name:"Pair",
                    p1Data:this.number
                };
                
                $(obj).trigger(objEvent);
            }
        }
    };
    
    Impair = function(){
        this.number = 0;
    }
    
    Impair.prototype = {
        add:function(obj){
            this.number++;
            
            if ((this.number % 2 != 0) &&
                (obj != null) && (obj != undefined) && 
                (obj.eventName != null) && (obj.eventName != undefined)){
                    
                var objEvent = new $.Event(obj.eventName);
                
                objEvent.dvjh = {
                    length:1,
                    p1Name:"Impair",
                    p1Data:this.number
                };
                
                $(obj).trigger(objEvent);
            }
        }
    };
})(jQuery);

Le fichier testEvent4Vue.js contient l'objet Table (il construit une table, triable avec le plugin jquery.tablesorter.min.js et la feuille de style trierTable.css) :

(function($){
    Table = function(){
        this.eventName = "tableEvent.Table";
        this.th = null;
        this.trs = new Array();
        
        this.init();
    }
    
    Table.prototype = {
        init:function(){
            var self = this; // bonne pratique car jQuery peut modifier this
            $(this).bind(self.eventName, self.afficherEventHandler);
        },
        afficherEventHandler:function(event){
            if ((event.dvjh != null) && (event.dvjh != undefined) && (event.dvjh.length == 1)){
            
                if (this.th == null) {
                    this.th = event.dvjh.p1Name;
                }
                
                this.trs.push(event.dvjh.p1Data);
            }
                            
            return false;
        },
        print:function(id){
            if (this.th != null && this.trs[0] != null){
                var self = this; // bonne pratique car jQuery peut modifier this
                
                var t0 = this.trs[0][3];
                var tableID = "vue" + t0;
                var deltaT = new Array();
                
                deltaT.push(0);
                
                for(var i = 1; i < this.trs.length; i++){
                    deltaT.push(this.trs[i][3] - t0);
                }
                
                // suppprime une éventuelle table précédente
                $("#"+id).find(".tablesorter").remove();
                
                var elClone = $("#"+id).clone(true);
                    
                    var tdlength = this.th.length;
                    var trlength = this.trs.length;
                    
                    var table = $("<table id='" + tableID + "' class='tablesorter'></table>").appendTo(elClone);
                    
                    var thead = $("<thead></thead>").appendTo(table);
                    var tfoot = $("<tfoot></tfoot>").appendTo(table);
                    var tbody = $("<tbody></tbody>").appendTo(table);
                    
                    var trhead = $("<tr></tr>").appendTo(thead);
                    var trfoot = $("<tr></tr>").appendTo(tfoot);
                    
                    for(var i = 0; i < tdlength; i++) {
                        $("<th>" + self.th[i] + "</th>").appendTo(trhead);
                        $("<th>" + self.th[i] + "</th>").appendTo(trfoot);
                    }
                    
                    $("<th>Delta T ms</th>").appendTo(trhead);
                    $("<th>Delta T ms</th>").appendTo(trfoot);
                   
                    var trbody = null;
                    
                    for(var j = 0; j < trlength; j++) {
                        trbody = $("<tr></tr>").appendTo(tbody);
                        
                        for(var i = 0; i < tdlength; i++) {
                            $("<td>" + self.trs[j][i] + "</td>").appendTo(trbody);
                        }
                        
                        $("<td>" + deltaT[j] + "</td>").appendTo(trbody);
                    }
                    
                $("#"+id).replaceWith(elClone);
                
                $("#"+tableID).tablesorter({
                    sortList: [[3,0]],
                    widgets: ['zebra'],
                    headers: { 
                        4:{sorter: false}
                    }
                });
            } else {
                $("#"+id).html("<p>Il n'y a aucune information à afficher !</p>");
            }
        }
    };
})(jQuery);

Le fichier testEvent4Controleur.js contient l'objet Total (l'objet chargé de l'exécution du programme) :

(function($){
    Total = function(millisecondes, divID){
        this.eventName = "totalEvent.Total";
        this.number = 0;
        this.source = "";
        this.total = 0;
        this.timeStamp = 0;
        this.output = new Table();
        this.pair = new Pair();
        this.impair = new Impair();
        
        this.init(millisecondes, divID);
    }
    
    Total.prototype = {
        init:function(milliseconds, divID){
            var t = milliseconds || 1000;				
            var self = this; // bonne pratique car jQuery peut modifier this
            
            $(this).bind(self.eventName, self.totalEventHandler);
            
            // window.setInterval et window.setTimeout modifient this
            
            var pairInterval  = window.setInterval(function(){
                self.pair.add(self);
            }, 30);
            
            var impairInterval = window.setInterval(function(){
                self.impair.add(self);
            }, 40);
            
            window.setTimeout(function(){
                window.clearInterval(pairInterval);
                window.clearInterval(impairInterval);
                self.output.print(divID);
            }, t);
            
        },
        totalEventHandler:function(event){
            if ((event.dvjh != null) && (event.dvjh != undefined) && (event.dvjh.length == 1)){
                this.number = event.dvjh.p1Data;
                this.source = event.dvjh.p1Name;
                
                this.total += this.number;
                this.timeStamp = event.timeStamp;
                
                if ((this.output != null) && (this.output != undefined) && 
                        (this.output.eventName != null) && (this.output.eventName != undefined)){
                        
                    var self = this; // bonne pratique car jQuery peut modifier this
                    
                    var outputEvent = new $.Event(self.output.eventName);

                    outputEvent.dvjh = {
                        length:1,
                        p1Name:new Array("Total", "Nombre", "Source", "TimeStamp ms"),
                        p1Data:new Array(this.total, this.number, this.source, this.timeStamp)
                    };
                    
                    $(this.output).trigger(outputEvent);
                }
            }
            
            return false;
        }
    };
})(jQuery);