Tuesday, September 30, 2008 10:45 PM Vimpyboy

Utnyttja jQuery för enkla Ajax-anrop

Med jQuery så kan man på ett otroligt smidigt sätt använda Ajax. Jag kommer att gå igenom hur man gör för att skriva en enkel sida som hämtar in olika sidor med Ajax-anrop, samtidigt som den gamla texten suddas bort med en animering.

När man använder javascript - och därmed jQuery – så bör man alltid se till så att koden är semantiskt korrekt innan man applicerar javascripten. Koden bör vara så ren som möjligt och HTML-koden bör innehålla just HTML och inget annat.

HTML-koden jag kommer att använda ser ut som sådan:

   1:  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   2:  <html xmlns="http://www.w3.org/1999/xhtml">
   3:  <head>
   4:      <title>jQuery Demo</title>
   5:      <link href="style.css" rel="Stylesheet" type="text/css" />
   6:      <script src="scripts/jquery-1.2.6.js" type="text/javascript"></script>
   7:      <script src="scripts/menu.js" type="text/javascript"></script>
   8:  </head>
   9:  <body>
  10:      <div id="mainContainer">
  11:          <h1>
  12:              jQuery Demo
  13:          </h1>
  14:          <ul id="menu">
  15:              <li><a href="#" class="menu-startpage">Startsidan</a></li>
  16:              <li><a href="#" class="menu-aboutme">Om mig</a></li>
  17:              <li><a href="#" class="menu-other">Annat</a></li>
  18:          </ul>
  19:          <div id="main">
  20:          </div>
  21:      </div>
  22:  </body>
  23:  </html>

Det är alltså helt vanlig XHTML. Jag har inga javascript eller annat i koden, utan allt kommer att läggas i menu.js.

Det vi kommer att göra i javascriptet är att vi kommer att sätta ett onclick-event på alla länkar under #menu li där vi använder klassnamnet för att visa vilken sida som skall hämtas. När vi sedan klickar på en länk så kommer div-elementet med id:t “main” att försvinna med en animering, fyllas på med HTML genom ett Ajax-anrop och sedan visas igen med en liknande animering.

Javascriptet i sin helhet ser ut på detta sätt:

   1:  $(document).ready(function() { Initialize(); });
   2:   
   3:  function Initialize() {
   4:      SetupMenu();
   5:      $('#main').hide();
   6:      $('.menu-startpage').click();
   7:  }
   8:   
   9:  function SetupMenu() {
  10:      $('#menu li a').click(function() { LoadPage(this); });
  11:  }
  12:   
  13:  function LoadPage(e) {
  14:      var page = e.className.split(' ')[0];
  15:      $('#menu li a').removeClass('active');
  16:      $(e).addClass('active');
  17:      $.ajax({
  18:          method: "get",
  19:          url: "LoadPage.aspx",
  20:          data: "page=" + page,
  21:          beforeSend: function() { $('#main').hide('slow').fadeOut(); },
  22:          complete: function() { $('#main').show('slow').fadeIn(); },
  23:          success: function(result) { $("#main").html(result); }
  24:      });
  25:  }

Vi börjar med att anropa metoden Initialize() när DOM:en är redo för förändringar. Som jag har skrivit i ett tidigare blogginlägg så är det inte detsamma som window.load då den sistnämnde även väntar på att alla bilder och annat skall laddas.

I Initialize() så börjar vi med att köra metoden SetupMenu() där vi sätter ett onclick-event på alla länkar under #menu li. När användaren klickar på en länk så skall LoadPage(e) köras där e är en referens till elementet. Efter det så gömmer vi div-elementet då vi inte har någon information att visa än, och efter det trigga click-eventet för startsidan så att den skall laddas in när besökaren går till sidan.

Än så länge är det inga konstigheter, utan det är just när användaren klickar på en länk som det magiska sker. Det som händer då är att LoadPage(e) körs, och där så börjar vi med att plocka fram första klassen för elementet då den aktuella länken blir tilldelad klassnamnet “active”. Sedan tar vi bort klassen “active” från alla länkar för att kunna sätta den igen på länken som det har klickats på.

Nästa steg är att köra ajax-metoden. jQuery har en metod som heter just ajax och som tar emot en anonym funktion. I den funktionen som i själva verket är en Json-sträng anger vi olika properties för Ajax-anropet. Att tilldela properties på detta sätt är standard i jQuery och används av de flesta funktioner där. Det går även att använda när man skriver egna funktioner för jQuery.

De metoder vi använder här är:

  • method – Anger vilken metod som skall användas vid anropet. Vi använder här get, men skulle lika gärna kunna använda post.
  • url – URL till sidan som skall anropas. Här anropar vi LoadPage.aspx som returnerar olika texter beroende på vad som skickas in till sidan. Det här kan vara vilken typ av sida som helst, och returnera antingen HTML, XML eller Json. Sedan tar jQuery hand om outputen och parse:ar den om så behövs.
  • data – Här anger vi datan som skall skickas. Då vi kör med get som metod så skickas den som en querystring till sidan som vi har angett.
  • beforeSend – Funktion som skall köras innan datan skickas. Här gömmer vi undan den gamla informationen med dels hide(‘slow’) som “viker ihop” elementet, och sedan fadeOut() som gör att opaciteten sänks för elementet.
  • complete – Det här körs när datan är hämtad. Här väljer vi att visa div-elementet igen på samma sätt som vi nyss gömde det på.
  • success – När vi har hämtat datan så kör vi en funktion som tar emot datan som parameter. Det vi gör här är att sätta HTML-koden för elementet genom metoden html().

När vi nu kör sidan så kommer den att ladda in startsidan och sedan visa informationen där. När vi sedan klickar på en länk så försvinner den gamla informationen samtidigt som den nya laddas in och sedan visas. Vi kan alltså med så lite som 25 rader kod göra ett Ajax-anrop och dessutom animera div-elementet och sätta klasser på länkarna! Det här är en av anledningarna till varför jQuery har blivit så populärt bland utvecklare som det är, och det är dessutom anledningen till varför Microsoft valde att ha med detta i de kommande versionerna av ASP.NET.

Jag har även lagt upp ett demo där du kan se hur det fungerar.

Filed under: ,

Comments

# Hämta ett InfoCard med Javascript

Thursday, October 02, 2008 1:05 PM by Mikael Söderström

Jag har tidigare visat hur vi med Windows CardSpace kan posta ett InfoCard till servern i form av XML

# re: Utnyttja jQuery för enkla Ajax-anrop

Wednesday, October 22, 2008 9:29 AM by Stefan Bergfeldt

Hur gör du för att jobba mot en ASP.NET WebService? Är det lika enkelt?

# re: Utnyttja jQuery för enkla Ajax-anrop

Tuesday, October 28, 2008 4:00 AM by Vimpyboy

Web Services i ASP.NET har stöd för GET-anrop, kika på det. Annars så finns det i ASP.NET Ajax bra stöd för det som du kan använda tillsammans med jQuery.

/Mikael

# re: Utnyttja jQuery för enkla Ajax-anrop

Thursday, May 28, 2009 6:40 PM by Rubart

Finns det någon lösning för att länka till java så att den laddar om main, om länken ska ligga i LoadPage?

# re: Utnyttja jQuery för enkla Ajax-anrop

Friday, May 29, 2009 2:19 AM by Vimpyboy

Hej,

Jag förstår inte riktigt vad du menar?

/Mikael Söderström

# re: Utnyttja jQuery för enkla Ajax-anrop

Friday, May 29, 2009 8:39 AM by Rubart

Hej, och ursäkta, jag formulerade mig dåligt.

Vad jag försöker göra är att ersätta iframes eller includes genom den kod som du har skrivit.

Problemet jag har är att jag kan inte få de länkar som jag lägger i LoadPage.asp att gå genom JQuery och uppdatera den div som de ligger i (id:main). Iställer uppdaterar de hela sidan.

Kan vara jag som har sett fel användningsområde för det här scriptet, försöker bara hitta en ersättning för det include-system jag använder nu.

Tack på förhand

# re: Utnyttja jQuery för enkla Ajax-anrop

Friday, May 29, 2009 8:47 AM by Vimpyboy

Hej,

Jag misstänker att du har gjort fel med länkarna. Vart pekar dem? Skapa gärna en tråd på http://www.aspsidan.se med kodexempel och gärna en exempelsida.

/Mikael Söderström

# re: Utnyttja jQuery för enkla Ajax-anrop

Friday, May 29, 2009 8:55 AM by Rubert

Hej igen, och ursäkta för min tidigare fråga, jag löste det.

Har inte jobbat så mycket med javascript förut, men märkte att det var så simpelt som "onclick="LoadPage(this)"".

Tack för ett bra script!

# re: Utnyttja jQuery för enkla Ajax-anrop

Friday, May 29, 2009 10:02 AM by Vimpyboy

Hej,

Jag misstänker att problemet låg i SetupMenu().

Hur ser din HTML ut? Det går att ha onclick, men det är inte det snyggaste sättet att lösa det på. :-)

# re: Utnyttja jQuery för enkla Ajax-anrop

Friday, May 29, 2009 10:29 AM by Rubart

Hej, jag skapade en tråd på aspsidan.se, det blev dock lite rörigt;

www.aspsidan.se/default.asp

Endast tagit med koden som jag har ändrat (LoadPage.aspx), det mesta är den kod som du har förklarat här.

# re: Utnyttja jQuery för enkla Ajax-anrop

Friday, May 27, 2011 12:47 PM by weblogs.asp.net

Utnyttja jquery f 246 r enkla ajax anrop.. Nifty :)

# re: Utnyttja jQuery för enkla Ajax-anrop

Monday, September 12, 2011 9:35 AM by Carlos Barrueto

Din fina demo på dev.mikaelsoderstrom.se/.../tabs.aspx finns inte längre!

Leave a Comment

(required) 
(required) 
(optional)
(required)