Avatar billede AnyFellow Mester
17. januar 2012 - 11:01 Der er 25 kommentarer og
1 løsning

Ajax - sende oplysninger med ved klik

Jeg sidder lidt og leger lidt med en idé til en indkøbskurv.

Jeg har følgende kode:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.0/jquery.min.js"></script>

<a id="refresh" href="#">click</a>

<script>
    $(function() {
      $("#refresh").click(function(evt) {
          $("#loaddiv").load("test2.html")
          evt.preventDefault();
      })
    })
</script>

<br><br>

<div id="loaddiv" style="background-color:#ff0000; width:100px; height:100px;">
</div>


Hvordan kan jeg ændre ovenstående således at jeg kan lave f.eks. 100 links der hver især kalder test2.html med forskellige værdier, f.eks:
"test2.html?value1=123&value2=222&value3=444"

Antallet af værdier er ens for alle link, og altid kendt på forhånd.
Avatar billede jokkejensen Novice
17. januar 2012 - 11:58 #1
<a class="refresh" href="test2.html?value=xxx&value2=xxx&value3=xxx">click</a>

<a class="refresh" href="test2.html?value=yyy&value2=yyy&value3=yyy">click2</a>

<script>
    $(function() {
      $(".refresh").click(function(evt) {
          evt.preventDefault();
          $("#loaddiv").load($(this).attr('href'))
      })
    })
</script>
Avatar billede AnyFellow Mester
17. januar 2012 - 13:26 #2
Vil ovenstående ikke resultere i en refresh af hele siden, eller er skal "evt.preventDefault" forhindre dette?

Jeg vil gerne undgå at brugere uden javascript ikke bliver sendt til test2.html, men at der i stedet ikke sker noget.
Avatar billede olebole Juniormester
17. januar 2012 - 15:17 #3
<ole>

Nej, evt.preventDefault() 'dræber' event'en

/mvh
</bole>
Avatar billede jokkejensen Novice
17. januar 2012 - 16:14 #4
Jo brugere uden javascript vil ryge til test2.html

Men i moderne web udvikling kan man næææææsten formode at de har JS på. Alternativt bruger du bare en anden attribut, det virker bare uhensigtsmæssigt.


<a class="refresh" rel="test2.html?value=yyy&value2=yyy&value3=yyy" href="#">click2</a>

<script>
    $(function() {
      $(".refresh").click(function(evt) {
          evt.preventDefault();
          $("#loaddiv").load($(this).attr('rel'))
      })
    })
</script>
Avatar billede olebole Juniormester
17. januar 2012 - 16:35 #5
@jokkejensen: Jeg ved godt, at den 'attribute abuse' er vældig trendy, men det kan næppe anbefales, hvis koden ønskes valid  =)
Avatar billede AnyFellow Mester
17. januar 2012 - 19:11 #6
olebole...> Er der et alternativ til at gøre det sådan?
Avatar billede olebole Juniormester
17. januar 2012 - 19:27 #7
Ja, man kan vel bare skrive:


<a class="refresh" rel="test2.html?value=yyy&value2=yyy&value3=yyy" href="#">click2</a>

<script type="text/javascript">
    $(function() {
      $(".refresh").click(function(evt) {
          evt.preventDefault();
          $("#loaddiv").load($(this).attr('href'))
      })
    })
</script>

<a class="refresh" href="test2.html?value=yyy&value2=yyy&value3=yyy">click2</a>
Avatar billede olebole Juniormester
17. januar 2012 - 19:28 #8
- men det er ganske utestet  =)
Avatar billede olebole Juniormester
17. januar 2012 - 19:29 #9
- og slet første linje. Den skal naturligvis ikke med  :D
Avatar billede AnyFellow Mester
17. januar 2012 - 19:48 #10
olebole...> Er det ikke magen til det forslag du sagde ikke overholdt standard?

Jeg har observeret noget jeg ikke ved hvordan jeg skal håndtere.

Jeg har lavet ovenstående, således at når der klikkes hentes indholdet af test.php. Dette fungerer. Output af test.php vil stige med 1, hver gang der klikkes, men det ser ud som om at indholdet caches, således at der altid vises det samme. Kan jeg gøre noget for at dette ikke sker?
Avatar billede AnyFellow Mester
17. januar 2012 - 19:49 #11
olebole...> Glem min sidste kommentar til dig. Det jeg mente var at den ikke ville løse mit ønske om at test2.html ikke blev åbnet hvis brugeren ikke har javascript aktiveret.
Avatar billede olebole Juniormester
17. januar 2012 - 19:53 #12
Nej, så de to japanere, der ikke har JS aktiveret ryger videre. Har du nogen reelle problemer, vi kan løse?  =)

