J'ouvre un topic pour recenser des scripts complet (assez court et facilement réutilisable), des fonctions home made et autres méthodes en JavaScript pour se faciliter la vie.
1 post par fonction/script/méthode s'il vous plait pour faire référence plus facilement et précisement aux dites fonctions grâce à l'ancre du topic.
Présenter vos codes de cette façon :
* Titre/nom de la fonction/méthode/script et courte description
// Votre code
// Commentez le dans la mesure de votre temps
* Eventuelle explication plus complète et détaillée
* Infos supplémentaires Modifié par Olivier (11 May 2005 - 19:04)
La FAQ répond aux questions fréquemment posées. Vérifiez qu'elle ne contient pas une réponse à votre problème.
* Méthode .getElementsByClassName pour récupérer un tableau (Array) des éléments de la page ayant la class qui convient
document.getElementsByClassName = function(className) {
var elts = document.getElementsByTagName('*');
var classArray = new Array();
for (var j = 0; j < elts.length; ++j) {
if (elts[j].getAttribute('class') && elts[j].getAttribute('class').split(' ').inArray(className)) { // méthode inArray faite à la main > Explication et code
classArray.push(elts[j]);
}
}
return classArray;
};
* Il faudra ne pas limiter la méthode à document je regarderais comment faire pour l'utiliser aussi simplement que .getElementById par exemple
* Ne fonctionne pas sous IE... ça devrait pouvoir se régler, à voir donc.
-> getAttribute('class') ne fonctionne pas sous IE, il faut utiliser getAttribute('className'), il faudrait donc doubler le test pour faire fonctionner la chose
* Fonctionne aussi pour les class multiples comme : class="class1 class2 class3" Modifié par Olivier (15 Sep 2005 - 14:04)
La FAQ répond aux questions fréquemment posées. Vérifiez qu'elle ne contient pas une réponse à votre problème.
if (type == 'id' && selector) {
if (document.getElementById(selector)) {
myTable = document.getElementById(selector);
rows = myTable.getElementsByTagName('tbody')[0].getElementsByTagName('tr');
evenOdd(rows);
}
} else {
if (type == 'class' && selector) {
myTable = document.getElementsByClassName(selector); // méthode getElementsByTagName faite à la main > Explication et code
} else {
myTable = document.getElementsByTagName('table');
}
for (var t = 0; t < myTable.length; ++t) {
rows = myTable[t].getElementsByTagName('tbody')[0].getElementsByTagName('tr');
evenOdd(rows);
}
}
}
* Pour l'utiliser, vous avez 3 possibilités comme pour les sélecteurs CSS
// Avec l'ensemble des tableaux de la page
zebraTable();
// Avec une class
zebraTable('class', 'nomDeLaClass');
// Avec un id
zebraTable('id', 'nomDeLId');
* Le style des lignes est à définir dans les styles CSS pour plus de simplicité. Modifié par Olivier (11 May 2005 - 23:44)
La FAQ répond aux questions fréquemment posées. Vérifiez qu'elle ne contient pas une réponse à votre problème.
* Class JavaScript pour faciliter l'utilisation d'XMLHttpRequest (par solo)
Voir explications sur le site (c'est assez précis et volumineux, inutile de le recopier ici) http://xhrconnection.sutekidane.net/ Modifié par Olivier (11 May 2005 - 18:44)
La FAQ répond aux questions fréquemment posées. Vérifiez qu'elle ne contient pas une réponse à votre problème.
* Class JavaScript permetant de créer des bulles d'aide personalisées
Cette classe permet de créer des bulles d'aides personalisées en utilisant le contenu des attributs alt ou title des balises qui doivent afficher des bulles d'aide. La bulle peut être stylée à l'aide de CSS et il est possible d'utiliser les expressions régulières pour baliser/styliser le text de la bulle d'aide !
/** INFOBULLE
* ----------
* Jeremie Patonnier <jep@ibilab.net>
* Version : 1.0
* ----------
* Objet JavaScript qui permet de créer des infobulles hautement personnalisées
* ----------
* Propriétés de l'objet :
*
* 1 - infoBulle::decY : integer : Defaut : 20
* Décalage de l'infobulle par rapport au pointeur de la souris
* sur l'axe des Y.
*
* 2 - infoBulle::decX : integer : Defaut : 0
* Décalage de l'infobulle par rapport au pointeur de la souris
* sur l'axe des X.
*
* 3 - infoBulle::width : integer : Defaut : 210
* Largeur de l'infobulle (en pixel). il est conseillé que cette
* valeur soit egale à la valeur du style CSS width de l'infobulle.
*
* 4 - infoBulle::enableAlt : Boolean : Defaut : false
* Indique si l'objet doit se baser sur le contenu de l'attribut
* alt pour générer le contenue de l'infobulle (true) ou bien
* uniquement sur la contenue de l'attribut title (false).
*
* 5 - infoBulle::enableDrag : Boolean : Defaut : true
* Indique si l'infobulle doit suivre la souris (true) ou rester
* à un emplacement fixe sur la page (false);
*
* ----------
* Méthodes de l'objet :
*
* 1 - infoBulle::setTo(OBJ, TEXTE):
* Méthode qui permet d'assigner l'infobulle à l'objet OBJ et de
* rajouter le texte TEXTE à la suite du texte de l'infobulle
* pour cet objet.
*
* 2 - infoBulle::registerPointer(URLIMG):
* Méthode permetant de rajouter un pointeur suivant la souris
* à l'infobulle. Ce pointeur est une image dont l'URL est URLIMG.
*
* 3 - infoBulle::registerFormat(REGEXP,FORMAT):
* Méthode permettant de spécifié des règles de formatage du texte.
*
* La portion de texte à formater est identifié grace à un objet
* REGEXP, la règle de formatage est la chaine de caratère FORMAT.
*
* ----------
* Styliser l'infobulle :
* Le texte de l'infobulle est à l'interieur d'une balise DIV identifié par #insideBulle
* qui est elle même contenue dans une balise DIV identifié par #infoBulle
* ----------
* Exemple d'utilisation :
*
* <img src="test.jpg" id="test" alt="Photo test : Voici une infobulle personnalisé" />
*
* <script type="text/javascript">
* bulle = new infoBulle();
* bulle.enableAlt = true;
* bulle.setTo(document.getElementById("test"));
* bulle.registerFormat(/^(.*:)/,"<strong>$1</strong>");
* </script>
*
* <style type="text/css">
* #infoBulle{
* background:#FCC;
* border:1px solid #999;
* }
* #insideBulle{
* margin:10px;
* font:0.8em Arial,Helvetica,sans-serif;
* }
* </style>
*/
* Fonction JavaScript qui permet d'ouvrir une Pop-up ou une nouvelle fenètre avec l'accord de l'utilisateur en option.
/** NEWINDOW
* ---------
* Jeremie Patonnier <jep@ibilab.net>
* Version : 2.0
* ---------
* Fonction JavaScript qui permet d'ouvrir une Pop-up ou une nouvelle fenètre
* avec l'accord de l'utilisateur en option.
* ---------
* Paramètres de fonction :
*
* 1 - URL : L'objet représentant le lien contenant l'url à ouvrir dans la nouvelle fenètre
* : ou le lien à ouvrir dans un pop-up
*
* 2 - CONFIRMATION : (optionel) un booleen qui spécifie si l'utisateur
* doit confirmer l'ouverture dans un pop-up ou une fenètre.
* Par defaut, aucune confirmation n'est demandé (false).
*
* 3 - MESSAGE : (optionel) le message à afficher lors de la demande de confirmation.
*
* 4 - NOM : (optionel) Le nom de la pop-up ou fenètre à ouvrir.
*
* 5 - FEATURE : (optionel) Les options de configuration des pop-up
* ---------
* Exemple d'utilisation :
*
* Simulation de l'attribut target="_blank" en XHTML 1.0 stric
* <a href="http://www.ibilab.net/" onclick="return neWindow(this)">
*
*/
function neWindow(url,confirmation,message,nom,feature){
if(message == undefined || message == '') message = 'Voulez vous ouvrir ce lien dans une nouvelle fenètre ?';
Le principe est pas trop complexe, il est commenté.
En gros, ça permet de comparer strictement deux tableaux, comme le montre la page d'exemple (note: dans la page d'exemple, la fonction s'appelle autrement)... Modifié par Lisarael (21 May 2005 - 14:30)
<xml:addict>
<lisaraël aka="Le dragon qui fait grrrr..." memberof="CCC" />
</xml:addict>
Méthode getElementsByClassName accessible à tous les éléments de la page meme document et fonctionne sous IE et FF et les derniers navigateurs
il manquait une fonction qui permet de récupérer tous les éléments qui ont une class pour tout le document ou pour un élément particulier qui veut connaitre tous ses sous-éléments qui utilisent une classe particulière.
function getElementsByClassNameforAllElements(className){
var AllElements = document.getElementsByTagName('*'); //On récupère tous les éléments de la page web
for (var ii = 0; ii < AllElements.length; ++ii) { //On les scanne tous un par un
AllElements .getElementsByClassName = function(className) { //Pour chaque élément on rajoute la fonction getElementsByClassName
var MyClassArray = getElementsByClassName(className, this);
return MyClassArray;
}
}
//Tous les éléments on été traités sauf l'objet document, donc on lui rajoute aussi la méthode
document.getElementsByClassName = function(className){
var MyClassArray = getElementsByClassName(className, this);
return MyClassArray;
}
}
function getElementsByClassName (className, theElement){
var elts = theElement.getElementsByTagName('*');
var classArray = new Array();
for (var j = 0; j < elts.length; ++j) {
if (elts[j].className.indexOf(className) != -1) {
classArray.push(elts[j]);
}
}
return classArray;
}
il suffit juste d'appeler la fonction getElementsByClassNameforAllElements lors du charchement de la page
dans cet exemple on utilise window.onload, mais celui-ci peut être écrasé par un autre JS si vous refaites un window.onload après.
maintenant tous les éléments possèdent la fonction getElementbyClassName
il suffit de tester avec cette fonction :
function Prout(element){
if (element != document) var monmenu = document.getElementById(element);
else monmenu=document;
var mesprout = monmenu.getElementsByClassName('prout');
for (var j = 0; j < mesprout.length; ++j) {
alert(mesprout[j].id);
}
}
<br>
<a href="#" id="lien4" class="prout">lien 4 en dehors de #menu</a><br>
<input type="button" onclick="Prout('menu')" value="que les prout du menu"><br>
<input type="button" onclick="Prout(document)" value="tous les prouts de la page">
normalement vous devriez avoir 3 alert box avec successivement lien1, lispecial et lien 3 si vous cliquez sur le prout du menu
mais si vous cliquez sur l'autre bouton, vous aurez 4 élément car lien4 est en dehors du menu Modifié par Felipe (04 Nov 2005 - 20:54)
Fonction qui permet de cacher ou afficher les sous menus d'un menu sous réserve que celui ci soit fait à base de UL LI A
voici le code JS
function DynamMenu(IdMenu){
if(!document.getElementsByTagName) //On teste si on a le droit de faire mumuse avec le DOM sur les TAGNAME
return;
var Menu = document.getElementById(IdMenu); //On récupère le menu
var li = Menu.getElementsByTagName('LI'); //On récupère tous les LI du menu
for(var ii=0; ii<li.length-1; ++ii) { //On scanne tous les LI
var sousUL = li .getElementsByTagName('UL'); //Pour chaque LI on recupère le UL dessous
if (sousUL[0]) { //On vérifié qu'il y a un UL dans le LI
sousUL[0].id = IdMenu + ii; //On met un ID à ce UL
sousUL[0].style.display = "none";
li .getElementsByTagName('A')[0].href= "javascript:ShowHideMenu('" + IdMenu + ii + "')";
}
}
}
window.onload = init;
function ShowHideMenu(MenuId){
var SousMenu = document.getElementById(MenuId);
if (SousMenu.style.display=='block' || SousMenu.style.display == null) {
SousMenu.style.display = 'none'; //ON cache le sous menu
}
else{
SousMenu.style.display = 'block'; //On affiche le sous menu
}
}
function init(){
DynamMenu("menu");
}
et voici le code HTML Pour tester
<ul id="menu">
<li><a href="#">lien</a></li>
<li><a href="#">lien</a></li>
<li><a href="#">lien</a></li>
<li><a href="#">Truc a cliquer pour etendre</a>
<ul id="test">
<li><a href="#">lien</a></li>
<li><a href="#">infos 12</a>
<ul>
<li><a href="#">lien</a></li>
<li><a href="#">encore un sous menu</a>
<ul>
<li><a href="#">lien</a></li>
<li><a href="#">lien</a></li>
<li><a href="#">encore un sous menu</a>
<ul>
<li><a href="#">lien</a></li>
<li><a href="#">lien</a></li>
<li><a href="#">encore un sous menu</a>
<ul>
<li><a href="#">lien</a></li>
<li><a href="#">lien</a></li>
<li><a href="#">lien</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="#">lien</a></li>
</ul>
</li>
<li><a href="#">lien</a></li>
</ul>
Vous faites des calculs finnanciers ?
Moi on me l'avait demandé, si ça peut vous aider ...
une fonction de séparation des milliers :
// Cette fonction insert un éspace tout les 3 chiffre, le soucis?
// => la réutilisation du chiffre en question après le formatage
// a utiliser avec une certaine vigilence et de préférence en dernier
// pour la simple mise en forme
function millier (chaine) {
var seconde = "";
var x=0;
var y=x+3;
var z=0;
var modulo = (chaine.length)%3;
if (modulo>=0){
seconde = seconde + ((chaine.slice(x,modulo))+" ");
x=x+modulo;
y=y+modulo;
}
z=(chaine.length-modulo)/3;
while (z>0){
seconde =seconde + ((chaine.slice(x,y))+" ");
x=x+3;
y=x+3;
z=z-1;
}
Bonjour, étant nouveau ici, j'espère avoir le droit de poster dans ce topic.
J'en ai plein en stock si vos voulez, il n'y a qu'à demander !
* getElementByAttribute
* Le nom de cette fonction est assez explicite non ?
* J'inclus ma doc avec le code (en commentaire avant le début de la fonction)
Code :
/*
document.getElementsByAttribute permet d'obtenir un tableau d'éléments DHTML, en fonction de leurs attributs.
@param String attribute Nom de l'attribut à rechercher
@param String value Facultatif : Valeur de l'attribut
Si la valeur de l'attribut n'est pas spécifiée, tous les éléments DHTML possédant l'attribut seront retournés.
Si la valeur est spécifiée, tous les éléments DHTML dont l'attribut demandé contient la valeur indiquée seront retournés.
@return ARray Un tableau contenant tous les objets DHTML trouvés est retourné.
@Note
Le navigateur doit supporter la fonction document.getElementsByTagName.
Fonction écrite par QuentinC.
*/
document.getElementsByAttribute = function (attribute, value) {
var objs = new Array();
objs = document.getElementsByTagName("*");
var tab = new Array();
for (var ii in objs) {
if (objs ) {
if (objs ) {
if (!value) tab[tab.length] = objs ;
else if (objs .toLowerCase() == value.toLowerCase()) tab[tab.length] = objs ;
}
}
}
return tab;
}
Si vous en voulez d'autres, no problem. Modifié par Felipe (04 Nov 2005 - 20:57)
Pour ma part voici le début d'une petite classe graphique dont la seule et unique fonction pour le moment permet d'atteindre progressivement une opacité sur un objet.
* Graph.setOpacity
/**
* Classe de gestion graphique
*
* @author : Marc Plessis
* @version : 0.1
* @date : 18/08/2005
*
*/
function Graph() {
this.constructor.apply(this,arguments);
}
//============================== Variables ===================================
var opa=0; //Pour gérer l'opacité de l'objet
var oOpacite=0; //Pour avoir l'opacité à atteindre
var oPas=0; //Pas pour atteindre l'opacité
var oObjet=false; //Objet à modifier
Graph.prototype._oObj=false; //Pour gérer l'objet à faire jouer
var tTimer=false; //Permet de gérer le timer de relance
/**
* Constructeur de la classe
*/
Graph.prototype.constructor=function(pObj,opacity) {
//On initialise l'objet à faire jouer en variable
if(pObj!=undefined) {
this._oObj=document.getElementById(pObj)
if (navigator.appName.indexOf("Explorer") > -1) {
//Il s'agit de IE
this._oObj.style.filter="Alpha(opacity="+(opacity*100)+")";
}else{
//Tentative de modification de la propriété opacity
this._oObj.style.opacity=parseFloat(opacity);
}
//On indique le niveau d'opacité
opa=opacity;
}
};
/**
* Méthode permettant de modifier l'opacité
* @param int Opacity : opacité à atteindre
* @param int Vitesse : Vitesse pour atteindre cette opacité en millisecondes
* @param int nPas : Pas de modification de l'opacité
* @param string oObj : Objet à modifier
*/
Graph.prototype.setOpacity=function(opacity,vitesse,nPas,oObj) {
//On initialise les variables publique pour la fonction privée
oOpacite=opacity;
oPas=nPas;
oObjet=oObj;
//On appel la fonction suivant l'intervalle de temps demandée
tTimer=setInterval(this._modOpacity,vitesse);
};
/**
* Méthode permettant de modifier l'opacité (appel depuis la méthode publique)
*/
Graph.prototype._modOpacity=function() {
//On met le pas d'avance à zéro
var nPas_mod=0;
//On va modifier l'opacité de l'objet
if (opa>oOpacite) {
nPas_mod = parseFloat(oPas) * -1;
}else {
nPas_mod=parseFloat(oPas);
}
if (navigator.appName.indexOf("Explorer") > -1) {
//Il s'agit d'IE
document.getElementById(oObjet).style.filter="Alpha(opacity="+((parseFloat(opa) + nPas_mod)*100)+")";
}else{
//Tentative de modification du niveau d'opacité
document.getElementById(oObjet).style.opacity=parseFloat(opa) + nPas_mod;
}
//On indique l'opacité en cours
opa=parseFloat(opa) + nPas_mod;
if (nPas_mod<0) {
if (opa<=oOpacite) {
//On détruit l'objet car c'est la fin de la fonction
clearInterval(tTimer);
}
}else {
if (opa>=oOpacite) {
//On détruit l'objet car c'est la fin de la fonction
clearInterval(tTimer);
}
}
};
Et voici un exemple d'utilisation :
/**
* Module permettant de gérer les événements sur les pages HTML
*
* @author : Marc Plessis
* @version : 0.1
* @date : 10/08/2005
*
*/
//============================== Constantes ===============================
GRAPH_PASOPACITY=0.05; //Pas d'ouverture de l'accueil
GRAPH_VITOPACITY=75; //Vitesse d'ouverture de l'accueil
OBJ_ACCUEIL="c_centre_ind" //Objet à ouvrir
/**
* Méthode lancée au chargement de la page
*/
onLoad = function()
{
//On initialise la classe d'opacite
var oObjOpa = new Graph(OBJ_ACCUEIL,0);
//On demande une opacite plus élevée
oObjOpa.setOpacity(0.95,GRAPH_VITOPACITY,GRAPH_PASOPACITY,OBJ_ACCUEIL);
}
//On éxecute la fonction onLoad au lancement de la page
window.onload = onLoad;
Cette fonction ne tourne pas sur Opéra qui refuse de gérer l'opacité (pas testé sur les dernieres versions du navigateur, peut-être que cela a changé).
function getDOMName(DOMObject) //DOMObject(type : objet DOM)
{
var tmp = new String();
for (var i in DOMObject.parentNode.childNodes)
{
if(DOMObject.parentNode.childNodes[ i ] == DOMObject)
tmp = i;
}
return tmp
}
* Fonction dont le parramètre est un objet DOM et qui retourne sont nom dans l'architecture DOM en string
* getDOMPath retourne en string le chemin d'un objet DOM
function getDOMPath(DOMObject) //DOMObject(type : objet DOM)
{
var tmp = new String();
var tmpObj = DOMObject;
while(tmpObj.parentNode != null)
{
tmp = '.childNodes[' + getDOMName(tmpObj) + ']' + tmp;
tmpObj = tmpObj.parentNode;
}
return 'document' + tmp
}
Fonction dont le paramètre est un objet DOM et qui retourne sont chemin en String Modifié par heyman85 (17 Mar 2006 - 20:40)
Un script pour effectuer une transformation xslt côté client:
function transform(xml, xsl, id)
{
try {
// navigateur basé sur Gecko
if (window.XSLTProcessor)
{
var fragment;
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
fragment = xsltProcessor.transformToFragment(xml, document);
var target = document.getElementById(id);
target.appendChild(fragment);
document.appendChild(target);
// ActiveX pour Internet Explorer
} else if (window.ActiveXObject) {
var target = document.getElementById(id);
target.innerHTML = xml.transformNode(xsl);
}
} catch (e) {
return e;
}
}
xml et xsl sont des objets XML...Voici un exemple de chargement de fichiers XML:
function loadXML(url)
{
var xmlDoc;
/* chargement du fichier XML */
try {
// navigateur basé sur Gecko
if (document.implementation && document.implementation.createDocument)
{
xmlDoc = document.implementation.createDocument('', '', null);
xmlDoc.load(url);
// ActiveX pour Internet Explorer
} else if (window.ActiveXObject) {
try {
xmlDoc = new ActiveXObject('Msxml2.XMLDOM');
} catch (e) {
xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
}
xmlDoc.async = false;
xmlDoc.load(url);
// à l'aide de lobjet XMLHTTPRequest
} else if (window.XMLHttpRequest) {
xmlDoc = new XMLHttpRequest();
xmlDoc.overrideMimeType('text/xml');
xmlDoc.open('GET', url, false);
xmlDoc.send(null);
if (this.xmlDoc.readyState == 4) xmlDoc = xmlDoc.responseXML;
}
} catch (e) {
return e;
}
return xmlDoc;
}
Utiliser les HTMLElement s avec n'importe quel navigateur (enfin pour Firefox, Opera, IE 6 & 7b2 testé)
L'implémentation de méthode sur ces classes permet de ne pas à avoir à faire une boucle sur tous les éléments du documents et d'ajouter à chaque élements la fonction et les problèmes que cela pose (perfomance, créations de nouveaux éléments en live ...).