Hoe een leuke takenlijst te coderen met PHP en AJAX

Voor de tutorial Tuts + Premium van deze week werken we met veel verschillende technologieën. Uiteindelijk zullen we een takenlijst maken waarmee u, of uw gebruiker, items asynchroon kunt maken, bijwerken en verwijderen. Om onze taak te volbrengen, zullen we de AJAX-mogelijkheden van PHP en jQuery gebruiken. Ik denk dat je zult merken dat het niet zo moeilijk is als je in eerste instantie denkt. Ik zal je precies laten zien hoe!

Deze tutorial bevat een screencast die beschikbaar is voor leden van Tuts + Premium.



Stap 1: een nieuwe database maken

Zoals u zich kunt voorstellen, kunnen we geen records in een statische omgeving opslaan, verwijderen en bijwerken. We moeten dus een MySQL-database maken waarin de informatie wordt opgeslagen.

Als u PHPMyAdmin gebruikt, gaat u naar het configuratiescherm door naar http: // localhost / phpmyadmin te gaan.


Typ "db" in het tekstvak "Nieuwe database maken" en klik op "Maken". Vervolgens moet u een tabel maken. Typ 'todo' en '3' voor 'aantal velden'.


Onze kolommen maken

We moeten nu de juiste kolommen toevoegen.

  • ID kaart : unieke ID om elke rij te identificeren.
  • titel : De titel van ons item.
  • Omschrijving : Een beschrijving van wat we moeten doen!

Zorg ervoor dat de opties van elk veld overeenkomen met de opties in de volgende afbeelding.


Voeg testrijen in

Nu we onze database hebben gemaakt, kunnen we snel enkele testrijen toevoegen. Klik op uw "db" -database; kies vervolgens "Bladeren". U wordt naar een scherm gebracht met de inhoud van elke rij in uw database. Het is duidelijk dat deze sectie op dit moment leeg is. Kies "Invoegen" en voeg een paar kolommen toe. Typ wat je maar wilt hier.




Volledige screencast



Stap 2: De Db-klasse


Hoewel dit op geen enkele manier vereist is, vind ik dat het het gemakkelijkst is om mijn functies te beheren wanneer ik ze in een klas groepeer. Daarom zullen we nu een "Db" -klasse maken die verschillende functies zal bevatten.

  • __construct : Deze functie wordt automatisch uitgevoerd zodra het object wordt geïnstantieerd.
  • delete_by_id () : Wist de benodigde rij door de unieke ID van de rij door te geven.
  • update_by_id () : Werkt de rij bij door zijn unieke ID door te geven.

Open uw code-editor naar keuze en maak een nieuw bestand aan met de naam "db.php". Plak in dit lege document de volgende regels code in.

 klasse Db private $ mysql; function __construct () $ this-> mysql = new mysqli ('localhost', 'root', 'yourPassword', 'db') of die ('probleem');  // eindklasse

Om een ​​nieuwe klasse te maken, gebruiken we de onderstaande syntaxis.

 class 'myClass' 

Met alleen de bovenstaande code hebben we met succes een nieuwe klasse gemaakt. Het doet nog niets, maar het is toch een klasse!

__construct ()

De __construct () methode (class talk for "function") staat bekend als een "magische methode". Het zal onmiddellijk worden uitgevoerd nadat een klasse is geïnstantieerd. We gaan deze methode gebruiken om onze eerste verbinding met de MySQL database tot stand te brengen.

 function __construct () $ this-> mysql = new mysqli ('localhost', 'root', 'yourPassword', 'db') of die ('probleem'); 

Als u niet bekend bent met OOP, kan het in eerste instantie enigszins ontmoedigend zijn. Gelukkig is het niet zo moeilijk om te begrijpen. We willen dat onze mysql-verbinding beschikbaar is voor alle methoden in onze klas. Dit in overweging nemend, zou het geen goed idee zijn om de $ mysql-variabele in een specifieke functie op te slaan. In plaats daarvan moet het een klasse-eigenschap zijn.

 privé $ mysql;

Toegang krijgen tot eigenschappen vanuit methoden

Binnen een methode kunnen we niet alleen toegang krijgen tot ons eigendom door te typen, "$ mysql". We moeten eerst naar het object verwijzen.

 $ This-> mysql

Let op het feit dat we bij het betreden van een woning het dollarteken kunnen laten staan.

mysqli