Hvad med søgemskinerne? Skal de kunne finde indholdet?
Avatar billede AnyFellow Mester
17. januar 2012 - 19:56 #13
olebole...> Nej, der er ikke noget for søgemaskinerne at indeksere.


Har du nogen idé om hvordan jeg kan løse cache-problemet?
Avatar billede olebole Juniormester
17. januar 2012 - 20:12 #14
Nej, ikke med jQuery. Man kan sikkert skrive noget à la:

$("#loaddiv").load($(this).attr('href')+"&u="+new Date().getTime())

- men det er ikke nogen køn løsning!

Så vidt jeg ved, har jQuery noget anti-cache-halløj, men der er jokkejensen mere vidende end jeg  =)
Avatar billede AnyFellow Mester
17. januar 2012 - 21:10 #15
Jeg faldt over denne:

$(\"#loaddiv\").load($(this).attr('href'))


ændres til

$(\"#loaddiv\").load($(this).attr('href')+'&test'+Math.random()*Math.random())


...men ved ikke om der er en anden mere "stueren" løsning?
Avatar billede olebole Juniormester
17. januar 2012 - 21:18 #16
Ja, det er stortset det samme som min i #14, men den er ikke så køn  =)
Avatar billede olebole Juniormester
17. januar 2012 - 21:22 #17
Bruger man jQuery's ajax metode, kan man vist skrive noget à la:

ajaxSetup(
    {cache:false}
);

- men det tror jeg ikke har indflydelse med den fremgangsmåde, du bruger
Avatar billede AnyFellow Mester
18. januar 2012 - 07:40 #18
jokkejensen og olebole...>
Tak for deltagelse i tråden. Læg et svar og der er point på vej.
Avatar billede jokkejensen Novice
18. januar 2012 - 08:29 #19
Ole >> #5, Nej men nu ønsker han jo ikke at de skal ind på siden. Men enig.

Kfisker >> Hvis du vil løse det korrekt skal du jo lade test2.html håndtere brugere uden javascript, altså smide en parameter med om det er asynkront eller ej.

cache:false, sætter også bare time.toticks() på i ajaxSetup, men tror ikke jQuery.load tager de globale ajaxsettings med, men hvorfor ikke også bare bruge ajax i stedet:

<script type="text/javascript">
    $(function() {
      $(".refresh").click(function(evt) {
          evt.preventDefault();
          //$("#loaddiv").load($(this).attr('href'))
          $.ajax({
  url: $(this).attr('href'),
datatype: "html",  success: function(data){
$("#loaddiv").html(data)
  }
});
      });
    });
</script>
Avatar billede jokkejensen Novice
18. januar 2012 - 08:29 #20
svar
Avatar billede olebole Juniormester
18. januar 2012 - 14:58 #21
Jokke, er der ikke noget med, at jQuery's ajax kan modtage en option cache:false (jeg tænker her på ajax - ikke på ajaxSetup)?

Nu er der næppe én PPM, der har slået JS fra, og de er 'alle otte' vandt til, at WWW for dem ikke er meget større, end det var i 1994  =)
Avatar billede jokkejensen Novice
18. januar 2012 - 15:24 #22
jo den glemte jeg bare, med cache:false, sætter den også bare som du foreslog en get parameter på ved ex test2.html vil kaldet hedde

test2.html?_=XXXXXXXXXX

Jeg gætter hurtigt på at XXXXXXXX er svarer til new Date.valueOf();

formodentligt ticks eller sec's siden 1970 :)

/J
Avatar billede jokkejensen Novice
18. januar 2012 - 15:25 #23


{url : "test2.html" + new Date.valueOf(); }

svarer til

{url : "test2.html", cache: false}
Avatar billede olebole Juniormester
18. januar 2012 - 15:30 #24
Ja, jeg ved godt, der ikke er andre muligheder fra klienten. At jeg anfægtede koden #14 (og #15), skyldes udelukkende 'pænhed'. Selvom der sker det samme 'bag fortæppet', ser cache:false pænere og mere overskueligt ud  =)
Avatar billede AnyFellow Mester
20. januar 2012 - 08:16 #25
olebole...> Skal jeg betragte dit manglede svar, som et tegn på at du ikke ønsker point?
Avatar billede olebole Juniormester
20. januar 2012 - 14:50 #26
Ja, det kan du roligt. Jeg har ikke modtaget point det seneste årstid - men tak for tanken  *o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester