Expression régulière retirer les balises html - JQuery Javascript strip html tags

Souvent qu'on cherche a retirer les balises Html  dans un texte ou un document .
Voici un exemple d'expression régulière qui permet de le faire :


 soit
......
var htmlNode=""+
    "Retirer tous les tags "+
    ""+
    " "+
    " ne laisser que le texte"+
    " " ;


 var textOnly=htmlNode.replace(/<(?:.|\s)*?>/gm,"");

alert(textOnly)  ;
// affiche  Retirer tous les tags  ne laisser que le texte

Firefox fermer la fenêtre par le code Javascript Window.close Firefox

Si  essaye de fermer une fenêtre par le window.close()  Firefox renvoie une erreur ; seule les fenêtre ouverte par un script qui pourront être fermées par le script .


parfois si on est  seulement entrain de travailler en local et on veut parier a ça  voici la procédure


dans le barre d adresse de FireFox saisir
about :config 
 un message vous demandant de confirmer votre demande  confirmer le message et la liste de toutes les config  du navigateur s’affiche

chercher pour l’élément :
dom.allow_scripts_to_close_windows


double cliquer dessus afin de lui affecter la valeur true



Calendrier évènement après affichage -- Javascript JQuery DatePicker AfterShow event

Tant cherché pour une fonction qui s exécute après la création et l affichage de calendrier JQuery Un évènement qui manque dans les version actuelles : voici un exemple comment attacher ce genre d évènement au Datepicker
$(function () {

       $.datepicker.olhandler = $.datepicker._updateDatepicker;
    //garder la reference sur _updateDatepicker deja definie dans JQuery ui datepicker
       $.datepicker._updateDatepicker = function (inst) {
        //redefinir la fonction _updateDatepicker
               $.datepicker.olhandler (inst);
      //executer l ancien _updateDatepicker
               var afterShow = this._get(inst, 'afterShow');
      //verifier qu il n existe pas deja une fonction de tel nom
               if (afterShow)
                    afterShow.apply((inst.input ? inst.input[0] : null)); 
    //appliquer after shw a l instance actuelle du datepicker  
         }


  // après ça n peut déclarer le Datepicker avec le nouvel évènement 
  $("seletor").datepicker({
  //...........

  afterShow:function (e){

   //faire quelques choses 
  },

  //...........

  }):
  //.......
});

Panneaux ouvrants/fermants JQuery Collapsible Panels

  Souvent qu'on a besoin de Expandable Panels  dans une page html notamment pour de long formulaires  ou autres . JQuery accordions ne correspond pas toujours a ça   .

voici un Widget pour ça :
.......

 <link rel="stylesheet" type="text/css" href="ui-lightness/jquery-ui.custom.css">
 <script type="text/javascript" src="jquery-1.6.2.min.js"></script>
 <script type="text/javascript" src="jquery-ui.js"></script>
 <script type="text/javascript" >


 (function ($) {
$.widget("ui.collapsiblePanel", {
     defaultOptions:{
 collapsedIcone :"ui-icon-circle-triangle-s",
 expandedIcone  :"ui-icon-circle-triangle-n",
  height:"auto",
 fillSpace:false,
 collapsed:true
},
   _create: function () {
     var opt=$.extend(this.defaultOptions, this.options);
     var expanded=opt.collapsed?opt.collapsedIcone:opt.expandedIcone ;
     var title=opt.title||this.element.attr("title");
     var header=$('<h3 class="ui-helper-reset ui-widget-header '+
      ' ui-corner-top" style="cursor: pointer; "><div>'+
      '<span style="float:left;margin:2px 2px" class="ui-icon '+expanded+
      '" ></span><span >'+title+'</span></div></h3>')
      .click(function (){
 $(this).next("div").slideToggle("fast");
 $(this).find("span.ui-icon")
                .toggleClass(opt.expandedIcone+" "+opt.collapsedIcone);
         }).hover(
                      function () {
                          $(this).addClass("ui-state-hover");
                      },
                      function () {
                          $(this).removeClass("ui-state-hover");
                  });
    var container=$('<div role="collapsiblePanel"'+
                    ' class="ui-helper-reset ui-widget"/>')
           .css( 
                "width",opt.width||this.element.width()
             ) ;
   var wrapper=$('<div  class="ui-helper-reset ui-widget-content '+
                  'ui-corner-bottom">')
       .css("display",opt.collapsed?"none":"block"); 
            
   this.element.wrap(container) 
       .wrap(wrapper)
       .parent()
       .before(header);
          
   },
_setOption: function (key, value) {
        $.Widget.prototype._setOption.apply(this, arguments);
        }
});})(jQuery);
</script>
 <script type="text/javascript" >

 $(function(){
 $('.colPanel').collapsiblePanel();
});


</script>
........
<body>

<div class="colPanel" title="le titre" style="height:200px">
    le contenu du panneau  
</div>


<div class="colPanel" title="un autre  titre" style="height:200px">
    un autre contenu    
</div>



</body>
</html>

on obtient ce ci 









Empêcher la fermeture de la fenêtre du navigateur quand JQuery dialog est affiche -- JavaScrpt JQuery dialog prevent window on close

Pour empêcher du moins prévenir quand la fenêtre du navigateur se ferme et la popup de JQuery (DIALOG) est afficher : On attache l évènement beforeunload au chargement de la popup et on l enlève a la fermeture .......
$("#selector").dialog({
  
      modal :  true,
      closeOnEscape  : false,
         buttons : {
                    "Appliquer" : {text:"Appliquer", click:function(){}},
                    "Annuler" : {text:"Annuler", click:function(){}}
         },
 open : function (){
                     $(window).bind("beforeunload", function() {
                                 return  "  confirmer  SVP : ";
                    }); 
 },
 beforeClose : function (){
                      return confirm("êtes vous sur de vouloir fermer ");
 },
 close : function(){
           $(window).unbind("beforeunload");
  }
 

});
.....
<body>
<div id="selector" title="le titre de la popup ">
le contenu de la popup
</div>
........

</body>

Comparaison et évaluation d'expressions logiques JQuery JavaScript expressions

Voyons ces quelques exemples  :


alert( false == 0 )   //affiche true 
alert( false == "" )   //affiche true 
alert( true== 1 )   //affiche true 
alert( "1"== 1 )   //affiche true 
alert( "01"== 1 )   //affiche true 
alert( "0000001"== 1 )   //affiche true 
alert( [1]== 1 )   //affiche true 
alert( ["1"]== 1 )   //affiche true 
alert( "      +2"== 2 )   //affiche true
alert( ""== 0 )   //affiche true 
alert( "     "== 0 )   //affiche true
alert( "\n"== 0 )   //affiche true
alert( "\ "== 0 )   //affiche true
alert( "\r\n "== 0 )   //affiche true
alert( "\t "== 0 )   //affiche true


Un peu étrange comme résultats, La raison est que  JavaScript est faiblement typé et ne pas oublier que pour les exemples précédents 
l’opérateur === est plus adapté 


alert( false === 0 )   //affiche false
alert( false  === "" )   //affiche false
alert( true === 1 )   //affiche false
alert( "1" === 1 )   //affiche false
alert( "01" === 1 )   //affiche false

......


 d'autres situations reste excitantes je dirais .Exemples: 

alert( == true+1 )   //affiche true 
alert( === true+1 )   //affiche true 
alert( == true+1 )   //affiche true 




if( undefined )    //évalué a  false
if(  null  )       //évalué a  false
if(  ""  )       //évalué a  false
if( 0  )       //évalué a  false

var c;

ifc)    //évalué a  false
c=null;
ifc)    //évalué a  false
c="";
ifc)    //évalué a  false
c=0;
ifc)    //évalué a  false
c=1;
ifc)    //évalué a  true
c=undefined ;
ifc)    //évalué a  false



Parcourir une collection JQuery Javascript Collections

Souvent qu'on voit parcourir un tableau Javascript comme ce ci

var arr=[1,2,3,4] ;

for(var i=0;i<arr.length;i++){
   //.......
}

Au fait la longueur du tableau est calculée autant de fois . Ça peut réduire les performance a l exécution
le mieux serait d écrire ceci  :


var arr=[1,2,3,4],ln=arr.length ;

for(var i=0;i<ln;i++){
   //.......
}

 

Ou même mieux :


var arr=[1,2,3,4] ;

for(var i=0,ln=arr.length;i<ln;i++){
   //.......
}

Ou encore 


var arr=[1,2,3,4] ;

for(var i=0 ;i++ in arr;){
   //.......
}

Enfin avec JQuery  :

var arr=[1,2,3,4] ;
$.each(arr,function( index, value){
//.......
alert("arr["+index+"]="+value);
});