Het verdient de voorkeur om mysql improved (mysqli) te gebruiken in plaats van de traditionele mysql_connect-methode bij het verbinden met een database. Niet alleen is het sneller, het stelt ons ook in staat om een ​​OOP-benadering te gebruiken.

Bij het maken van een nieuw exemplaar van de mysqli-klasse moeten we vier parameters doorgeven.

  • gastheer : 'localhost'
  • gebruikersnaam : root
  • wachtwoord : 'uw wachtwoord'
  • database naam : db

Dat zou het voorlopig moeten doen. In de loop van deze tutorial komen we terug naar onze les om nieuwe methoden toe te voegen. Onthoud gewoon dat wanneer we een nieuw exemplaar van deze klasse maken ...

 vereisen 'db.php'; $ db = nieuwe Db ();

... we openen automatisch een verbinding met onze database, dankzij de __construct () magische methode.

De markup


Nu moeten we onze opmaak voor de startpagina maken. Voeg een nieuwe pagina toe aan uw oplossing en sla deze op als "index.php". Plak vervolgens het volgende.

      Mijn takenlijst     

Mijn takenlijst

  • Te doen
...
...

Analyse

In de kop van ons document verwijs ik naar het CDN van Google voor toegang tot jQuery. Dit is gemakkelijk de voorkeursmethode bij het gebruik van jQuery. Vervolgens verwijs ik naar een 'scripts.js' bestand dat we later in deze tutorial zullen maken.

Laten we snel bekijken waar elke div voor is.

  • houder : Standaard verpakking div.
  • ul # tabs : Onze navigatie. We zullen Javascript gebruiken om de extra tabbladen toe te voegen. Ik zal het binnenkort uitleggen.
  • hoofd : Wrap voor de hoofdinhoud.
  • Te doen : Tab 1.
  • addNewEntry : Tab 2

Stap 4: CSS


Dit is geen zelfstudie via CSS. U bent vrij om de stylesheet te bekijken die ik heb gebruikt. Het zit in de downloadbundel. Als je een diepere beoordeling wilt, bekijk dan de screencast.


Stap 5: Records ophalen

Nu we verbinding hebben gemaakt met de database en onze markup / CSS hebben gemaakt, laten we wat code schrijven die de databaserijen zal ophalen.

Voer de volgende tekst in de "todo" -div in.

 
mysql-> vraag ($ vraag); if ($ results-> num_rows) while ($ row = $ results-> fetch_object ()) $ title = $ row-> title; $ description = $ row-> description; $ id = $ row-> id; echo '
'; $ data = << $ Titel

$ beschrijving

D E
EOD; echo $ data; echo '
'; // end while else echo "

Er zijn nul items. Voeg er nu een toe!

";?>

Analyse

  • Gebruik 'require' om toegang te krijgen tot onze Db-klasse.
  • Maak een nieuw exemplaar van de Db-klasse.
  • Maak een query. Hiermee worden alle records uit de "todo" -tabel opgehaald en in oplopende volgorde gesorteerd.
  • We moeten nu onze vraag uitvoeren. $ Db-> mysql-> vraag ($ vraag). $ db verwijst naar het object. $ mysql verwijst naar de mysqli-klasse. $ query is een methode van de mysqli-klasse waarmee we een query kunnen doorgeven. Hier geven we de reeks door die we zojuist hebben gemaakt.
  • $ results-> num_rows retourneert het totale aantal opgehaalde rijen uit de database. Als er een of meer worden geretourneerd, gebruiken we een while-instructie om door de rijen te lopen.
  • Maak een tijdelijke variabele genaamd $ rij die verwijst naar de informatie, voor elke iteratie. Vervolgens maken we drie variabelen die verwijzen naar hun respectieve tegenhangers in de database.
  • Elk item wordt verpakt in een div met een klasse van "item".
  • Vervolgens gebruiken we heredocs om ons taakitem te formatteren. Heredocs zorgen voor een eenvoudige, en georganiseerde manier om html en php te mixen. Lees deze screencast voor meer informatie.
  • Wikkel de titel binnen h4-tags; de beschrijving binnen p-tags.
  • De gebruiker heeft een manier nodig om elk item te bewerken en te verwijderen. We hebben dus twee ankertags gemaakt waarmee we dit kunnen doen. We komen hier later op terug.
  • Roep onze heredocs-info uit en sluit de divine ".item".
  • Als er nul rijen zijn geretourneerd uit de database, echo "Er zijn nul items. Voeg er nu een toe!".

Hopelijk was dat allemaal logisch. Op dit moment zou u ongeveer het volgende moeten hebben:


Stap 6: voeg een nieuw item toe


We willen ook dat de gebruiker de mogelijkheid heeft om nieuwe records in te voegen. Laten we een formulier maken dat dit mogelijk maakt.

 

Nieuwe invoer toevoegen

Dit is uw standaard 'standaard' formulier. We hebben ingangen voor een titel en beschrijving toegevoegd. Wanneer op de knop Verzenden wordt geklikt, wordt de ingevoerde informatie gepost naar "addItem.php". Laten we die pagina nu maken.


Stap 7: AddItem.php

Maak een nieuw document en sla het op als "addItem.php". Plak in de volgende code:

 mysql-> prepare ($ query)) $ stmt-> bind_param ('ss', $ _POST ['title'], $ _POST ['description']); $ Stmt-> execute (); header ("location: index.php");  anders sterven ($ db-> mysql-> error); 
  • Raadpleeg onze db-klasse.
  • Start de klas.
  • Als de verzendknop met de naam "addEntry" bestaat, voer dan de volgende code uit.
  • Maak een nieuwe query. U zult merken dat ik vraagtekens als de waarden gebruik. Het is de geprefereerde methode om voorbereide instructies te gebruiken bij het bijwerken van onze database. Het is een uitstekende manier om uzelf tegen sql-injectie te beschermen.
  • Bereid onze mysql-variabele voor door de query op te geven die we zojuist hebben gemaakt.
  • Als het met succes is voorbereid, bind dan de juiste parameters. De eerste parameter vraagt ​​om de gegevenstypen voor elk item. Ik heb 's' gebruikt om te verwijzen naar 'string'. De tweede twee parameters halen de titel- en beschrijvingswaarden uit de POST superargige array.
  • Voer de verklaring uit.
  • Leid de gebruiker uiteindelijk terug naar de startpagina.

Stap 7: items bijwerken


Met de AJAX-mogelijkheden van jQuery laten we de gebruiker elk item bijwerken zonder een postback. Maak een nieuw bestand in een "js" -map en noem het "scripts.js". Houd er rekening mee dat we dit bestand al in onze markup hebben verwezen.

 $ (function () $ ('. editEntry'). klik (functie () var $ this = $ (this); var oldText = $ this.parent (). parent (). find ('p'). text (); var id = $ this.parent (). parent (). find ('# id'). val (); $ this.parent (). parent (). find ('p'). empty ( ) .append (''); $ ('. newDescription'). blur (function () var newText = $ (this) .val (); $ .ajax (type: 'POST', url: 'updateEntry.php', data: 'description = '+ newText +' & id = '+ id, succes: functie (resultaten) $ this.ouder (). parent (). find (' p '). empty (). append (newText);); ); return false; ); );

Als u terugkeert naar onze markup op index.php, ziet u:

 
D E

