Så här skapar du en jQuery-kodkod

I den här handledningen kommer vi att skapa en kodfält som visar exempelkod på webbsidor på ett snyggt formaterat och lättläst sätt, ungefär som det du ser här på Webuts. Kodfragmentet förhandsgranskningsrutor som detta görs ofta som Wordpress-plugins, men vi får se hur vi kan göra samma sak med bara en liten jQuery och CSS.

Vi kan lägga till alla förväntade funktioner som linjenummering och linjebandning och alla vanliga verktyg som att visa koden som vanlig text och skriva ut det på ett skrivarvänligt sätt. Följande skärmdump visar vilken typ av sak som vi kommer att sluta med i slutet av handledningen:



Komma igång

Kodfältet kommer att byggas från en underliggande

 element; Det här är det perfekta elementet att använda eftersom det gör vad som helst som du lägger in det som vanlig text i ett fastbreddstypsnitt som monospace, vilket är idealiskt för att visa kodprover på ett tydligt och kortfattat sätt. Det bevarar också raderingar som är en funktion som vi kan utnyttja för att lägga till radnummererings- och randfunktionerna.

En annan anledning till att vi använder

 taggen beror på att den utgör en idealisk grund för vår kodlåda; i webbläsare med JavaScript inaktiverat, eller de som helt enkelt inte stöder det, kommer koden fortfarande att bli acceptabel. Det kommer att sticka ut från resten av texten på sidan och det kommer inte att degenerera till något helt värdelöst och löjligt.

Börja med den följande sidan i din textredigerare:

    jQuery kodfältet    

CSS-kod:

#selector color: # 000000;  .andraväljaren font-size: 20px; gränsen: 1px solid # 000000; padding: 20px;  tagnam bredd: 100%; 

Spara sidan som code-snippet.html i en katalog som redan har den nuvarande versionen av jQuery som ligger inom den. Med ingen styling och inget manusintervall ska sidan se ut så här:


Som standard återgång är det acceptabelt; om sidan hade annan kroppstext på den,

 elementet skulle sticka ut som ett separat textblock och skulle fortfarande vara lite kodliknande.


Börjar skriptet

Låt oss börja med att lägga till den randande effekten som gör att varje rad skiljer sig från de ovan och under den och linjenummeringen som kommer att visas när en trasig linje (som övergår till två eller flera rader) är en del av en rad exempelkod.

I den tomma > element längst ner på lägg till följande kod:

