Les langages du web > Le Javascript

Résumé de w3P.js

requiert w3P.js

Ce cours est un pense-bête (en français/anglais) du cours w3.js (en anglais). Par rapport à ce site, l'ordre de présentation n'est pas toujours respecté. Ici, version 1.04 (Avril 2019). Version 1.03 = December 2017

Pré-requis :

Introduction

w3.js est une JavaScript library conçue pour simplifier le développement de projets web. Ce fichier pèse 13 Ko (version 1.04, avril 2019, 12 374 octets, (codé inchangé en décembre 2022). Compte tenu de sa puissance et de son faible poids, w3.js devrait être lié à toute page web.

Toutefois, w3P.js est une version modifiée de w3.js

/* W3.JS 1.04 April 2019 by w3schools.com modified
w3-repeat -> data-w3-repeat
w3-include-html -> data-w3-include-html */

Cela vous permettra :

Il est obligatoire de placer l'appel à ce Javacript dans le <head>, si w3.includeHTML() est utilisée. Vu son faible poids, 13 Ko, w3P.js sera, pratiquement, toujours appelé dans le <head>.

    <script src="https://www.w3schools.com/lib/w3.js"></script>
  </head>
  ...

Avec le code ci-dessus, l'application web ne fonctionnera que si l'utilisateur est connecté à internet. Elle ne fonctionnera pas si l'utilisateur est connecté à un serveur local.

    <script src="../../w3P.js"></script>
  </head>

Avec ce code, l'application web fonctionnera dans tous les cas, que l'utilisateur soit connecté via le protocole http(s):// ou file:///

Lors de tests sur un serveur, il se peut que le fichier JS utilisé soit celui mis en cache. Il faut alors vider le cache du navigateur pour que le fichier JS modifié soit pris en compte.

Gestion des données

Servers

Si les données à afficher sont stockées dans un SGBDR (MySQL ou SQLite), il faut, au préalable, que le fichier php.ini soit correctement configuré.

php.ini

Avec XAMPP (sous Windows), on peut consulter le fichier php.ini

; Notes for Windows environments :
;
; - Many DLL files are located in the extensions/ (PHP 4) or ext/ (PHP 5+)
;   extension folders as well as the separate PECL DLL download (PHP 5+).
;   Be sure to appropriately set the extension_dir directive.
;
extension=bz2
extension=curl
extension=fileinfo
extension=gd2
extension=gettext
;extension=gmp
;extension=intl
;extension=imap
;extension=interbase
;extension=ldap
extension=mbstring
extension=exif      ; Must be after mbstring as it depends on it
extension=mysqli
;extension=oci8_12c  ; Use with Oracle Database 12c Instant Client
;extension=odbc
;extension=openssl
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
;extension=pdo_pgsql
extension=pdo_sqlite
;extension=pgsql
;extension=shmop

Une fois le fichier php.ini correctement configuré, il faut créer une connexion à la base de données.

PHP et MySQL (PDO)

<?php
header("Content-Type: application/json; charset=UTF-8");

// connexion ----------------------------------------------
$typDB="mysql";
  $host="localhost";
  $dbname=""; // 'cc1'
  $root=""; // 'root'
  $password=""; // ''
$cnx=$typDB.":host=".$host.";dbname=".$dbname;
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
try { $bdd = new PDO($cnx, $root, $password, $options); }
catch (Exception $e) { die('Erreur de connexion : ' . $e->getMessage()); }

// requête ------------------------------------------------
$sql = "SELECT id AS a, email AS b FROM table";
$rep=$bdd->query($sql);
if ($rep===FALSE) die;
$data=$rep->fetchAll(PDO::FETCH_ASSOC);
echo "{\"lignes\":".json_encode($data)."}";
?>

PHP et SQLite (PDO)

Requête de sélection : query()

<?php
header("Content-Type: application/json; charset=UTF-8");
$bdd = new PDO("sqlite:test.db");
$sql="..."; // echo $sql."<br>";
$rep = $bdd->;query($sql);
$data=$rep->fetchAll(PDO::FETCH_ASSOC);

/* // ajout d'une ligne vide, car liste déroulante
$lignVide=["id_group"=>"0","nom"=>""];
array_unshift($data,$lignVide);
*/

echo "{\"lignes\":".json_encode($data)."}";
?>

Requête d'action : exec()

$bdd = new PDO("sqlite:test.db");
$sql="...";
$ok=$bdd->exec($sql); /* Retourne TRUE si succès */

if(!$ok) {echo "La requête SQL a été exécutée avec succès.";}
else{echo "N'a été exécutée avec succès la requête SQL suivante :
$sql
";} echo "<br>Retour à la <a href='index.htm'>page d'accueil</a>";

Plus d'info : PHP - SQLite, Manuel PHP > SQLite 3, PHP SQLite3 tutorial

Autres connexions

PHP and MySQL (non PDO)

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");

$conn = new mysqli("myServer", "user", "pass", "myDB");

$result = $conn->query("SELECT CompanyName, City, Country FROM Customers");

$outp = "";
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
  if ($outp != "") {$outp .= ",";}
  $outp .= '{"Name":"'  . $rs["CompanyName"] . '",';
  $outp .= '"City":"'   . $rs["City"]        . '",';
  $outp .= '"Country":"'. $rs["Country"]     . '"}';
}
$outp ='{"customers":['.$outp.']}';

$conn->close();

echo($outp);
?>

W3Data

On constate qu'une seule ligne de code change dans les fichiers PHP. Celle liée à la requête SQL : $sql="...";. Ainsi, tous les fichiers JS pourraient appeler le même fichier PHP, si on l'appelait avec comme paramètre la requête SQL.

Toutefois, pour ne pas dévoiler une partie de la structure de la base de données (et ainsi réduire le risque d'attaque), il est préférable de passer en paramètre l'ID de la requête SQL.

Générer un ID

w3.getHttpObject("data.php?ID=9gXv5", myCtrl);
...

Si l'ID correspond à un nombre ordonné, un curieux pourrait, en incrémentant ce nombre, et découvrir une réponse destinée à des administrateurs.

data.php

<?php
/*header("Access-Control-Allow-Origin: *");*/
header("Content-Type: application/json; charset=UTF-8");

$sql="";$ID=""; if (isset($_GET['ID'])) $ID=$_GET['ID'];
switch ($ID) {
  case '9gXv5': $sql="..."; break;
  default:$sql="";
}
/*if($sql=="") die("Veuillez vérifier l'identifiant de la requête SQL");*/

require("../res/php/inc_connexion_tmp.php");
$rep=$bdd->query($sql);
/*if ($rep===FALSE) sortir(1,"");*/
$data=$rep->fetchAll(PDO::FETCH_ASSOC);
echo "{\"lignes\":".json_encode($data)."}";
// print_r("{\"lignes\":".json_encode($data)."}");
?>

w3.getHttpObject("fileName",myFunction)

Cette méthode w3.getHttpObject() lit un fichier situé sur un serveur contenant (ou renvoyant) un (seul) data-object au format JSON.

L'utilisation de cette méthode implique que le fichier JS est situé sur un serveur (local ou distant).

Le premier paramètre est le nom de ce fichier (qui peut être un fichier PHP, TXT, JSON ...)

Le premier paramètre pourrait être un fichier JSON, tel que :
w3.getHttpObject("customers.json", myCtrl);
Attention. Un fichier JSON ne contient pas de commentaires et la clé est entourée de guillemets.

Ce data-object ressemble à une string particulière, souvent très longue.

Ce data-object est un objet contenant un :

Le second paramètre de la méthode w3.getHttpObject(), ici myCtrl, n'est pas une string, mais le nom d'une fonction qui doit être identique à celui de la fonction déclarée dans ce fichier JS.

function myCtrl(myDataObject) {
  /* Ici, code éventuel de traitement des données à afficher */
  w3.displayObject(...);
}
w3.getHttpObject("localites.php", myCtrl);

Ce nom de fonction peut être quelconque. Autant ne pas le changer. Nous verrons ci-dessous que cette fonction, MyCtrl(), servira au traitement des données avant d'appeler la méthode w3.displayObject() pour afficher les données.

data-object

Le data-object peut être contenu dans une variable du fichier JS. Ceci permet d'afficher les données sans être connecté à un serveur.

data-object : Tableau d'objets

Exemple de fichier contenant un data-object valide : customers.js

{"lignes":[
{"key1":"value1","key2":"values", ...},
{...},
...
{...}
]}

Le nom de la clé, ici lignes, ayant pour valeur un tableau (d'objets), est identique à celui indiqué dans le fichier HTML, au niveau de la ligne du tableau, devant être répétée. (Exemple : Voir le code HTML ci-dessous)

Exemple de codes HTML, JS et PHP

Extrait du fichier localites.htm :

      <div class="w3-responsive">
        <p>
          Nom recherché : <input oninput="w3.filterHTML('#tableau', '.item', this.value)"
          placeholder="Nom de la localité, code postal" style="width:35%" id="champ1" />
        </p>
        <table class="w3-table-all w3-hoverable" id="tableau">
          <thead>
            <tr class="w3-black">
              <th style="width:20%">
                Code Postal
              </th>
              <th style="width:80%">
                Nom de la localité
              </th>
            </tr>
          </thead>
          <tbody>
            <tr class="item" data-w3-repeat="lignes">
              <td>
                {{a}}
              </td>
              <td>
                {{b}}
              </td>
            </tr>
          </tbody>
        </table>
      </div>

Ce code affiche un champ de recherche au dessus du tableau, qui fait appel à la fonction w3.filterHTML()

L'identifiant du champ de recherche, ici id="champ1", est utilisé dans la dernière ligne du fichier JS, document.getElementById('champ1').focus();, pour placer le curseur dans ce champ à la fin du chargement de la page.

L'identifiant du tableau, ici id="tableau", est celui utilisé comme premier paramètre de la fonction w3.displayObject() présente dans le fichier JS, souvent de même nom que le fichier HTML.

w3-repeat n'est pas un attribut HTML5
w3-repeat -> data-w3-repeat => modifier la version 1.03 de w3.js (= w3P.js)

localites.js :

function myCtrl(myDataObject) {
  /* Ici, code éventuel de traitement des données à afficher */
  w3.displayObject(...);
}
w3.getHttpObject("localites.php", myCtrl);

localites.php :

<?php
/*header("Access-Control-Allow-Origin: *");*/
header("Content-Type: application/json; charset=UTF-8");
require("../res/php/inc_connexion_tmp.php");
$sql = "SELECT cp AS a, nomLocalite AS b FROM localites ORDER BY cp";
$rep=$bdd->query($sql);
if ($rep===FALSE) sortir(1,"");
$data=$rep->fetchAll(PDO::FETCH_ASSOC);
echo "{\"lignes\":".json_encode($data)."}";
// print_r("{\"lignes\":".json_encode($data)."}");
?>
  • Cross-Site HTTP Requests : Requests for data from a different server (other than the requesting page), are called cross-site HTTP requests. Cross-site requests are common on the web. Many pages load css, images, or scripts from different servers. However, in modern browsers, HTTP requests from scripts are restricted to the same site for security reasons. The following line (in the PHP example above) allows access to the page from a cross-site :
    header("Access-Control-Allow-Origin: *");

  • La ligne, header("Content-Type: application/json; charset=UTF-8"); est importante. Elle détermine le type de renvoi de la fonction echo.

  • La ligne, echo "{\"lignes\":".json_encode($data)."}"; retourne au fichier appelant le data-object (au lieu de l'afficher).

  • Autre exemple : tableauPro

data-object : Tableau de valeurs

{"lignes":[
"0001_4GE1_80d9ecef6439e4fd3ef614c2d7f349e1.txt",
"0003_4GE1_80d9ecef6439e4fd3ef614c2d7f349e1.txt",
"0004_6GE1_80d9ecef6439e4fd3ef614c2d7f349e1.txt"
]}

Par rapport, au tableau d'objets vu précédemment, ici, chaque objet est remplacé par une valeur (ici, une string).

Exemple de codes HTML, JS et PHP

Code HTML, extrait du fichier publier.htm :

        <div class="w3-responsive">
          <p>
            Nom recherché : <input oninput="w3.filterHTML('#tableau', '.item', this.value)"
            placeholder="Numéro, type ou auteur" style="width:35%" id="champ1" />
          </p>
          <table class="w3-table-all w3-hoverable" id="tableau">
            <thead>
              <tr class="w3-black">
                <th style="width:90%">
                  QCM
                </th>
                <th style="width:10%">
                  Action
                </th>
              </tr>
            </thead>
            <tbody>
              <tr class="item" data-w3-repeat="a in lignes">
                <td>
                  {{a}}
                </td>
                <td>
                  TODO
                </td>
              </tr>
            </tbody>
          </table>
        </div>

Lorsque le data-object est un tableau de valeurs, la différence au niveau du code HTML est a in lignes

publier.js :

function myCtrl(myDataObject) {
  if(myDataObject.lignes.length>0) { /* myDataObject.lignes = un tableau */
    w3.displayObject("tableau", myDataObject); w3.show('#QCM_list');
  } else w3.show("#noQCM");
}
document.getElementById('champ1').focus(); w3.hide('#noQCM');  w3.hide('#QCM_list');
w3.getHttpObject("publier.php", myCtrl);

Il est logique de n'afficher un tableau que s'il contient des données. D'où la condition, où lignes est la clé de l'objet myDataObject (cfr la dernière ligne du fichier PHP, ci-dessous).

publier.php :

<?php
  $data = []; /* un tableau indexé (=> non associatif) */
  ...
  echo "{\"lignes\":".json_encode($data)."}";
?>

Rappel : Lorsque la valeur est une string, elle doit être codée en UTF-8, vu l'exigence imposée par la fonction PHP json.encode().

 

Affichage en fonction d'une liste déroulante : Exemple

On peut aussi permettre à l'utilisateur de sélectionner, en plus de filtrer (voire de trier). Cela provoquera un rechargement de la page.

localites2.htm :

        <div class="w3-row">
          <p class="w3-half">
            Province : <select id="province" onchange="chargement()">
              <option value="-1" placeholder="">
                Choisissez
              </option>
              <option value="3">
                Brabant Wallon
              </option>
              <option value="4">
                Bruxelles-Capitale
              </option>
              <option value="7">
                Hainaut
              </option>
              <option value="8">
                Liège
              </option>
              <option value="10">
                Luxembourg
              </option>
              <option value="11">
                Namur
              </option>
            </select>
          </p>
          <p class="w3-half">
            Localité recherchée : <input oninput=
            "w3.filterHTML('#tableau', '.item', this.value)" placeholder=
            "Nom de la localité, code postal" id="champ1" />
          </p>
        </div>

localites2.js :

chargement();

function chargement(){
  document.getElementById('champ1').value="";
  var province=document.getElementById('province').value;
  w3.getHttpObject("data.php?ID=9gXv5&where="+province,myCtrl);
  function myCtrl(myDataObject) {w3.displayObject("tableau", myDataObject);}
  document.getElementById('champ1').focus();
}

La fonction myCtrl() est déclarée dans la fonction chargement(). Ce controller ne traite pas les données du data-object. Ce controller ne fait (contrôle) rien. myCtrl() se contente, ici, d'appeler la méthode w3.displayObject(). Normalement, le traitement a lieu avant la demande d'affichage.

data.php :

/*header("Access-Control-Allow-Origin: *");*/
header("Content-Type: application/json; charset=UTF-8");
require("../res/php/inc_connexion_tmp.php");

$sql="";$ID=""; if (isset($_GET['ID'])) $ID=$_GET['ID'];
$where="";   if (isset($_GET['where'])) $where=$_GET['where'];
$orderBy=""; if (isset($_GET['orderBy'])) $orderBy=$_GET['orderBy'];
$limit="";   if (isset($_GET['limit'])) $limit=$_GET['limit'];

switch ($ID) {
  case '9gXv5':
  if($where!="") $where=" WHERE numProvince=".$where;
  $orderBy=" ORDER BY cp";
  $sql="SELECT cp AS a, nomLocalite AS b FROM localites".$where.$orderBy.$limit; break;

  default:$sql="";
}
/*die ("--". $sql);*/
/*if($sql=="") die("Veuillez vérifier l'identifiant de la requête SQL");*/

$rep=$bdd->query($sql);
/*if ($rep===FALSE) sortir(1,"");*/
$data=$rep->fetchAll(PDO::FETCH_ASSOC);
echo "{\"lignes\":".json_encode($data)."}";
/* print_r("{\"lignes\":".json_encode($data)."}");*/

myCtrl(myDataObject)

Une fois que le data-object existe (grâce au code PHP ou présent dans un fichier JS), les données qu'il contient peuvent être traitées avant leur affichage via la méthode w3.displayObject().

A controller is a function you write to control your data. With a self-written controller, you can modify data anyway you want : Convert to upper case, Convert currencies, Calculate and Summarize, Round values, Substitute values, Change colors according to values, Anything else you are able to program

Si les valeurs d'une colonne doivent être transformées avant l'affichage, par commodité, une colonne est ajoutée à l'objet JSON initial. Une colonne supplémentaire par colonne dont les valeurs doivent être modifiées avant affichage. Ce dédoublement fait grossir l'objet JSON inital. La colonne supplémentaire contiendra les données à afficher et la colonne dédoublée contient les données brutes sur lesquelles se feront les calculs.

function myCtrl(myDataObject) {
  var x = myDataObject.transactions; /* x = tableau d'objets (de lignes) */

  /* Les colonnes "b", "c" et "d" étant respectivement
  une date au format aaaa-mm-jj et deux number représentant un montant
  myObjet est modifié ( ajout des colonnes "bb", "cc" et "dd")
  NB : myObject étant passé à la fonction par référence, il sera modifié
  (Il contiendra donc trois colonnes de plus). x[i] représente une ligne. */

  for (var i = 0; i < x.length; i++) {
    x[i]["bb"] = dateFr(x[i]["b"]);
    x[i]["cc"] = x[i]["c"].toLocaleString('fr-BE',{ style:'currency',currency:'EUR'});
    x[i]["dd"] = x[i]["d"].toLocaleString('fr-BE',{ style:'currency',currency:'EUR'});
  }

  w3.displayObject("tableau", myDataObject);
}

/* Convertit une chaîne aaaa-mm-jj en chaîne telle que 3 jan 2018 */
function dateFr(aaaa_mm_jj){
  var parts = aaaa_mm_jj.split("-");
  var j=parts[2]; if (parts[2][0]=="0") j=parts[2][1];
  return j+" "+mois[parseInt(parts[1]-1)]+" "+parts[0];
}

Ici, le controller appelle une fonction externe dateFr() pour faire le traitement nécessaire.

Exemple d'un controller qui transforme un tableau de valeurs en un tableau d'objets :

function myCtrl(myDataObject) {
  if(myDataObject.lignes.length>0) {
    var x = myDataObject.lignes, y=[], myDataObject2={};
    for (let i = 0; i < x.length; i++) { let obj={}; obj.a=x[i];
      if(location.hash=="#y"){
        obj.b="<a href='copier.php?file="+x[i]+"' style='text-decoration: none;'>🗊</a>";
      }else{
        obj.b="<a href='effacer.php?file="+x[i]+"' style='text-decoration: none;'>❌</a>";
      }
      y.push(obj);
    }
    myDataObject2.lignes=y;
    w3.displayObject("tableau", myDataObject2); w3.show('#QCM_list');
  } else w3.show("#noQCM");
}

let obj={}; doit être déclaré dans la boucle.

Exemple : Summarize Price in a Table

w3.displayObject("id",myObject)

Cette méthode est l'une des plus intéressantes de ce framework, car elle permet de remplir :

... sans être connecté à un serveur (local ou distant), simple via un objet JS au format JSON qui contient toutes les données à afficher.

Voir : data-w3-repeat.htm

Le premier paramètre est une string, entourée de guillemets (ou d'apostrophes), ayant comme valeur la valeur de l'attribut id d'une balise HTML, indiquant la zone dans laquelle les remplacements ont lieu.

Cette valeur ne doit pas être précédée par #. Elle vaut souvent tableau (voire liste)

Si la valeur du premier paramètre n'est pas celle de l'attribut id d'une balise HTML, se produit une erreur (qui s'affiche dans l'outil de développement du navigateur : CTRL+MAJ+I)

Le second paramètre est le nom du data-object contenant les données (au format JSON)

Ce data-objet a, souvent, la forme suivante :
var myDataObjet={"lignes":[{...},{...},...{...}]};

Lorsqu'il doit exister une connexion, la méthode w3.getHttpObject() est appelée avant cette méthode d'affichage (dans le même fichier JS).

Attention : L'appel de cette fonction DOIT être située après la construction / déclaration du data-object (second paramètre)

Il suffit alors d'ajouter les doubles accolades, {{ }}, à toute balise HTML identifiée (par le premier paramètre) pour réserver l'espace pour les données. Au final, après l'appel de la méthode w3.displayObject() s'afficheront les données dans la page web.

L'utilisation de ces doubles accolades, {{ }}, est permise comme valeur d'un attribut mais, dans ce cas, elle sera considérée comme une erreur lors d'un test de validation du code HTML (W3C). Exemples :

  • <a href= "mailto:{{e_mail}}">{{e_mail}}</a>
  • <a href="details.php?id_fiche={{a}}">{{a}}</a>

Le fichier HTML peut avoir un code HTML identique à celui vu avec la méthode w3.getHttpObject().

L'utilisation de w3.displayObject() peut aussi être utile avec un data-object qui n'est pas issu d'une base de données, pour remplir un simple texte.

Un data-object peut ne contenir qu'un seul enregistrement.

Et, une zone applicative peut contenir une zone applicative ! (imbrication.htm)

Avec ou sans data-w3-repeat

myObject est toujours un objet JSON. Il est donc

  • soit un tableau de couples :

    {"customers":[
      {"CustomerName":"Alfreds Futterkiste","City":"Berlin","Country":"Germany"},
      {"CustomerName":"Around the Horn","City":"London","Country":"UK"},
    ...
    ]}
  • soit un tableau de valeurs :


    {"cars":[
    "Volvo", "Ford", "BMW", "Mercedes"
    ]}
  • soit une collection de couples :

    {"firstName" : "John", "lastName" : "Doe"}
  • soit ...

Généralement, une base de données renvoye un tableau de couples (ou un tableau de valeurs)
L'objet le plus court est myObject={key:value};

JSON = tableau de couples

Cette fonction, w3.displayObject(), devient très utile lorsque le nombre de couples key:value ou de collections de couples devient très important et/ou lorsque les valeurs ne peuvent pas être connues avant le codage en HTML. Par exemple, lorsque ces couples proviennent d'une base de données.

avec data-w3-repeat

dans une liste déroulante sans value

Code HTML :

<select id="id01">
  <option data-w3-repeat="customers">{{CustomerName}}</option>
</select>

Code JS :

var myObject = {"customers":[
{"CustomerName":"Alfreds Futterkiste","City":"Berlin","Country":"Germany"},
{"CustomerName":"Around the Horn","City":"London","Country":"UK"},
...
]};

w3.displayObject("id01", myObject);

dans une liste déroulante avec value

Code HTML :

<select id="conteneur" name="conteneur">
  <option data-w3-repeat="lignes" value="{{a}}">{{b}}</option>
</select>

La couleur syntaxique de l'éditeur de code HTML peut induire en erreur.

Code JS :

var conteneur = {"lignes":[
{"a":"4","b":"Me"},
{"a":"17","b":"Me2"},
{"a":"18","b":"Me3"}
]};
w3.displayObject("conteneur",conteneur);

JSON = tableau de valeurs

Ici, la value de l'objet myObject est un tableau de collections.


Ou, si la value de l'objet cars est un tableau de valeurs.

<select id="id01">
  <option data-w3-repeat="x in cars">{{x}}</option>
</select>

<script>
w3.displayObject("id01", {"cars" : ["Volvo", "Ford", "BMW", "Mercedes"]});
</script>

JSON = collections de couples

sans data-w3-repeat

Code HTML :

<div id="id01">
{{firstName}} {{lastName}}
</div>

Code JS :

var myObject = {"firstName" : "John", "lastName" : "Doe"};
w3.displayObject("id01", myObject);

Ici, l'objet myObject est une collection de couples key:value séparés par une virgule.


Ou, via le script :

w3.includeHTML(myCallback); /* ?????????? */

function myCallback() {
    w3.displayObject("id01", myObject);
}

Exemple - tryw3js_display_table

Plus d'info : w3.displayObject

Gestion de l'apparence

w3.filterHTML("#id",'#id .item', this.value)

Filtrer un tableau :

Les lignes ne contenant pas le terme recherché seront cachées.

  • Dès lors, le fait qu'une ligne sur deux ait une couleur de fond différente ne sera plus respecté.

  • La recherche ne portera pas sur une colonne, ni qu'au début de la string. Ce qui rend le filtrage effectué par w3.filterHTML() non optimal.

  • Si w3.filterHTML('#id01', '.item', this.value) => le filtrage s'appliquera aux éventuelles autres tables ...

  • Il serait possible d'appliquer le filtre sur une colonne, si <td class="item">Alfreds Futterkiste</td>
    Exemple - filterHTML.htm

<input oninput="w3.filterHTML('#id01', '#id01 .item', this.value)" />

<table id="id01">
  <tr>
    <th>Customer</th>
    <th>City</th>
    <th>Country</th>
  </tr>
  <tr class="item">
    <td>Alfreds Futterkiste</td>
    <td>Berlin</td>
    <td>Germany</td>
  </tr>
  <tr class="item">

Filtrer une liste :

  <input oninput="w3.filterHTML('#id01', 'li', this.value)" />

  <ul id="id01">
    <li>...</li>
  </ul>

Exemple - w3js_filters

w3.sortHTML("#id", '.item'[, 'td:nth-child(n)'])

Trier alphabétiquement une table

Exemple - sortHTML.htm

Le troisième paramètre indique la colonne.
n (= numéro d'une colonne) varie de 1 à ...

<table id="myTable">
  <tr>
    <th onclick="w3.sortHTML('#myTable','.item', 'td:nth-child(1)')">Name</th>
    <th onclick="w3.sortHTML('#myTable','.item', 'td:nth-child(2)')">Country</th>
  </tr>
  <tr class="item">
    <td>Berglunds snabbkop</td>
    <td>Sweden</td>
  </tr>
  <tr class="item">

Le tri ne porte que sur les string (et non les number, les dates, currencies, ...). Ajoutons que plus le tableau contient de cellules, plus le tri est lent ! Pratiquement, le tableau devrait être limité à 500 cellules.

Trier alphabétiquement une liste

<button onclick="w3.sortHTML('#id01', 'li')">Sort</button>

<ul id="id01">

Exemple - tryw3js_sort_table

w3.includeHTML(param)

Cette fonction, faisant appel à un fichier (htm, txt, ...), requiert que le fichier appelant (*.js) soit situé sur un serveur web (local ou distant) et que le moteur JS du navigateur soit activé. Cette fonction est donc idéalement utilisée dans des applications web.

param peut être :

Le fichier w3.js doit être chargé avant l'appel de cette fonction, w3.includeHTML(). =>

    <script src="../../w3P.js"></script>
  </head>

Son usage est très pratique lorsque le code HTML devient long. En effet, l'ajout inopportun d'une <div> suivi d'une mise en forme automatique du code (via Tidy) peut entraîner une longue perte de temps pour corriger. Le code HTML devient plus propre (car plus court)

Le paramètre de l'attribut data-w3-include-html est un nom du fichier qui peut avoir n'importe quelle extension (dont txt).

Comme le contenu du fichier à inclure contient du code HTML, il est logique que l'extension de ce fichier soit ".htm"

Il bénéficiera alors de la coloration syntaxique, si le code HTML devait être retravaillé plus tard (ce qui est probable).

De plus, si le fichier à inclure contient des liens, il pourra alors être analysé comme n'importe quel fichier htm par un programme externe qui chercherait à établir une cartographie du site (tel que makeDot.py)

Il est préférable que le nom soit préfixé par "inc_" (ou "xxx_") suivi du nom du fichier l'incluant. Par exemple : inc_index.htm

xxx.htm :

    <script src="w3P.js"></script>
    <link rel="stylesheet" href="w3P.css" />
  </head>
  <body>

    <div data-w3-include-html="summary.htm"></div>
    <div data-w3-include-html="xxxModales.txt"></div>

    <script src="includeHTML.js"></script>   conseillé 
  </body>

L'appel (unique) de cette fonction, juste avant la balise </body>, inclut tous les fichiers. Ci-dessus, deux : summary.htm et xxxModales.txt. Ici, le fichier summary.htm sera utilisé dans plusieurs fichiers.

L'utilisation d'un fichier JS ne contenant qu'une seule ligne se justifie par la volonté de ne pas avoir de code JS dans du code HTML. Cela devient une nécessité lorsque le code HTML est nettoyé via Tidy.

includeHTML.js :

w3.includeHTML(); /* appel d'une fonction de w3P.js qui, lui, est chargé dans le <head> */

Code HTML déconseillé :

    <script>w3.includeHTML();</script>  déconseillé 
  </body>

L'appel de cette fonction, w3.includeHTML(), via l'inclusion d'une balise <script> dans du code HTML n'est pas recommandée (surtout, si on utilise Tidy pour améliorer la présentation de son code HTML).

Attention : On évitera de mettre du code JS, tel que des appels de fonctions dans le fichier à inclure. (Auquel cas, cette fonction devra être placée dans une callback function ?)

Une fois testé, le code HTML peut être compressé via
http://minifycode.com/html-minifier/

Exemple - tryw3js_html_include_2

Les fonctions ci-dessous intéresseront surtout les designers ...

Selectors

W3.JS agit sur les balises sélectionnées :

w3.action(selector)

Ci-dessus, action() est une fonction qui agit les balises sélectionnées
selector est un sélecteur CSS (une chaîne de caractères, spéciale).

Si l'action s'applique à la balise même, le mot-clé this peut être utilisé comme sélecteur

w3P.js utilise la syntaxe utilisée en CSS pour sélectionner, comme JQuery.
CSS Selectors Reference

w3.hide('p')  /* Hide all <p> elements */

Un sélecteur ne peut pas commencer par un chiffre. Plus d'info :

In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters [a-zA-Z0-9] and ISO 10646 characters U+00A0 and higher, plus the hyphen (-) and the underscore (_); they cannot start with a digit, two hyphens, or a hyphen followed by a digit. Identifiers can also contain escaped characters and any ISO 10646 character as a numeric code (see next item). For instance, the identifier "B&W?" may be written as "B\&W\?" or "B\26 W\3F". (Source)

w3.slideshow(selector, interval)

<img class="nature" src="img_snowtops.jpg">
<img class="nature" src="img_mountains.jpg">
<img class="nature" src="img_nature.jpg">

<script>w3.slideshow(".nature", 1000);</script>

Le premier paramètre est une string = la valeur est celle de l'attribut id de la balise visée, mise entre guillemets.

Le second paramètre est un nombre représentant des millisecondes.

To prevent the slideshow from starting automatically, set the interval parameter to 0.

When you initiate a slideshow, the w3.slideshow() function returns an object representing the slideshow :

var myShow = w3.slideshow(".nature", 0);

The slideshow object contain properties and methods, such as next() and previous() :



Exemple - tryw3js_slideshow

w3.hide() / w3.show() / w3.toggleShow()

Le paramètre peut être "#id" pour cacher/montrer une balise ayant un ID, "nom_balise" pour cacher/montrer toutes les balises ayant ce nom, ".nom_classe" pour cacher/montrer toutes les balises ayant dans son attribut class, ce nom_classe.

Sans JavaScript, via le couple de balises : details / summary.

Solution
  <details>
    <summary>Solution</summary>
    <div>
      <p>Voici la réponse : ...</p>
    </div>
  </details>

  Le code ci-dessus est minimaliste. Il peut être amélioré comme ceci :
  <summary style="cursor:pointer">

  Mieux, le fichier CSS accompagnant le fichier HTML devrait contenir :
  summary{cursor:pointer; text-decoration:underline}
  

  <button onclick="w3.show('#div1')">w3.show()</button>
  <button onclick="w3.hide('#div1')">w3.hide()</button>
  <button onclick="w3.toggleShow('#div1')">w3.toggleShow()</button>

w3.toggleShow(selector) égal, en jQuery, à $(selector).toggle()

Avec jQuery, on peut choisir le temps (en millisecondes)
De plus, avec jQuery, existent : .fadeIn(), .fadeOut(), .fadeToggle(), .fadeTo(), .slideDown(), .slideUp(), .slideToggle()

Documentation

Add Style

w3.addStyle(selector,'property','value')

  <button onclick="w3.addStyle('#London','background-color','red')">Add Style</button>

Un style ne peut être retiré, mais il sera "écrasé" par le dernier style donné. Pour un seul élément, identifié par son id, cette fonction est peu utile. Mais, le selector peut être une classe, ... (et viser plusieurs éléments)

Exemple - tryw3js_add_style_id

Add / Remove / Toggle Class

w3.addClass(selector,'class')
w3.addClass(selector,'class1 class2 class3')

w3.removeClass(selector,'class')
w3.removeClass(selector,'class1 class2 class3')

w3.toggleClass(selector,'class')
w3.toggleClass(selector,'class1 class2 class3')

  <button onclick="w3.toggleClass('#London','marked')">Toggle Class</button>

Exemple - tryw3js_ref_toggle_class


Liens