Conversion de nombre Javascript parseInt

Quelle est la meilleure manière de convertir une chaîne de caractères (String) en nombre en Javascript


les méthodes les plus connues sont bien sur parseInt pour convertir en entier et parseFloat pour convertir en nombres flottants . Mais voyons quelques erreurs a ne pas faire avec ces méthodes .


alert( parseInt("30") )    // affiche 30    
alert( parseInt(30) )    // affiche 30  
alert( parseInt("030") )    // affiche 24   
alert( parseInt("00000030") )    // affiche 24 
 


C'est surprenant comme résultats !! Mais si on regarde de prés au fait la méthode parseInt prend un deuxième paramètre   qu'on oublie souvent et c est pas toujours sans conséquences

On devrait écrire plutôt ce ci :


alert( parseInt("30",10) )    // affiche 30    
alert( parseInt(30,10) )    // affiche 30  
alert( parseInt("030",10) )    // affiche 30   
alert( parseInt("00000030",10) )    // affiche 30

 alert( parseInt("30km",10) )    // affiche 30

Le deuxième paramètre spécifie la base décimale .

 Pour éviter les anomalie de parseInt le mieux serait de faire ceci :


alert( Math.floor("30") )    // affiche 30     
alert( Math.floor(30) )     // affiche 30  
alert( Math.floor ("030") )     // affiche 30    
alert( Math.floor("00000030") )     // affiche 30 


alert( Math.floor("30km") )     // affiche NaN 

Ou mieux encore


alert(Number ("30") )    // affiche 30    
alert( Number(30) )    // affiche 30   
alert( Number ("030") )    // affiche 30    
alert( Number("00000030") )    // affiche 30  

alert( Number("30km") )    // affiche NaN   

Ou  encore


alert(+"30" )    // affiche 30     
alert( +30 )    // affiche 30   
alert( + "030" )    // affiche 30   
alert(+"00000030" )    // affiche 30 

alert(+"30km" )    // affiche Nan




Ou  encore


alert("30"/1 )    // affiche 30     
alert( 30/1 )    // affiche 30   
alert(  "030" /1)    // affiche 30    
alert("00000030" /1)   // affiche 30


alert("30km" /1)   // affiche NaN



Enfin selon le cas   on choisira la méthode a utiliser  car elles ont toutes leurs avantages .




Programmation objet héritage JQuery JavaScript OOP

    JavaScript n'utilise pas la notion de  classe pour la création d'objets . A la place les objets peuvent être crées  par  différentes manières notamment par constructeur  qui crée l objet et initialise certain propriétés .
Le constructeur est une fonction qui possède une propriété "prototype"   utilisée   pour l héritage basé sur le prototype et pour partager les propriétés entre différentes  instances  . Les instances d'objets sont alors créées par le mot clef "new" suivi du constructeur ex : new String("bonjour").Ainsi chaque instance partage une référence avec le prototype de son constructeur .

Voyons maintenant pour examiner   quelques exemples de création d'objet en JavaScript . On utilisera la classe "personne" pour questions pratiques.

Création par constructeur

on déclare une fonction dans laquelle on implémente les méthodes et propriétés ce qui rappel les classes dans d'autres langages orientes objet tels que C++, Java, C#...

function Personne( nom, sexe){
     this.DateNaissance=new Date();
     this.nom=nom || "Dupont";
     this.sexe=sexe;
     this.renommer=function(nom){
                                  if(nom)this.nom=nom;
                                 };
                                                                             
}
On a déclaré le constructeur , on ajoute quelques méthodes par le prototype ; methodes qui seront partagées par toutes les instances .

Personne.prototype.quelAge=function(){
                            var ms=new Date()-this.DateNaissance;
                            var ans=ms/1000/60*60*24/365.25;  
                             return Math.floor(ans)+1+" an";
                           }

 Maintenant pour créer une instance on procède ainsi  :

var jaques=new Personne("Jacques","Masculin");
//affiche l age de Jacques.
alert(jaques.quelAge());

ce qui affiche 1 an  , normal Jacques vient de naître  il a moins d'un an . on va pas dire zéro ...

Création par  notation littérale 

cette fois au lieu de passer par le constructeur on instancie directement un objet par une instance de l objet prédéfinie Object :
var jaques=new Object();
     //on attache dynamiquement les propriétés a l'instance
     jaques.nom="Jacques";
  jaques.sexe="Masculin";
  jaques.DateNaissance=new Date();
     jaques.quelAge=function(){
                            var ms=new Date()-this.DateNaissance;
                            var ans=ms/1000/60*60*24/365.25;  
                             return Math.floor(ans)+1+" an";
                           }

alert(jaques.quelAge());

de même que précédemment  affiche 1 an.


Une autre façon de créer un objet est d'utiliser la représentation JSON    soit :

 var jaques={};
     //on attache dynamiquement les propriétés a l'instance
     jaques.nom="Jacques";
  jaques.sexe="Masculin";
  jaques.DateNaissance=new Date();
     jaques.quelAge=function(){
                            var ms=new Date()-this.DateNaissance;
                            var ans=ms/1000/60*60*24/365.25;  
                             return Math.floor(ans)+1+" an";
                           };

alert(jaques.quelAge());

ce qui  affiche 1 an.

ou directement :

var jaques={
     //on attache dynamiquement les propriétés a l'instance
     nom :"Jacques",
  sexe "Masculin",
  DateNaissance new Date(),
     quelAge function(){
                            var ms=new Date()-this.DateNaissance;
                            var ans=ms/1000/60*60*24/365.25;  
                             return Math.floor(ans)+1+" an";
                           }

};
//et on ajoute une propriétés 
jaques.renommer=function(nom){
                 if(nom)this.nom=nom;
                          };


alert(jaques.quelAge());

  Affiche a nouveau  1 an.


On vient de voir les Différentes manières de création d'objet et JavaScript  a présent on s’intéressera au autre notions de la programmation oriente objet POO en JavaScript et on fera une analogie avec les autre langages objet

Variables et accesseurs

En utilisant la création par constructeur qui ressemble a la notion de classe dans Java, C# :
On peut distinguer différents accesseur pour les attributs d un objet
privé, public , public privilégie, et public statique 

pour illustration reprenons l exemple de  "Personne"



function Personne( nom, sexe){
     //propriétés privées 
     var celibataire =true;

     //propriétés public privilégiées 

     this.DateNaissance=new Date();
     this.nom=nom|| "Dupont";
     this.sexe=sexe;

      //incrémentation d'une propriétés public statique
     this.constructor.nombreDeNaissance++;

     //méthodes public privilégiées
     this.renommer=function(nom){
                                  if(nom)this.nom=nom;
                                 };
     this.seMarie= function(){
                                   celibataire =false;
                               };
     thisestMarie=function(){
                               return celibataire?"Non":"Oui" ;
                              }
     this.divorce = function(){
                                   celibataire=true;
                               };
     this.mange= function(){
                               alert("envoies la mayonnaise ");
                               };
     this.quelAge= function(){
                          return calculerAge(this.DateNaissance);
                          };
    
      //méthodes  privées

      function calculerAge(date){
                            var ms=new Date()-date;
                            var ans=ms/1000/60*60*24/365.25;  
                             return Math.floor(ans)+1+" an";
                      };

                           
                                                                        
}
  //propriétés public statique
Personne.nombreDeNaissance=0;

  //méthodes  public  



Personne.prototype.mange=function(){
                             alert("...pas faim !! ");
                           }; 



var jaques=new Personne("Jacques","Masculin");
alert(jaques.quelAge()); //affiche 1 an 
//utilise la méthode privée pour calculer l age 
alert(jaques.estMarie()); //affiche  Nom 
//affiche la valeur de propriété privée celibataire 
 jaques.seMarie() ; 
//modifie la valeur de propriété privée celibataire  
alert(jaques.estMarie()); //affiche  Oui
//affiche a nouveau la valeur de propriété privée celibataire 

jaques.divorce () ; 
 //modifie la valeur de propriété privée celibataire  
alert(jaques.estMarie()); //affiche  Nom ,(il vient de divorcer)

//affiche a nouveau la valeur de propriété privée celibataire

alert(Personne.nombreDeNaissance); //affiche 1 (celle de Jacques)
//affiche   la valeur de propriété statique nombreDeNaissance
jaques.mange() //affiche envoies la mayonnaise
///on constate que c est la méthode public privilégié qui s’exécute non la méthode public définie dans le prototype 

Ici on ajoute a jacques des propriétés dynamiquement :

jaques.celibataire="depuis peu"
alert(jaques.estMarie()); //affiche  Nom
//affiche toujours la valeur de propriété privée celibataire
var marie=new Personne("Marie","féminin");
alert(jaques.celibataire);//affiche  depuis peu
alert(marie.celibataire);   //affiche undefined