Elke lijn decoderen

 $ ('. editEntry'). klik (functie () 

Met jQuery moeten we luisteren wanneer op de ankertag met een klasse "editEntry" wordt geklikt.

 var $ this = $ (this);

Vervolgens cachen we $ (dit) - wat verwijst naar de ankertag waarop is geklikt.

 var oldText = $ this.parent (). parent (). find ('p'). text ();

We moeten de originele beschrijving opslaan. We vertellen de ankertag om de bovenliggende div te vinden en zoeken naar de p-tag, waarin de beschrijvende tekst staat. We pakken die waarde met behulp van "text ()".

 var id = $ this.parent (). parent (). find ('# id'). val ();

Om de juiste rij in onze database bij te werken, moet ik weten wat de id van die specifieke rij is. Als u teruggaat naar uw code, ziet u een verborgen invoerveld met deze waarde.

 

Nogmaals gebruiken we "find" om toegang te krijgen tot deze verborgen invoer en dan de waarde ervan te pakken.

 $ This.parent (). Ouder (). Vinden ( 'p'). Leeg (). Toevoegen ('');

Nu moeten we de gebruiker toestaan ​​een nieuwe beschrijving in te voeren. Dat is de reden waarom ze klikten op "Entry bewerken", is het niet? We vinden de beschrijving van de P-tag, legen deze en voegen een tekstgebied toe. We gebruiken "leeg ()" om ervoor te zorgen dat we alle tekst kwijtraken; het is niet meer nodig. De waarde van dit tekstgebied is voor het gemak gelijk aan de oude tekst.


 $ ('. newDescription'). blur (function () 

Zoek dit nieuwe tekstgebied en voer een functie uit wanneer de gebruiker het tekstvak verlaat.

 var newText = $ (this) .val ();

Leg de nieuwe tekst vast die de gebruikers in dit tekstgebied invoeren.

 $ .ajax (type: 'POST', url: 'updateEntry.php', data: 'description =' + newText + '& id =' + id, success: function (results) $ this.parent (). parent (). vind ('p'). empty (). append (newText););

Roep de .ajax-functie op en geef een paar parameters door. Het type is "POST". De url om toegang te krijgen is "updateEntry.php". De gegevens die moeten worden doorgegeven aan deze pagina zijn de nieuwe tekst die de gebruiker heeft ingevoerd en de unieke id van die rij in de database. Wanneer de update is uitgevoerd, voert u een functie uit en werkt u de oude tekst bij met de nieuwe tekst!

 return false;

Retourneer false om ervoor te zorgen dat klikken op de ankertag de gebruiker niet elders leidt.


Stap 7b: De PHP

Vergeet niet dat we onze 'updateEntry' PHP-pagina met jQuery hebben genoemd, maar we hebben deze niet echt gemaakt! Laten we dat nu doen. Maak een nieuwe pagina met de naam "updateEntry.php" en plak het volgende.

 update_by_id ($ _ POST ['id'], $ _POST ['description']); ?>

Net als voorheen verwijzen we naar onze db-klasse en maken we die vervolgens. Vervolgens maken we een nieuwe variabele aan, $ response genaamd, en maken deze gelijk aan wat wordt geretourneerd door de "update_by_id ()" - methode. We hebben deze methode nog niet gemaakt. Dit is een goed moment om dit te doen.

Een nieuwe methode aan onze klas toevoegen

Keer terug naar je db.php-pagina en voeg onderaan een nieuwe methode toe.

 functie update_by_id ($ id, $ description) $ query = "UPDATE todo SET description =? WHITE id =? LIMIT 1"; if ($ stmt = $ this-> mysql-> prepare ($ query)) $ stmt-> bind_param ('si', $ description, $ id); $ Stmt-> execute (); terug 'goed gedaan! Bijgewerkt '; 

Deze methode accepteert twee parameters: de id en de beschrijving van het item. Dus, als we deze methode noemen, moeten we onthouden om die twee parameters door te geven! We beginnen met het maken van onze query: werk de "todo" -tabel bij en wijzig de beschrijving in alles wat wordt doorgegeven - maar werk alleen de rij bij waarbij het ID gelijk is aan de geparametreerde parameter.

Net als de vorige keer gebruiken we voorbereide instructies om onze database bij te werken. Het is de veiligste manier! Bereid onze vraag voor, bind de parameters (string en integer, of 'si') en voer uit. We geven een generieke tekenreeks terug, maar deze is helemaal niet nodig. Nu zou onze update perfect moeten werken!


Stap 8: Verwijder items


Laten we ook een aardige asynchrone manier creëren waarop de gebruiker vermeldingen kan verwijderen. Wanneer ze op de verwijderknop voor een item klikken, vervagen we de div-out en werken we de database bij met de verwijdering. Open uw JavaScript-bestand en voeg het volgende toe:

 // Verwijder anchor-tag geklikt $ ('a.deleteEntryAnchor'). Klik (functie () var thisparam = $ (this); thisparam.parent (). Parent (). Find ('p'). Text ('Please Wacht ... '); $ .ajax (type:' GET ', url: thisparam.attr (' href '), succes: functie (resultaten) thisparam.parent (). Parent (). FadeOut (' slow ') ;) return false;);

decodering

 $ ('a.deleteEntryAnchor'). klik (functie () 

Wanneer op het ankertag met een klasse van "deleteEntryAnchor" wordt geklikt, voert u een functie uit.

 var thisparam = $ (this);

Cache $ (this) as thisparam.

 thisparam.parent (). parent (). find ('p'). tekst ('Even geduld ...');

Verander de tekst van de beschrijving in "Please Wait". We moeten dit doen om de gebruiker feedback te geven, voor het geval het langer duurt dan verwacht.

 $ .ajax (type: 'GET', url: thisparam.attr ('href'), success: function (results) thisparam.parent (). parent (). fadeOut ('slow');)

Net als de vorige keer geven we een paar parameters door die toegang hebben tot "delete.php". In plaats van de pagina hard te coderen in de waarde van de URL, krijg ik toegang tot attr ('href') - wat gelijk is aan 'delete.php? Id = $ id'.

 D

We hebben geen "DATA" -parameter nodig, omdat alle relevante informatie binnen de querystring van de url valt. Nadat de verwijdering met succes is uitgevoerd, vinden we de bovenliggende '.item' div en vervagen deze langzaam.

delete.php

We hebben onze verwijderpagina met jQuery genoemd, maar we hebben de PHP nog niet gemaakt. Maak je nieuwe pagina en voeg de volgende code toe.

 delete_by_id ($ _ GET [ 'id']); header ("Locatie: index.php");

Je zou nu aan deze procedures gewend moeten zijn. Maak een nieuw exemplaar van onze klasse en noem de methode "delete_by_id". Zodra dat is voltooid, stuurt u de gebruiker terug naar 'index.php'. Zoals je misschien al geraden hebt, moeten we een nieuwe methode maken binnen onze db-klasse. Ga terug naar db.php en voeg je nieuwe functie toe.

Delete_by_id () Methode

 function delete_by_id ($ id) $ query = "DELETE from to WHERE id = $ id"; $ result = $ this-> mysql-> query ($ query) of dood ("er was een probleem, man."); als ($ resultaat) 'ja' retourneert; 

Deze methode accepteert één parameter - de id. Let op: om een ​​rij bij te werken, MOETEN we de unieke ID van die rij weten. Anders wordt elke rij bijgewerkt. We verwijderen alle rijen uit de tabel, waarbij de ID gelijk is aan wat wordt doorgegeven. Omdat elke rij zijn eigen unieke ID heeft, is er maar één beïnvloed. Vervolgens geven we deze query door aan ons mysql-object. Nogmaals, het rendement is niet nodig; het is gewoon voor de lol.


Stap 9: Extra jQuery

We hebben al ons PHP-werk voltooid! De laatste stap is om een ​​beetje jQuery toe te voegen om alles net iets beter te laten werken. Bovenaan je Javascript-bestand, voeg net na de document.ready-methode de volgende code toe:

 // Geef het tabblad addNewEntry niet weer wanneer de pagina wordt geladen. $ ('# addNewEntry'). css ('display', 'none'); // We gebruiken jQuery om onze tabbladen te maken. Als Javascript is uitgeschakeld, werken ze niet. Als we dit in overweging nemen, moeten we onze tabbladen toevoegen, zodat ze niet worden weergegeven als ze zijn uitgeschakeld. $ ( '# Tabs'). Toevoegen ('
  • Nieuw item
  • '); // Verberg de beschrijving voor elk taakitem. Toon alleen de h4-tag voor elke tag. $ ( 'Div.item') kinderen () niet ( 'H4') te verbergen ()...; // Het gehele item div is klikbaar. Om die feedback te geven, veranderen we de cursor van de muis. // Wanneer op deze div wordt geklikt, schakelen we de weergave van zichtbaar naar verborgen telkens wanneer erop wordt geklikt. // Wanneer de gebruiker echter op de knop "update" klikt, wordt de div gesloten wanneer deze binnen het tekstgebied // klikt om zijn beschrijving te bewerken. Deze code detecteert of het doelwit van de klik het tekstgebied was. Als dat zo was, // doen we niets. $ ('div.item'). css ('cursor', 'pointer'). klik (functie (e) if (! $ (e.target) .is ('textarea')) $ (this). children (). niet ('h4'). slideToggle (); $ (this) .children ('h4'). toggleClass ('expandDown'););

    Ik heb elke stap redelijk goed becommentarieerd. Dus, ik zal mezelf niet herhalen. Uw uiteindelijke scripts.js-bestand zou er als volgt uit moeten zien.

     $ (function () // Het tabblad addNewEntry niet weergeven wanneer de pagina wordt geladen. $ ('# addNewEntry'). css ('display', 'none'); // We gebruiken jQuery om onze tabbladen te maken Als Javascript is uitgeschakeld, werken ze niet. Als we dit in overweging nemen, moeten we onze tabbladen toevoegen, zodat ze niet worden weergegeven als ze zijn uitgeschakeld. $ ('# Tabs').
  • Nieuw item
  • '); // Verberg de beschrijving voor elk taakitem. Toon alleen de h4-tag voor elke tag. $ ( 'Div.item') kinderen () niet ( 'H4') te verbergen ()...; // Het gehele item div is klikbaar. Om die feedback te geven, veranderen we de cursor van de muis. // Wanneer op deze div wordt geklikt, schakelen we de weergave van zichtbaar naar verborgen telkens wanneer erop wordt geklikt. // Wanneer de gebruiker echter op de knop "update" klikt, wordt de div gesloten wanneer deze binnen het tekstgebied // klikt om zijn beschrijving te bewerken. Deze code detecteert of het doelwit van de klik het tekstgebied was. Als dat zo was, // doen we niets. $ ('div.item'). css ('cursor', 'pointer'). klik (functie (e) if (! $ (e.target) .is ('textarea')) $ (this). children (). niet ('h4'). slideToggle (); $ (this) .children ('h4'). toggleClass ('expandDown');); // nieuw itemtabblad toevoegen klik $ ('# tabs li'). klik (functie () $ ('# tabs li'). removeClass ('selected'); $ (this) .addClass ('selected'); if ($ (this) .attr ('id') == 'newitem_tab') $ ('# todo'). css ('display', 'none'); $ ('# addNewEntry'). css (' display ',' block '); else $ (' # addNewEntry '). css (' display ',' none '); $ (' # todo '). css (' display ',' block '); return false;); $ ('# todo div: first'). children ('h4'). addClass ('expandDown'). end (). children (). show (); // Verwijder anchor-tag geklikt $ ('a.deleteEntryAnchor'). Klik (functie () var thisparam = $ (this); thisparam.parent (). Parent (). Find ('p'). Text ('Please Wacht ... '); $ .ajax (type:' GET ', url: thisparam.attr (' href '), succes: functie (resultaten) thisparam.parent (). Parent (). FadeOut (' slow ') ;) return false;); // Bewerk een item asynchroon $ ('. EditEntry'). Klik (functie () var $ this = $ (this); var oldText = $ this.parent (). Parent (). Find ('p'). text (); var id = $ this.ouder (). parent (). find ('# id'). val (); console.log ('id:' + id); $ this.parent (). parent () .Vind ( 'p'). leeg (). voegen (''); $ ('. newDescription'). blur (function () var newText = $ (this) .val (); $ .ajax (type: 'POST', url: 'updateEntry.php', data: 'description = '+ newText +' & id = '+ id, succes: functie (resultaten) $ this.ouder (). parent (). find (' p '). empty (). append (newText);); ); return false; ); );

    Stap 10: Wacht! de lay-out is raar in IE6.

    We kunnen het nog geen dag noemen! Die leuke 'ole Internet Explorer 6 zorgt voor een paar layoutproblemen.


    1. De pngs op de achtergrond zijn 24 bit. IE6 ondersteunt dit niet standaard. We moeten een script importeren om het te repareren.
    2. De navigatietabs worden niet op de juiste plek weergegeven.
    3. Elk div.item wordt niet correct weergegeven als het is uitgevouwen.
    4. Onze knoppen voor bewerken en verwijderen staan ​​te ver rechts van onze div.

    De oplossing

    Hoewel we het misschien leuk vinden, kunnen we deze browser nog niet negeren. Gelukkig zul je merken dat de meeste IE6-problemen vrij eenvoudig kunnen worden opgelost. Ten eerste moeten we een script importeren dat ons probleem met alpha-transparantie oplost. Dean Martin heeft een fantastisch Javascript-bestand dat IE6 voldoet aan de standaarden. Eenvoudig door "-trans" toe te voegen aan het einde van onze 24-bits png-bestandsnamen, kunnen we ons probleem oplossen. Zorg ervoor dat u de afbeeldingenmap bezoekt en de namen bewerkt.

     

    Het CDN van Google komt weer tot de redding door een gehoste versie van het IE7-script aan te bieden. Dat lost ons transparantieprobleem op, maar we hebben nog een paar eigenaardigheden.


    Merk op dat we in onze voorwaardelijke verklaring ook een "ie.css" -bestand importeerden. Maak dat bestand nu meteen en plak het volgende in:

     body marge: 0; opvulling: 0;  #tabs height: 100%;  #main height: 100%;  #main div.item width: 100%; overloop verborgen; positie: relatief; 

    U zult merken dat het toevoegen van "positie: relatief", "overloop: verborgen" en "hoogte: 100%" 90% van uw IE6-problemen zal oplossen. Nu werkt onze lay-out perfect in alle browsers!


    U bent klaar!


    Er was VEEL om hier te dekken. Hopelijk heb ik mezelf grondig genoeg uitgelegd. Zo nee, daar is de bijbehorende screencast voor! Zorg ervoor dat u deze bekijkt om wazige gebieden te verwijderen. Als je nog vragen hebt, vraag het me gewoon! Heel erg bedankt voor het lezen.