Articles taggés avec 'développement'
Pour produire vraiment captivant TabStrip il ya une technique qui permet particulièrement adapté pour servir de médiateur entre les problèmes graphiques et le code Javascript. Laissez-nous tout d'abord comment construire un modèle dans Photoshop pour nos TabStrip:

Construit une bande onglet similaire à celui montré dans la figure ci-dessus, nous utilisons l'outil de sélection de la zone de coupe pour générer la forme que va avoir notre table HTML. L'utilisation de la table, dans ce cas, est particulièrement souligné - comme nous allons le voir, car elle simplifie la conception et du code JavaScript. Nous avons réduit nos TabStrip donc comme suit:

Dans notre fichier Photoshop nous devons considérer toutes les combinaisons des onglets (tab). Nous avons ensuite sélectionné la carte initiale (coupé 3), les points intermédiaires (coupe et découpe 5 7) et la dernière carte n'est pas sélectionné (coupe 9) avec - le cas échéant - la finition des bords (coupe 10 - en option selon le modèle). Ensuite seulement 3 combinaisons pour résoudre tous les cas visuelle. Comme indiqué ci-dessous:

Graphiquement parlant, vous pouvez arranger les cartes dans le chevauchement et décalés, comme indiqué ci-dessous:

Une affaire de goût et les besoins ... retour à l'image complète avec les trois bandes d'TabStrip combinaisons, les deux derniers sont utilisés pour résoudre les cas limites, les couper comme indiqué ci-dessous:

La coupe 17 et 23 résoudre les deux cas de pointe: le premier onglet n'est pas sélectionné, sélectionné en dernier. La coupe 19 est à l'opposé de coupe 5 et 7 de la coupe, vous avez vu précédemment. L'image complète que nous obtenons et nous pouvons sauver des modifications de conception à venir est la suivante:

Afin de ne pas nous confondre, lorsque nous arrivons à la partie du Javascript, le nom de la coupe est comme suit:
- coupé 3 = tabLeftFirstOn
- 4 = coupé tabStripeOn
- Couper 5 = tabMiddleOnOff
- Couper 6 = tabStripeOff
- 7 = cisaillement tabMiddleOffOff
- Couper 9 = tabRightLastOff
- 10 topBg = coupe
- 17 tabLeftFirstOff = coupe
- 19 tabMiddleOffOn = coupe
- 23 = coupe tabRightLastOn
Pour ce faire nous avons besoin maintenant d'un code HTML, le code CSS et le code Javascript comme un gestionnaire clics sur l'onglet cartes. Le code HTML est trivial, mais articulés. Je propose donc une classe PHP qui peut générer à chaque fois que nous avons besoin. En substance, il s'agit de créer un tableau HTML enfermé dans une DIV avec ID certains détails que nous avons besoin, puis pour l'exécution de code Javascript et joindre la conception en utilisant le CSS. Le code HTML généré - juste pour avoir une idée - une TabStrip avec quatre cartes est comme suit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| "cscoTabStrip" > < div id = "cscoTabStrip"> "jscoTabStrip_info" > < div id = "jscoTabStrip_info"> "100%" cellspacing = "0" cellpadding = "0" border = "0" > < Table width = "100%" cellspacing = "0" cellpadding = "0" border = "0"> < tr > = "tabLeftFirstOn" >< / div >< / td > < td > < div class = "tabLeftFirstOn"> </ div > </ td > "" class = "tabStripeOn" >< a id = "jscoTS_tab1" onclick = "_onTabStrip( this );" class = "tabsLink" title = "Caratteristiche" > Caratteristiche < / a >< / td > < td nowrap = "" class = "tabStripeOn"> < une id = "jscoTS_tab1" onclick = "_onTabStrip (this);" class = "tabsLink" title = "Caractéristiques"> Caractéristiques </ une > </ td > = "tabMiddleOnOff" >< / div >< / td > < td > < div class = "tabMiddleOnOff"> </ div > </ td > "" class = "tabStripeOff" >< a id = "jscoTS_tab2" onclick = "_onTabStrip( this );" class = "tabsLink" title = "Come funziona" > Come funziona < / a >< / td > < td nowrap = "" class = "tabStripeOff"> < une id = "jscoTS_tab2" onclick = "_onTabStrip (this);" class = "tabsLink" title = "Comment ça marche»> Comment ça marche </ une > </ td > = "tabMiddleOffOff" >< / div >< / td > < td > < div class = "tabMiddleOffOff"> </ div > </ td > "" class = "tabStripeOff" >< a id = "jscoTS_tab3" onclick = "_onTabStrip( this );" class = "tabsLink" title = "Interfaccia" > Interfaccia < / a >< / td > < td nowrap = "" class = "tabStripeOff"> < une id = "jscoTS_tab3" onclick = "_onTabStrip (this);" class = "tabsLink" title = "Interface"> Interface </ une > </ td > = "tabMiddleOffOff" >< / div >< / td > < td > < div class = "tabMiddleOffOff"> </ div > </ td > "" class = "tabStripeOff" >< a id = "jscoTS_tab4" onclick = "_onTabStrip( this );" class = "tabsLink" title = "Richiesta Iscrizione" > Richiesta Iscrizione < / a >< / td > < td nowrap = "" class = "tabStripeOff"> < une id = "jscoTS_tab4" onclick = "_onTabStrip (this);" class = "tabsLink" title = "Demande d'inscription"> Demande d'inscription </ une > </ td > = "tabRightLastOff" >< / div >< / td > < td > < div class = "tabRightLastOff"> </ div > </ td > "100%" class = "topBG" >< / td > < td width = "100%" class = "topBG"> </ td > </ tr > </ table de > </ div > "jscoTSC_jscoTS_tab1" class = "tabStripContent" > < div id = "jscoTSC_jscoTS_tab1" class = "tabStripContent"> p > < p > onglet 1 contenu </ p > </ div > "jscoTSC_jscoTS_tab2" class = "tabStripContentHidden" > < div id = "jscoTSC_jscoTS_tab2" class = "tabStripContentHidden"> p > < p > Tableau de données 2 contenu </ p > </ div > "jscoTSC_jscoTS_tab3" class = "tabStripContentHidden" > < div id = "jscoTSC_jscoTS_tab3" class = "tabStripContentHidden"> p > < p > onglet 3 du contenu </ p > </ div > "jscoTSC_jscoTS_tab4" class = "tabStripContentHidden" > < div id = "jscoTSC_jscoTS_tab4" class = "tabStripContentHidden"> p > < p > onglet Contenu FICHE 4 </ p > </ div > </ div > |
Le code PHP qui génère le code HTML est comme suit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
| / / ************************************************ *********** / / / / Fichier: tabstrip.php / / Auteur: Giovambattista Fazioli (www.undolog.com) / / Web: http://www.undolog.com / / E-mail: info (at) undolog (dot) (COM) / / Création: 03/10/2005 10h07 / / Mise à jour: 11/06/2005 07:17 / / / / Propriétés / / Nom - (string) - Nom (ID) Fenêtre / / Style - (string) - Ligne Style Ajouter / / Tabs - (ARRAY) - Liste des onglets (tab) / / / / Méthodes / / AddTab () - Ajoute un onglet à l'TabStrip / / ToString () - Retourne la sortie HTML pour la fenêtre / / Afficher () - Affiche la sortie HTML pour la fenêtre / / / / NOTES / / / / Exemples / / / / ************************************************ *********** {Classe CSCO_UI_TABSTRIP Propriétés / / # publique ; var $ nom; ; var $ style; ; var $ onglets; ; var $ jsListener; / / # Les propriétés privées ; var $ strHeader; ; var $ strBody; / / ================================================ ===== / / Constructeur: / / ================================================ ===== $name , $jsListener = "" ) { Fonction CSCO_UI_TABSTRIP ($ nom, $ jsListener = "") { name = $name ; $ This -> nom = $ nom; jsListener = $jsListener ; $ This -> = $ jsListener jsListener; tabs = array ( ) ; $ This -> onglets = array (); } / / ================================================ ===== / / Méthode: addTab () / / / / DESCRIPTION / / Ajoute un onglet à l'TabStrip. / / / / Exemples / / / / ================================================ ===== $name , $label , $tooltip , $content , $selected = false ) { Fonction addTab ($ nom, $ label, $ info-bulle, $ contenu, $ selected = false) { array ( "name" => $name , $ Tab = array ("nom" => $ nom, $label , "Label" => $ label, $tooltip , "Infobulles" => $ info-bulles, $content , "Contenu" => $ contenu, $selected ) ; "Sélection" => $ sélectionnés); tabs [ ] = $tab ; $ This -> onglets [] = $ tab; } / / ================================================ ===== / / Méthode: toString () / / / / DESCRIPTION / / Retourne la sortie HTML pour le TabStrip. / / / / Exemples / / / / ================================================ ===== function toString () { / / strHeader = '<div id="cscoTabStrip" ' . $ This -> strHeader = '<div id = "cscoTabStrip". -> style != "" ) ? 'style="' . $this -> style . '"' : '' ) . '>' . (($ This - style> = ""?) 'Style =' "$ this -.. Style>'"':''). '>'. '<Div'. $this -> name . '">' . "ID =" jscoTabStrip_ '$ this -. Name>'">'.. "<table Border="0" width="100%" style="border-collapse: collapse;" cellspacing="0" cellpadding="0">». '<tr>'; "" ; $ StrBody = ""; / / FirstLeft ( $this -> tabs [ 0 ] [ "selected" ] ) ? "tabLeftFirstOn" : "tabLeftFirstOff" ; ClassLeft $ = ($ this -> onglets [0] ['sélectionnés']) "TabLeftFirstOn":? "TabLeftFirstOff"; strHeader .= '<td><div class="' . $classLeft . '"></div></td>' ; $ This -> strHeader .= '<div class = <td> "' $ classLeft.."> </ Div> </ td> '; $i = 0 ; $i < sizeof ( $this -> tabs ) ; $i ++ ) { for ($ i = 0; $ i < sizeof ($ this -> onglets); $ i + +) { / / ( $this -> tabs [ $i ] [ "selected" ] ) ? "tabStripeOn" : "tabStripeOff" ; ClassBck $ = ($ this -> onglets [$ i] ['sélectionnés']) "TabStripeOn":? "TabStripeOff"; / / $i == ( sizeof ( $this -> tabs ) - 1 ) ) { if ($ i == ( sizeof ($ this -> onglets) - 1)) { ( $this -> tabs [ $i ] [ "selected" ] ) ? "tabRightLastOn" : "tabRightLastOff" ; ClassMiddle $ = ($ this -> onglets [$ i] ['sélectionnés']) "TabRightLastOn":? "TabRightLastOff"; { Else {} $this -> tabs [ $i ] [ "selected" ] ) { if ($ this -> onglets [$ i] ['sélectionnés']) { "tabMiddleOnOff" ; $ ClassMiddle = "tabMiddleOnOff"; { Else {} ( $this -> tabs [ $i + 1 ] [ "selected" ] ) ? "tabMiddleOffOn" : "tabMiddleOffOff" ; ClassMiddle $ = ($ this -> onglets [$ i + 1] ['sélectionnés']) "TabMiddleOffOn":? "TabMiddleOffOff"; } } / / / / strHeader .= '<td nowrap="nowrap" class="' . $classBck . '">' . $ This -> strHeader .= "<td nowrap="nowrap" class="'. $classBck.'">». $this -> tabs [ $i ] [ "tooltip" ] . '" class="tabsLink" onclick="_onTabStrip( this ' . ( ( $this -> jsListener != "" ) ? ( ",'" . $this -> jsListener . "'" ) : "" ) . ' );" id="jscoTS_' . $this -> tabs [ $i ] [ "name" ] . '">' . $this -> tabs [ $i ] [ "label" ] . '</a>' . '<a Title="'. $this -> onglets [$ i] ["tooltip"]. "" Class = "tabsLink" onclick = "_onTabStrip (cette' (($ this -.! JsListener> =" ") ? ("$ this. - jsListener>" '.''"):" ").')" id = "jscoTS_ '$ this -.> onglets [$ i] [' nom'].'"> '$ this -.> onglets [$ i] [' label '].' </ a> '. '</ Td>'. $classMiddle . '"></div></td>' ; «<td> <div Class="'. $classMiddle.'"> </ div> </ td> '; / / ( $this -> tabs [ $i ] [ "selected" ] ) ? "tabStripContent" : "tabStripContentHidden" ; $ Classe = ($ this -> onglets [$ i] ['sélectionnés']) "TabStripContent":? "TabStripContentHidden"; '<div class="' . $class . '" id="jscoTSC_jscoTS_' . $this -> tabs [ $i ] [ "name" ] . '">' . $this -> tabs [ $i ] [ "content" ] . '</div>' ; $ StrBody .= '<div class="'. $class.'" Id="jscoTSC_jscoTS_'. $this -> onglets [$ i] [' nom '].' "> '$ This -.> Onglets [$ i] ["content"] '</ div>'.; / / } / / Foo Aligner strHeader .= '<td class="topBG" width="100%"></td>' . $ This -> strHeader .= "<td class="topBG" width="100%"> </ td> '. '</ Tr> </ table> "; strBody = '<div>' . $strBody . '</div>' ; $ This -> strBody = '<div' $ strBody.. '</ Div>'; / / $this -> strHeader . $this -> strBody . '</div></div>' ) ; retour ($ this - strHeader> $ this -> strBody '</ div> </ div>'..); } / / ================================================ ===== / / Méthode: show () / / / / DESCRIPTION / / Affichage de la sortie HTML pour le TabStrip. / / / / Exemples / / / / ================================================ ===== montrent function () { $this -> toString ( ) ) ; echo ($ this -> toString ()); } } / / FIN DE FICHIER SCO_UI_TABSTRIP.PHP |
Pour utiliser la classe simplement cet extrait:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| / / Fichier avec la définition de la classe ; exigent "tabstrip.php";
/ / Création d'objets TabStrip new CSCO_UI_TABSTRIP ( "info" ) ; $ T = new CSCO_UI_TABSTRIP ("info");
/ / Création / lecture de fichier - le contenu des onglets "Contenuto 1" ; $ S1 = "Contenu 1"; "Contenuto 2" ; $ S2 = "Contenu 2"; "Contenuto 3" ; $ S3 = "Content 3"; "Contenuto 4" ; $ S4 = "Content 4";
/ / Ajouter les cartes addTab ( "tab1" , "Caratteristiche" , "Caratteristiche" , $s1 , true ) ; $ T -> addTab («tab1», «Fonctions», «Fonctions», $ s1, true); addTab ( "tab2" , "Come funziona" , "Come funziona" , $s2 ) ; $ T -> addTab («tab2», «Comment ça marche", "Comment ça marche", $ s2); addTab ( "tab3" , "Interfaccia" , "Interfaccia" , $s3 ) ; $ T -> addTab ("TAB3", "Interface", "Interface", $ s3); addTab ( "tab4" , "Richiesta Iscrizione" , "Richiesta Iscrizione" , $s4 ) ; $ T -> addTab ("tab4", "Demande d'inscription", "Demande d'inscription", $ s4);
/ / Afficher tout - aussi utiliser la méthode toString () show ( ) ; $ T -> show (); |
Laissez-nous définir les styles:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| font-size : 13px } div # cscoTabStrip {font-size: 13px}
a.tabsLink , div # cscoTabStrip. tabStripeOff a.tabsLink, a .tabsLink :link , .. div # cscoTabStrip tabStripeOff d'tabsLink: lien a .tabsLink :hover { color : #f70 } div # cscoTabStrip tabStripeOff d'tabsLink:.. hover {color: # F70}
a.tabsLink , div # cscoTabStrip. tabStripeOn a.tabsLink, a .tabsLink :link , .. div # cscoTabStrip tabStripeOn d'tabsLink: lien a .tabsLink :hover { } div # cscoTabStrip tabStripeOn d'tabsLink:.. hover {}
{ background : url ( tabstrip/tabStripeOff.png ) repeat-x ; } div # cscoTabStrip tabStripeOff {background: url (barre d'onglets / tabStripeOff.png) repeat-x;}. { background : url ( tabstrip/tabStripeOn.png ) repeat-x ; } div # cscoTabStrip tabStripeOn {background: url (barre d'onglets / tabStripeOn.png) repeat-x;}.
{ text-align : right ; background : url ( tabstrip/topBg.png ) repeat-x ; } div # cscoTabStrip topBG. {text-align: right; background: url (barre d'onglets / topBg.png) repeat-x;}
{ width : 100% ; padding : 0 ; } div # cscoTabStrip tabStripContent. {width: 100%; padding: 0;} { display : none ; } div # cscoTabStrip tabStripContentHidden. {display: none;} |
Le code JavaScript est très fade, écrite à un moment où loin prototype.js n'existe pas. Toujours dans l'exemple ci-dessous je utiliser une bibliothèque d'effets (même pas Scriptaculous ) toujours valable, alors la ligne qui utilise la transition, vous pouvez changer l'opacité à ce que vous voulez:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| t ) { Fonction _onTabStrip (t) { arguments. length > 1 ) { if (longueur arguments.> 1) { "onBeforeClick" ; var evt = "onBeforeClick"; t. id . substr ( 7 ) ; . var t = n id substr (7); "var res = " + arguments [ 1 ] + "('" + n + "','" + evt + "');" ; et var = "res var =" + arguments [1] + "(" "+ n + "','" + evt + "');"; e ) ; eval (s); ! res ) return ( false ) ; if (res) return (false); } t. parentNode . parentNode ; var tr = t. parentNode parentNode.; var i = 1 ; i < tr. childNodes . length - 2 ; i ++ ) { for (var i = 1, i <tr childNodes longueur - 2;.. i + +) { tr. childNodes [ i ] ; var td = tr childNodes [i].; td. childNodes [ 0 ] ; var el = td childNodes [0].; / / el. tagName ) { switch (el tagName) { : cas "DIV" "tabMiddleOffOff" ; et className = "tabMiddleOffOff".; break; : le cas «A»: "tabStripeOff" ; . td className = "tabStripeOff"; break; } } t. parentNode ; var td = t. parentNode; [ 0 ] . className = "tabMiddleOffOn" ; .. td previousSibling childNodes [0] className = "tabMiddleOffOn".; [ 0 ] . className = "tabMiddleOnOff" ; .. td nextSibling childNodes [0] className = "tabMiddleOnOff".; Number ( ( tr. childNodes . length - 2 ) ) ; var = Nombre dernière ((tr. childNodes longueur - 2).); = "tabStripeOn" ; . t. parentNode className = "tabStripeOn"; $G ( "jscoTSC_" + t. id ) ; var = mc $ G ("jscoTSC_" t + id); mc. parentNode ; var d = mc parentNode.; var i = 0 ; i < d. childNodes . length ; i ++ ) { for (var i = 0; i <d. childNodes longueur;. i + +) { i ] . className = "tabStripContentHidden" ; d. childNodes [i] className = "tabStripContentHidden".; } "tabStripContent" ; . mc className = "tabStripContent"; new OpacityTween ( mc , Tween. regularEaseOut , 0 , 100 , 1 ) ; var = new OpacityTween (mc Tween regularEaseOut, 0, 100, 1.); t ; to. args = arguments ; à t = t;. au args = arguments.; function ( ) { d'. onMotionFinished fonction = () { this . args . length > 1 ) { if (args this.. longueur> 1) { "onAfterClick" ; var evt = "onAfterClick"; this . t . id . substr ( 7 ) ; .. var n = id ce t. substr (7); "var res = " + this . args [ 1 ] + "('" + n + "','" + evt + "');" ; et var = "res var =" + args présent. [1] + "(" "+ n + "','" + evt + "');"; e ) ; eval (s); } }; ; pour commencer ().; } |
Dans la pratique, les lignes 36 à 46 peuvent être remplacés par tout ce que vous voulez, même un affichage = "none". Le code est obsolète, du moins par rapport aux nouvelles techniques du JavaScript non intrusif (on dirait aujourd'hui l'écrire différemment). Mais la partie qui reste intéressant et pertinent et la configuration de la table HTML qui gère la bande. Elle permet un haut niveau de performances graphiques, contrairement à certaines autres méthodes qui - essentiellement - Onglet face les cartes comme un DIV simples côte à côte.
Une façon encore meilleure serait d'utiliser le z-index (ordre d'empilement) présents dans les styles CSS, afin de gérer la superposition de graphiques. Malheureusement, à ce jour, est une technique très difficile à appliquer en raison des différences entre les navigateurs qui le rendent instable, en fait, sauf dans de rares circonstances.
Bientôt je vais faire une version plus moderne ... si vous avez des doutes ou des questions ici!
Suite ...
Après la fixation du Undolog graphiques et ont fait la touche finale à quelques titres (voir encadré), j'ai apprécié le couple à utiliser prototype.js et Scriptaculous , dans un non-intrusive (discret)! Voici une vidéo (mais vous pouvez l'essayer pour vous-même ici
) Avec la fonctionnalité intéressante que j'ai ajouté à la barre latérale Undolog, qui non seulement le rendre plus agréable J'espère rend encore plus fonctionnelle!
Le code que j'ai utilisé est très simple:
1 2 3 4 5 6 7 8 9
| window , 'load' , function ( ) { Événement. Observez (fenêtre, 'load', function () { ) . each ( function ( element ) { element. style . cursor = "pointer" ; $ $ ('H2.dropdown') Chaque style (function (element) {element = curseur "pointeur"...; 'click' , function ( event ) { élément. observer ('click', function (event) { this . next ( ) . style . display == "" ) new Effect. BlindUp ( this . next ( ) , { duration : .5 } ) ; if (.. this. next () le style d'affichage == "") Effet de nouvelles BlindUp (this. suivante () {durée: 0.5});. Effect. BlindDown ( this . next ( ) , { duration : .3 } ) ; . Effet chose de nouveau BlindDown (this. suivante () {durée: 0.3}); event ) ; Arrêtez événement (event).; ( element ) ) }. BindAsEventListener (élément)) }) }) |
A noter également que la première fois que vous chargez la page d'accueil du panneau est automatiquement fermée Catégories Undolog - identifié par l'ID tit_category :
1
| window , 'load' , function ( ) { new Effect. BlindUp ( $ ( "tit_category" ) . next ( ) , { duration : .5 } ) } ) . Observez l'événement (fenêtre, 'load', function () {Effet de nouvelles BlindUp ($ ("tit_category.") Next (), {durée:. 0,5})}) |
Les titres sur la barre latérale sont définies, puis, de cette manière:
1 2 3 4
| "tit_category" class = "dropdown replacetitle" title = "Categorie" >< span > Categorie < / span >< / h2 > < h2 id = "tit_category" class = "replacetitle déroulant" title = "Catégories"> < durée > catégories </ durée > </ h2 > < div > p > < p > pour se débarrasser de contenu </ p > </ div > |
da rendere dinamici, grazie alla funzione doppio-dollaro ($$) di Prototype.js – di cui abbiamo già parlato… Grâce à la classe dropdown titres sont identifiés H2 pour rendre dynamique, grâce au dollar double ($ $) de prototype.js - nous avons déjà parlé ...
Suite ...
Pourquoi passer à Apollo pour afficher le contenu HTML et dynamique quand un navigateur permet déjà? Pourquoi utiliser Joost Net TV pour voir si un navigateur permet déjà?
Pourquoi pas le producteur des deux fonctions simple navigateur en leur sein:
- Fenêtres sans fenêtre
- Objet P2P
Fenêtres sans fenêtre
Cette fonctionnalité simple serait tirer le maximum de la connexion HTTP et le rendre vraiment utile navigateurs. Pour ouvrir les fenêtres (pop-up dans la pratique) avec seulement le titre et pas de frontière, juste au cas où dans la transparence, accroître la production des widgets à être exploitées avec le navigateur normal, comme ce qu'il fait maintenant Apollo . Avec une étude minutieuse sur la sécurité (comme je crois qu'il est maintenant la seule raison de cette limite) ouvrirait des scénarios très intéressants.
Objet P2P
Comme nous le savons tous, aujourd'hui, tous navigateurs prennent en charge l'objet XMLHttpRequest , qui a donné naissance à une quantité infinie d'applications Ajax dits. Cet objet peut être consulté via JavaScript, est capable de fournir un canal HTTP - parallèle - client scriptable pour les deux IINV et réception de données.
Tôt ou tard, comme prévu dans le blog de divers autres, Adobe va insérer un P2P en Flash. Pourquoi ne pas faire la même chose dans le navigateur? Un objet de ce type avec des caractéristiques Windowless vous permettent de créer des applications comme Joost, sans rien installer sur votre machine, assurant une compatibilité croisée digne de l'Internet, augmentant ainsi l'efficacité de la production (aujourd'hui Joost est développé pour chaque système opérationnel, ce qui est assez lourde - à la fois temps et argent - en fait, la bêta suivra ...).
RSS FEED fenêtres courtes avec texte, audio et vidéo à partir de l'endroit où nous voulons sur nos bureaux, dans les normes du W3C vrai. Ouvrez canaux TCP sont directement à partir de JavaScript, avec des possibilités infinies d'échange de données. De toute évidence, la volonté est petit et le «crime» est élevé, les pirates, le spam et le phishing se cachent et se déplace de ce type de terroriser tout un peu »...
Suite ...
Je déclare que nous parlons de WordPress 2.0.6. Si vous essayez de définir les catégories de «combo» - déroulant - oeil sur le site du projet des indications WordPress . Lorsque vous effectuez un formulaire HTML avec un bouton submit faut faire attention de ne pas mettre le nom de la balise d'entrée simplement «soumettre», vaut tout gâcher juste essayer de submittare le formulaire via Javascript.
Sur le site de WordPress est proposé le code suivant:
1 2 3 4 5 6
| <li id="categories"> 'Categories:' ) ; ?> <? Php _e ('Catégories');?> <li> $PHP_SELF ?> " method="get"> <?php dropdown_cats ( ) ; ?> <input type="submit" name="submit" value="view" /> </form> <Form action = "<? Php echo $ PHP_SELF?>" Method = "get"> <? Php dropdown_cats ();?> <input type="submit" name="submit" value="view" /> </ form> </ Li> </ ul> </ Li> |
Notez que le bouton submit a le nom d'attribut défini sur «soumettre». Si vous essayez d'exécuter du code Javascript à un comme ceci:
1
| . submit ( ) ; document fait nomeform submit ()...; |
L'interprète devient confus parce qu'il ne distingue pas la méthode submit () l'élément «soumettre», qui est un bouton! La solution est simple: appelez cela comme vous, mais pas sur le bouton «soumettre»!
Le code que j'ai utilisé pour afficher les catégories en mode déroulant j'ai est la suivante:
1 2 3 4 5
| <div id="cmb_months"> <form name="xcats" id="xcats" action="/index.php" method="get"> ; ?> <? Php dropdown_cats ();?> </ Form> </ Div> |
J'ai également eu à modifier le noyau de WordPress (qui ne doit pas être fait ...). Dans le fichier "template-fonctions-category.php" J'ai modifié le dropdown_cats function () lors de la préparation de la balise select, j'ai ajouté:
1
| onchange = ". document.forms ['xcats'] submit ();" |
Voici le morceau de code pour suivre:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| $wpdb -> get_results ( $query ) ; Catégories $ = $ wpdb -> get_results ($ query); . " \n " ; echo '<select name="cat" class="postform" onchange="document.forms[\'xcats\'].submit();"> "" \ n ".; intval ( $optionall ) == 1 ) { if ( intval ($ optionall) == 1) { apply_filters ( 'list_cats' , $all ) ; $ Pour = apply_filters ('list_cats', $ tout); <option value='0'>Seleziona una Categoria</option> \n " ; echo "\ t value='0'> <option Choisissez une catégorie </ option> \ n"; } intval ( $optionnone ) == 1 ) if ( intval ($ optionnone) == 1) <option value='-1'>" . __ ( 'None' ) . "</option> \n " ; . echo "\ t value='-1'> <option" __ ('Nom') "</ option> \ n".; $categories ) { if ($ catégories) { $categories as $category ) { foreach ($ $ catégories comme catégorie) { apply_filters ( 'list_cats' , $category -> cat_name , $category ) ; $ Cat_name = apply_filters ('list_cats', $ catégorie -> cat_name, $ catégorie); <option value= \" " . $category -> cat_ID . " \" " ; echo "\ t <option value= \"". $category -> cat_id." \ ""; $category -> cat_ID == $selected ) if ($ catégorie -> cat_id == $ sélectionnée) ; echo 'selected = "selected"'; ; echo '>'; ; echo $ cat_name; intval ( $optioncount ) == 1 ) if ( intval ($ optioncount) == 1) . $category -> cat_count . ')' ; echo '('. $ catégorie -> cat_count. ')'; intval ( $optiondates ) == 1 ) if ( intval ($ optiondates) == 1) . $category -> lastday . '/' . $category -> lastmonth ; . echo''$ catégorie -> lastday '/' $ categorie -> lastmonth..; " ; echo "</ option> \ n"; } } " ; echo "</ select> \ n"; |
Une chose que fait la fonction est de définir la liste déroulante de la catégorie choisie recharger la page quand j'ai le temps ... juste le regarder mieux.
Comme on le sait tous, pour le souci d'exhaustivité, je note que l'action était nécessaire avec un code non-intrusive (discrète) au lieu d'entrer directement dans la construction de la onchange du combo. En outre, les catégories affichées dans le combo ne sont pas accessibles pour les navigateurs avec Javascript désactivé. Cependant cela peut être résolu en utilisant la balise noscript dans la barre latérale et voir les catégories comme une liste de liens - mode par défaut de Wordpress - des ajustements qui seront bientôt
.
Suite ...
L'insertion d'objets (en particulier les objets Flash) dans des pages web est devenu récemment une souvent stressant. En d'autres postes que nous avons déjà abordé le sujet de la façon de détecter Flash et insérer des pages de manière appropriée. Comme nous avons parlé des techniques discrètes, nous marquons deux bien connus script peut détecter (et éventuellement installer) et d'insérer des objets Flash sur une page, dans un très discret et afficiente: SWFObject et UFO .
Les deux scripts sont essentiellement les mêmes caractéristiques et la même opération. L'approche consiste à le remplacer par un tag particulier en utilisant Javascript sur votre navigateur. Comme nous le savons, cette procédure élimine le problème d'activation de l'objet Flash imposé par Internet Explorer, cependant, implique que Javascript est activé sur le navigateur cible.
Les deux scripts ne pas utiliser des bibliothèques externes telles que prototype.js par exemple. La plus importante différence entre les deux est que SWFObject est appelée lorsque la balise d'être remplacé est déjà chargée sur la page, pas exactement combien discret. Voici un extrait de code qui montre la séquence d'appel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| "flashcontent" > < div id = "flashcontent"> strong > < forte > Vous devez mettre à jour votre Flash Player </ p > Ceci est remplacé par le contenu Flash. Placez votre contenu alternatif ici et utilisateurs sans le plugin Flash ou avec Désactivé JavaScript va voir ça. > noscript < / code > Contenu ici vous permet de laisser de côté < le code inline = "true"> noscript </ code de > tags. "swfobject.html?detectflash=false" > bypass the detection < / a > if you wish. Inclut un lien à < une href = "swfobject.html? detectflash = false"> contourner la détection </ une > si vous le souhaitez. </ div > "text/javascript" > < script de type = "text / javascript"> / / <! [CDATA [ , "sotester" , "300" , "300" , "9" , "#FF6600" ) ; var so = nouvelle SWFObject ("so_tester.swf", "sotester", "300", "300", "9", "# FF6600"); ) ; // this line is optional, but this example uses the variable and displays this text inside the flash movie so.addVariable ("flashVarText", "ceci est passée en via FlashVars par exemple seulement") / / cette ligne est facultative, mais cet exemple utilise la variable et affiche ce texte à l'intérieur du film flash ; so.write ("flashcontent"); / /]]> </ scripts > |
OVNI , cependant, permet un'approccio beaucoup plus en accord avec le script classique discret. Le remplacement de la balise est en mode transparent sans charger des séquences abbligare, comme le montre l'exemple ci-dessous:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| < tête > title > < title > Discret objets Flash (OVNI) | Exemple de page </ title > "Content-Type" content = "text/html; charset=iso-8859-1" / > < meta http-equiv = "Content-Type" content = "text / html; charset = iso-8859-1" /> "text/javascript" src = "ufo.js" >< / script > < script de type = "text / javascript" src = "ufo.js"> </ scripts > "text/javascript" > < script de type = "text / javascript"> var = {film: "test8.swf", largeur: "300", hauteur: «120», MajorVersion: «12», de construire: «0», XI: "true"}; UFO.create (FO, "ufoDemo"); </ scripts > </ tête > < corps > "ufoDemo" > < div id = "ufoDemo"> p > < p > Remplacement de contenu </ p > "border: none;" / >< / a >< / p > Macromedia Flash Player "style =" border: none; "/> </ une > </ p > </ div > </ corps > |
Dans le code source du script d' ovnis , en fait, vous pouvez utiliser immédiatement - plus approprié - un événement qui prudents chargement de la page avant de remplir l'opération de remplacement, approche donc extrêmement bien adapté à la plupart des scripts ne sont pas intrusifs.
Suite ...
Parmi les diverses bibliothèques - ou un ensemble de bibliothèques (cadre réel), dédié à l'Ajax, HTML et d'extension Interface Web 2.0 que j'ai vu, Ext est certainement digne de mention. Le site et la documentation sont bien fait et organisé, aussi la démo est à ne pas manquer. L'interface utilisateur graphique, compatibilité avec Prototype et Scriptaculous , et impletazione Utils Yahoo, au moins en font un système intéressant! Méfiez-vous si la licence! Malgré se présentant comme l'open source et gratuit pour usage personnel, nécessite une redevance pour améliorer l'utilisation et de soins. Ce dernier, en fait, ne doit jamais être sous-estimée dans le cadre d'une certaine complexité.
Pour la documentation et de démonstration , cliquez ici .
En particulier je mentionne ce système, je suis en train d'analyser en détail, comme il a été utilisé pour créer lecteur de flux frais , l'un des exemples d'applications fournis avec la sortie d'Adobe Apollo Alpha (voir Adobe Apollo Alpha Release ). frais, par conséquent, est Par exemple d'un double d'Apollon, ce qui démontre sa capacité à exploiter HTML et JavaScript au plus. Frais, en fait, n'est pas un pur Apollon, mais utilise le framework Ext - et alors vous avez besoin de JavaScript et HTML - Apollo dans le moteur! Super!
Suite ...
Voici un outil nouveau et intéressant pour la compression et l'obscurcissement du code Javascript (voir aussi Reverse Engineering: les compresseurs de code ).
Sur le site Web de Dean Edwards , vous pouvez télécharger le code source de cette JavaScript compresseur. Par ailleurs, l'auteur a mis à disposition les versions serveur de Microsoft. NET Framework version 1.1, Perl, WHS et PHP5.
Online est une version de travail disponible pour essayer immédiatement , moins complexe - pour être honnête - que je n'avais fait depuis longtemps . Fact permet de compresser le code avec seulement deux choix: le Base62 codé, qui obscurcissent le code et Shrink variables, les variables de l'optimiseur.
Comparé à la version précédente ont été corrigés quelques bugs qui, dans des situations extrêmes de hacks (et vraiment intéressant) que:
1
| /*@cc_on!@*/ false ; isMSIE var = / * @ @ * cc_on / faux!; |
n'étaient pas conformes à la sortie générée. Maintenant, les deux sont correctement soutenus commentaires conditionnels de Microsoft, est de + / - dans des conditions telles que:
Comme indiqué dans la page Aide , cependant:
Emballé avec succès scripts déballage sur tous les navigateurs si cela support JavaScript. Seuls les fonctionnalités de base JavaScript est utilisé pour décoder le script emballés.
Certains navigateurs ne peuvent soutenir le packer lui-même. L'Interface Web requiert DOM pris en charge. Navigateurs Legacy affichage de l'interface désactivée.
Alors attention aux utilisateurs finaux et le type de support du navigateur comme toujours ... le reste!
Suite ...
Dans ce post, je tiens à analyser l'utilisation de script discret du point de vue du concepteur Web. Normalement, en fait, un script qui n'est pas intrusive vers la fin du navigateur!
Mais il peut aussi être utilisé pour le Web Designer?
JavaScript non intrusif du point de vue du concepteur Web
Nous mettre dans la peau d'un web designer peut identifier deux catégories de discret JavaScript: JavaScript JavaScript discret vraie et la pseudo discret.
Les deux catégories, cependant, ne sont pas totalement non-intrusive (toujours du point de vue du concepteur Web). Un JavaScript réelle et complète discret ne devrait prendre aucune action sur la page Web, mais ce n'est - pour le moment - fondamentalement impossible. L'opération minimale requise lors de l'installation d'un script est, toutefois, l'inclusion de l'inclusion du script lui-même! Il est, par conséquent, que cette opération permise - en fait - n'a même pas besoin du web designer pour faire des ajustements réguliers de la structure de la page. Le placement simple de l'inclusion de la balise de script à l'intérieur du head peut être donc considéré comme non intrusif.
La vraie JavaScript discret
Les scripts de ce type sont les seuls qui exigent l'inclusion du script et pas discret; prétendre à aucune opération! Scripts de ce type sont, par exemple (l'habituel et souvent cité), snap . Une fois que vous avez entré le code incluent les concepteurs Web ne doit pas s'engager dans toute autre opération, comme le script pression fonctionne sur des étiquettes standard.
Pseudo JavaScript non intrusif
Elles sont différentes des précédentes marquage comme nécessitant davantage afin de fonctionner correctement. Des exemples de ce type sont Control.Tabs du Ryan Johnson à glisser ou à la bibliothèque de Lightbox JS . per identificare i link che devono essere modificati. Lightbox JS , in particolare, richiede addirittura la presenza esplicita sia di Prototype che di Scriptaculous . La dernière solution, par exemple, exige l'inclusion dans le Tag A l'attribut rel pour identifier les liens qui doivent être modifiés. Lightbox JS , en particulier, exige explicitement et même la présence d' un prototype que Scriptaculous . Comme indiqué sur le site Lightbox JS , l'inclusion du script devrait ressembler à ceci:
1 2 3
| "text/javascript" src = "js/prototype.js" >< / script > < script de type = "text / javascript" src = "js / prototype.js"> </ scripts > "text/javascript" src = "js/scriptaculous.js?load=effects" >< / script > < script de type = "text / javascript" src = "js / scriptaculous.js? = charge des effets"> </ scripts > "text/javascript" src = "js/lightbox.js" >< / script > < script de type = "text / javascript" src = "js / lightbox.js"> </ scripts > |
Les liens qui pointent vers un'immmagine vous souhaitez afficher le système avec Lightbox JS devrait être écrit comme ceci:
1
| "images/image-1.jpg" rel = "lightbox" title = "my caption" > image #1 < / a > < une href = "images/image-1.jpg" rel = "lightbox" title = "mon titre"> l'image # 1 </ une > |
En plus d'identifier un groupe d'images, d'ajouter la possibilité de faire défiler les images vers l'avant et en arrière, les balises A être réglée comme suit:
1 2 3
| "images/image-1.jpg" rel = "lightbox[roadtrip]" > image #1 < / a > < une href = "images/image-1.jpg" rel = "lightbox [roadtrip]"> l'image # 1 </ une > "images/image-2.jpg" rel = "lightbox[roadtrip]" > image #2 < / a > < une href = "images/image-2.jpg" rel = "lightbox [roadtrip]"> l'image # 2 </ une > "images/image-3.jpg" rel = "lightbox[roadtrip]" > image #3 < / a > < une href = "images/image-3.jpg" rel = "lightbox [roadtrip]"> image # 3 </ une > |
Le besoin de telles contraintes est évident, il n'existe aucun moyen facile de distinguer un élément de liaison (Tag A ) d'un autre. En particulier, il n'est pas possible de comprendre quel élément le concepteur veut afficher une façon ou d'une autre. Concepteur de sites Web doivent nécessairement peu tags et leurs comportements. Sont donc nécessaires - intrusive - totalement compréhensible, pas du tout diminuer l'utilité et le potentiel de ces scripts. Que conduire à plus de détails et quelques lignes de code au cours des Web Designer.
Il est intéressant, cependant, le double aspect de «discret JavaScript, est analysé en termes de point d'extrémité-de vue utilisateur, Web Designer.
Suite ...
Comme nous en avons parlé bien dans le post précédent, il est temps de parler du mal (blague), ou au moins mettre en évidence certaines lacunes de la technique du JavaScript non intrusif.
Si discret code JavaScript est exécuté lorsque la page est complètement chargée, il s'ensuit que plus la quantité de données (HTML) qui composent notre page, et plus de temps à attendre avant que notre code est exécuté.
Cela peut entraîner des retards dans la mise en œuvre et résultant en un effet scintillement désagréable si vous travaillez sur les éléments visuels de la page. Prenez par exemple le code utilisé par Ryan Johnson pour créer des objets TabStrip. Si vous regardez la démo , vous constaterez que pendant environ une seconde, lorsque la page se charge, vous pouvez clairement voir une mise en page standard pour être remplacé immédiatement après que les objets TabStrip. Le rechargement de la page à nouveau, grâce à la cache du navigateur, le problème tend à diminuer (essayez de nettoyer tous de votre navigateur cache pour voir le temps).
Tout cela doit nous faire réfléchir sur les limites de cette technique. La même pression souffre d'exactement les mêmes ralentissement, en particulier dans les pages qui sont souvent extrêmement élevé que celui des undolog.com . Chargement de la page d'accueil de ce blog est clair que Aligner tourne quelques secondes plus tard, c'est à dire lorsque la page est complètement chargée.
Par définition de «discret JavaScript est difficile de résoudre ce problème en général. Toutefois, l'élaboration d'un propriétaire de site peut prendre certaines mesures visant à éliminer ou réduire ces défauts. Une façon assez simple est de créer une sorte de pré-charge, un élément souvent utilisé dans Adobe Flash. Vous pouvez ensuite définir la balise body - qui contient tous les éléments de la page - de sorte qu'il est invisible, laissant la tâche de code JavaScript pour le rendre visible quand il a fini - le cas échéant - des modifications au DOM:
1
| "ibody" style = "display:none" > < corps id = "iBODY" style = "display: none"> |
Le code JavaScript discret à la fin de ses opérations:
1 2 3
| "ibody" ) . style . display = "" ; .. documents getElementById (". iBODY") style d'affichage = ""; / / Si vous utilisez le prototype ) . style . display = "" ; $ (". IBODY") Style d'affichage = "".; |
Solution, cependant, trivial et pas toujours applicable. Par ailleurs, même si nous en quelque sorte résolu le problème de la première caricameno, de naviguer dans une telle manière dans le long terme pourrait être très ennuyeux pour les surfeurs. Ne pas être intrusif, par conséquent, a un prix à payer. Même fonctionnement au niveau des objets, par exemple en fixant uniquement les éléments intéressants dans le mode caché, le fait que le code commence à la fin du chargement de la page entière avec elle conduit inévitablement à des problèmes exactement les mêmes.
Derniers Commentaires
Mark : @ Marc: Merci pour la réponse. Par exemple, si vous avez un code de sauvegarder / utiliser le dossier ...
Mark : Merci pour la réponse. Par exemple, si vous avez un code de sauvegarder / utiliser le dossier ...
Giovambattista Fazioli : @ Marc: en principe, absolument, beaucoup dépend de comment et quoi télécharger. La. ..
Mark : Bonjour, bon guide! Je voulais vous demander, vous pouvez utiliser le même code à exécuter une base de données SQL? Au lieu de ...
Joseph : Salut je voulais vous demander comment vous pouvez faire dans le post que j'ai téléchargé une galerie de 50 images, par exemple, ...