jaques possède deux propriétés qui portent le même nom "celibataire" une public  et l autre privée .
par contre marie ne possède que la propriété privée du même nom celle du constructeur  


Héritage , polymorphisme extension d'objet  

allons droit au but et gardons en tète la "classe" Personne définie précédemment a la quelle on rajoutera quelles  attributs soit :

Personne.prototype.toString=function (){
                     return "[Personne]:"+this.nom;
}

Personne.prototype.travailler=function (){
                     return "[Personne]: que c'est dur";
}

Maintenant on veut créer une classe Salarie qui dérive de  Personne ?

   On pourrait directement créer une instance de la Personne et on rajoute les propriétés spécifiques au salarié Mais dans notre cas on veut rester avec les constructeurs et prototype  la première idée serait d écrire ce ci  :


 Salarie .prototype=new Personne();
    //assigner toutes les propriétés d'une instance de 
    //personne au prototype de nouvelle instance Salarie  

function Salarie (nom ,profession){
      
       
       Personne.call(this,nom);
       //on exécute le constructeur de la classe Personne dans le
       // contexte de Salarie
  
       this.salaire=1000;
       this.profession=profession;
      //propriétés spécifiques au Salarie 
}

Voyons ce que ça donne en vrai :

var marie=new Salarie ("Marie","Comptable");

alert(marie );//appel toString affiche  [Personne]:Marie
alert(marie.profession);   //affiche Comptable


 marie.mange() ;//affiche  envoies la mayonnaise
 alert(marie.travailler());   //"[Personne]: que c'est dur";


C'est déjà pas mal !. Mais si on veut  faire en sort que la surcharge puisse fonctionner ? on le constate bien le toString affiche toujours [Personne]:Marie si on veut plutôt  [Salarie ]:Marie
dans ce cas faudra réexaminer le toString de la classe de base  ainsi :


Personne.prototype.toString=function (){
               return "["+this.constructor.name+"]"+this.nom;
}

Personne.prototype.travailler=function (){
                     return "["+this.constructor.name+"]: que c'est dur";
}


et on précise a la classe Salarie  que le constructeur associé a son prototype est bien Salarie

ce qui donne :
Salarie .prototype=new Personne();
Salarie.prototype.constructor=Salarie ;


    //assigner toutes les propriétés d'une instance de 
    //personne au prototype de nouvelle instance Salarie
    //associe Salarie au constructeur de son prototype   

function Salarie (nom ,profession){
           
       Personne.call(this,nom);
       //on exécute le constructeur de la classe Personne dans le
       // contexte de Salarie
       this.salaire=1000;
       this.profession=profession;
      //propriétés spécifiques au Salarie 
}



var marie=new Salarie ("Marie","Comptable");

alert(marie );//appel toString affiche  [Salarie ]:Marie
alert(marie.profession);   //affiche Comptable


alert(marie.travailler());   //"[Salarie ]: que c'est dur";


Et voilà ! ca fonctionne presque comme de l héritage classique . Bien sur c est pas encore parfait ;
on est obligé d 'écrire a chaque fois les appels a la classe de base de spécifier chaque fois les appels au prototype  voyons comment automatiser tout ça :

En premier abord on est tenté de créer une fonction qui va faire appels précédents a notre place  par exemple étendre l'objet Function    de Javascript ainsi que Object  cette fonction on va l inclure a chaque fois .
Exemple de fonction pour l héritage :

if(typeof Function.prototype.extends != "function"){
    Function.prototype.extends=function (base){
             this.prototype = new base();
               this.prototype.constructor = this;    
    }
}


if(typeof Object.prototype.extends != "function"){
 Object.prototype.extends=function (base){
     (arguments.length>1)?
      base.apply(this,Array.prototype.slice.call(arguments,1)):
      base.call(this);
 }
}




Salarie.extends(Personne);
    
function Salarie (nom ,profession){
           
       this.extends(Personne,nom )
       this.salaire=1000;
       this.profession=profession;
      
}



var marie=new Salarie ("Marie","Comptable");

alert(marie );//appel toString affiche  [Salarie ]:Marie
alert(marie.profession);   //affiche Comptable


alert(marie.travailler());   //"[Salarie ]: que c'est dur";




Dire qu'on peut déjà s’arrêter là....

a suivre améliorations ....