$ (funktion () // bearbeta innehållet i snippets $ ("pre.snippet"). varje (funktion () // hämta innehåll av 
 och skapa lista och behållare var currentItem = $ (detta), currentContents = currentItem.text (), innehåll = (currentItem.text () .indexOf ("\ n")! = -1)? currentItem.text () split ("\ n"): currentItem.text (). split ("\ r"), list = $ ("
    "), behållare = $ ("
    ") .addClass (" snippet-container "). insertBefore (currentItem.prev ()); // ta bort originalinnehållet och linda i behållaren currentItem.text (" "). prev (). andSelf () .appendTo ; // normalisera höjd (currentItem.height ()> 0)? list.css ("marginTop", -16): null; // skapa listobjekt $ .each (innehåll, funktion (jag, val) // skapa listobjekt och inre p var li = $ ("
  1. ") .appendTo (list), p = $ ("

    ") .text (val) .appendTo (li); // lägg till randklass (i% 2 === 0)? li.addClass (" stripe "): li.addClass (" unstripe "); .appendTo (currentItem);););

Låt oss gå igenom varje del av koden för att se vad den gör, först väljer vi var och en

 element som har rubrikens klassnamn och för varje som hittats utför vi en anonym funktion. Inom denna funktion ställer vi först fem variabler; Den första variabeln är väljaren för strömmen 
 element som vi cachar av prestationsskäl. Vi ska använda $ (Detta) referens upprepade gånger i vår kod så det är vettigt att lagra det i en variabel för snabb åtkomst.

Nästa variabel lagrar hela textinnehållet i strömmen

 och nästa kommer att lagra en matris där varje objekt i matrisen innehåller en enda textrad från 
 element. Längden på matrisen kommer att matcha antalet rader med text i 
 element. Eftersom linjen bryter in 
 element är bevarade, vi kan enkelt detektera dessa och utföra en delning baserat på dem.

De flesta webbläsare upptäcker radbrytningar i JavaScript med hjälp av \ n newline karaktär så vi först ser om den inre texten av

 Elementet innehåller något av dessa och använder dem om det gör det. IE upptäcker radbrytningar annorlunda än andra webbläsare, så om nej \ n tecken finns att vi utför delningen med hjälp av \ r vagnens returkaraktär istället.

Nästa variabel innehåller ett nytt beställt element; använder en

    elementet är perfekt eftersom det kommer att hantera linjanummeringen av kodavsnittet automatiskt för oss. Den slutliga variabeln pekar på en ny behållare
    som vi ger ett klassnamn till och lägger till sidan direkt före

    element som föregår kodrutan.

    Skapa arrayen av

     elementets innehåll är inte en destruktiv operation, så vi måste ta bort det ursprungliga innehållet för att undvika att duplicera det, vilket vi kan göra genom att använda en tom sträng med jQuery s text() metod. Vi flyttar också 

    och den
     inslag i vårt nyligen skapade behållarelement.

    Firefox verkar lägga in en radbrytning i

     element, vilket ger elementet höjd när det inte borde ha någon höjd alls (som vi har tagit bort innehållet). För att motverka detta upptäcker vi om det är tomt 
     elementet har höjd större än 0, och om så sätter vi på margin-top av vårt nya 
      element för att dra upp det till elementets topp. Det är bara Firefox som gör det här, men det är bättre att kolla på höjd istället för att leta efter Firefox. Funktionsdetektering över sniffing av webbläsare vinner varje gång.


      striping

      Nästa avsnitt av koden handlar om att lägga till de klasser vi kan använda för randningseffekten; som vi har lagt in innehållet i

       element i en array och inte ett jQuery-objekt kan vi inte använda standarden varje metod som vi gjorde med 
       element på sidan.

      I stället kan vi använda jQuery varje verktygsmetod som heter direkt på jQuery $ objekt. Metoden accepterar 2 argument, den första är föremålet att iterera över, i det här fallet vårt innehåll array och den andra är en anonym funktion som ska utföras för varje objekt i arrayen. Vår funktion ges automatiskt två argument; jag är indexet för föremålet för närvarande iterated och val är innehållet i array-objektet.

      Inom vår funktion skapar vi först en ny lista för våra

        och sätt in ett nytt styckeelement som innehåller innehållet i det aktuella array-objektet. Det nya objektet lägger till i
          element som vi skapade tidigare. Vi lägger sedan till stripning klasserna; för att göra detta använder vi JavaScript-moduloperatören för att bestämma om det aktuella arrayindexet är udda eller jämnt; för varje jämnt index lägger vi till klassen rand och för varje udda index lägger vi till klassen unstripe. Att använda 2 klasser för stripning innebär att vi enkelt kan ställa in båda randiga färger istället för att insistera på att en av dem är vit.

          På detta stadium ska vår exempelsida nu visas så här:



          Utdragsformulär

          Nu kan vi lägga till styling för kod-kodning widgeten och striping; i en ny fil i din textredigerare lägg till följande kod:

          .snippet-container width: 630px; vaddering: 10px 10px 30px; gräns: 1px fast # 999999; background-color: # e1e1e1; margin-bottom: 10px; positioner: relativ;  .bit-container h2 margin: 0 0 10px; padding-vänster: 10px; font-family: Georgia; font-weight: normal; font-style: italic;  .snippet border: 1px solid # 999999; marginal: 0;  .snippet ol margin: 0; padding-vänster: 34px; background-color: # 8dd397; färg: #ffffff; font-weight: bold; font-style: italic;  .snippet ol li padding-left: 10px;  .uttag ol p marginal: 0; color: # 000000; font-weight: normal; font-style: normal; white-space: pre-wrap; vaddering: 3px 0;  .snippet .stripe bakgrundsfärg: # f5f5f5;  .snippet .unstripe bakgrundsfärg: #ffffff; 

          Spara detta som code-snippet.css i samma katalog som exempelsidan. Det mesta av denna CSS är rent för dekoration och har väljats ​​vederbörligen enligt mina egna preferenser. Du kan ändra alla teckensnitt, färger, bredden eller något alls. Den viktigaste funktionella CSS vi ställer in är den relativa positioneringen på varje kodboks och white-space regera på det inre

          element i varje listobjekt om vi inte ställer in det här pre-wrap Texten för varje rad kommer att överfalla siktbehållaren när den är för lång i stället för att bryta till nästa rad.

          Med tillägget av vårt stilark visas rutan för utdrag nu så här:



          Andra typer av kod

          I det här exemplet hittills har vi använt en mycket enkel CSS som exemplet kod som visas i rutan. Kan vi lägga till någon annan typ av kod som vi vill ha? Låt oss ta en titt. Direkt efter det första

           element på sidan lägg till följande kod: [/ sourcecode]

          [sourcecode language = "snippet" originalClass = "snippet"]    En webbsida för exempel   

          Detta är en grundläggande webbsida

          Allt är ganska mycket vad vi hade tidigare med en stor skillnad; vi kan inte använda < tecken när du visar HTML-taggar i vår exempelkod. Om vi ​​skulle sätta i vår

           tagg skulle det tolkas som en  element och orsaka en HTML-varning. För att övervinna detta kan vi ange HTML-enheten 

          <

          som kommer att ändras till a karaktär av webbläsaren utan att webbläsaren tänker att det är ett faktiskt element. Det är nog bäst att visa vilken kod som använder tecken på detta sätt för att förhindra oavsiktlig tolkning av webbläsaren. Så här visas den andra kodrutan:


          Jag har fastnat vid den indragningskonvention som jag brukar använda, vilket är 2 standardutrymmen för kapslade element; Det här är en vana jag har fått till följd av att jag behöver visa massor av potentiellt breda kodkod i dokument med fast bredd. Det är inte standardkonventionen, som är fyra enkla mellanslag eller ett flikutrymme. Du kan använda vilken konvention du föredrar när du använder snippet-rutan på din egen webbplats, eftersom både enskilda mellanslag och flikytor bevaras av pre märka.


          Utdragsverktyg

          En annan funktion i kodrutan som vi enkelt kan lägga till är en serie verktyg som hjälper besökaren att använda koden. Om du försöker kopiera och klistra in koden från ett av utdragslådorna till en textredigerare ser du att radnummer från den beställda listan också kopieras till den nya sidan. Detta är olyckligt, eftersom det går att stoppa exemplet koden från att arbeta. En sak vi kan göra är att tillhandahålla en mekanism där koden kan visas utan radnummer.

          Direkt efter koden som läser list.appendTo (currentItem); lägg till följande kod:

          // skapa verktyg var toolContainer = $ ("
          ") .addClass (" verktygsbehållare "), verktygslista = $ ("