JQuery, Ajax & diverse ID's.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ijstheefles
  • Registratie: December 2011
  • Laatst online: 25-08 22:56
Hoi tweakers,

Ik heb een 20 tal items in een lijst staan, waarna er een up of downvote gedaan kan worden op ieder item in de lijst.

In zijn huidige vorm heb ik simpelweg de id's laten genereren (downvote_(id_van_list_item_hier)) en vervolgens dit ook voor de gehele jquery. Probleem is dat je dan wel zon enorme bak met jquery krijgt die 20x hetzelfde is.

Als ik op google zoek kom ik alleen de live functie tegen, alleen kom ik hier niet tegen hoe ik dynamisch id's kan invoegen.

Kunnen jullie misschien een hint geven? Welke functie gebruik ik hier het beste voor?

Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 12-09 14:10
Je hebt in html5 het data- attribuut. Dus je kan hem een class geven (btn_downvote) en dan het attribuut data-id="12" bijvoorbeeld (of met jQuery .data('id', 12))
Dan hang je de actie aan .btn_downvote, en kan je met jQuery bekijken welk id het is; http://api.jquery.com/data/#data-html5

Acties:
  • 0 Henk 'm!

  • Rickets
  • Registratie: Augustus 2001
  • Niet online

Rickets

Finger and a shift

Het principe van je aanpak is inderdaad niet efficiënt. Je kan beter gebruik maken van de selector- en event-mogelijkheden van jQuery. Dit houdt in dat je een generieke functie schrijft die het stemmen uitvoert met Ajax, en deze aanroept op het moment dat iemand op het juiste element klikt.

Zoals Barryvdh al aangeeft, kan je data-attributes gebruiken om het ID uit te lezen.
Voor de eventhandler kan je het best de on-functie gebruiken, omdat de live-functie deprecated is sinds jQuery 1.7.

Voor een klein werkend voorbeeld, zie http://jsfiddle.net/yv5pk/

If some cunt can fuck something up, that cunt will pick the worst possible time to fucking fuck it up, because that cunt’s a cunt.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Rickets schreef op dinsdag 13 november 2012 @ 12:33:
Het principe van je aanpak is inderdaad niet efficiënt. Je kan beter gebruik maken van de selector- en event-mogelijkheden van jQuery. Dit houdt in dat je een generieke functie schrijft die het stemmen uitvoert met Ajax, en deze aanroept op het moment dat iemand op het juiste element klikt.
Even [google=jquery delegate]. Dat (en dit en dit) maakt een hoop duidelijk denk ik.

[ Voor 13% gewijzigd door RobIII op 13-11-2012 12:38 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Als toevoeging op de rest: gebruik dan meteen on() en niet delegate() of live() of bind().
on() vervangt de andere varianten vanaf de nieuwste jquery variant. In de volgende versie van jquery vervallen de andere drie.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Geerrrt
  • Registratie: Juli 2008
  • Laatst online: 11-09 13:27
HTML:
1
2
3
4
<ul class="votelist">
   <li data-id="1">Tekst 1</li>
   <li data-id="2">Tekst 2</li>
</ul>


JavaScript:
1
2
3
$(".votelist").on("click", "li", function(e){
    alert($(this).data("id"));
});


De rest moet je zelf wel uitkomen ;-)

[ Voor 13% gewijzigd door Geerrrt op 13-11-2012 15:53 ]

Eury#2434


Acties:
  • 0 Henk 'm!

  • phex
  • Registratie: Oktober 2002
  • Laatst online: 12-09 11:42
+1 voor GeertJam, dat is inderdaad de correcte manier.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 09:18

Creepy

Tactical Espionage Splatterer

(jarig!)
En alsnog even een tikje door naar Webdesign, Markup & Clientside Scripting

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Ijstheefles
  • Registratie: December 2011
  • Laatst online: 25-08 22:56
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div class='voting'>
      <div class='downvoting'>
             <div class='downvotes_count_idvanitem'>3</div>
             <form id='id_van_item' class="downvote_form" action="path_naar_controller" method="post">
                  <input type='submit' class='downvote' value='' />
              </form>
       </div>
       <div class='upvoting'>                    
               <div class='upvotes_count_idvanitem'>3</div>
               <form id='id_van_item' class="left upvote_form" action="path_naar_controller" method="post">
                       <input type='submit' class="upvote" value='' />
                </form>
        </div>
</div>


Samen met:

JavaScript:
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
$(".downvoting").on('submit', '.downvote', function(e){
        e.preventDefault();

        var item = $(this).closest('.downvote_form');

        //get the url for the form
        var url= item.attr("action");

        alert(item.attr('id') "  " + url);
        //start send the post request
        $.post(url,{},function(data){
            //the response is in the data variable
            var id = item.attr('id');
            alert(data.downvotes);
            if(data.responseCode==200 ){
                $('.downvotes_count_' + id).html(data.downvotes);
                $('.downvotes_count_' + id).css("color","green");
            }
            else if(data.responseCode==400){//bad request
                $('.downvotes_count_' + id).html(data.downvotes);
                $('.downvotes_count_' + id).css("color","red");
            }
            else{
                alert("An unexpeded error occured.");

                $('.downvotes_count_' + id).html(data);
            }
        });
        return false;
    });


- Prevent default werkt niet meer. In de jsfiddle wel. ( deze

Ik zal even uitleggen wat ik denk dat hier gebeurt, waarbij ik me voor nu even toeleg op downvotes. Als die eenmaal werken is upvotes geen werk meer.

- Zet op iedere .downvoting div (die dus de form + submit knop wrapped) een listener. Op het moment dat er geklikt wordt op de .downvote submit knop, ga dan niet naar de action url uit het form (e.preventDefault() ) maar haal het form op wat gesubmit is en haal hier de url van op.

Post vervolgens naar die url, en haal dan het id op van het form.

Gebruik die id om downvotes_count bij te werken (in de goede regel, waar we dus het id voor nodig hebben).

Waar ga ik fout?

Ik zie namelijk geen verschil in structuur verder met de js fiddle.

Enige wat nog anders is is dat in de fiddle mijn .downvoting vaker dan 1x voorkomt in de html. (per rij 1 x ),
in de eerdere gelinkte webpagina met daarin de verschillen tussen delegate() live() on() etc. ([url="http://www.elijahmanor.com/2012/02/differences-between-jquery-bind-vs-live.html]deze [/url]) word er in iedergeval niet als potentieel probleem over gesproken.

Mis ik iets, of waren ze bij JQuery te lui om ook meervoudige aanwezigheid af te handelen? ;x

Heb overigens zowel 'submit' als 'click' geprobeerd.

[edit] Geloof dat ik en JQuery een haat-relatie tegemoet gaan. Nog nooit iets in 1x werkend gehad =P :+ (nog steeds niet trouwens)

Acties:
  • 0 Henk 'm!

  • Rickets
  • Registratie: Augustus 2001
  • Niet online

Rickets

Finger and a shift

.downvoting is een div, dus die heeft geen submit-event. Dat event wordt niet uitgevoerd en bubblet ook niet omhoog.

Verander de on-aanroep naar dit:

JavaScript:
1
2
3
$( '.downvoting form' ).on( 'submit', function(e){
   // ...
});


De closest-aanroep op regel 4 kan dan ook weg, omdat this al verwijst naar het formulier:

JavaScript:
1
var item = $(this);


En op regel 9 voer je iets uit dat geen geldige syntax heeft (er moet een + bij):
JavaScript:
1
alert(item.attr('id') + '  ' + url); 


Wat algemene tips:
  • Je leest het ID van het item uit op het moment dat de post naar de server al is uitgevoerd. De ID komt niet op de server terecht, dus die moet je in de post-request verwerken (hetzij via data, hetzij via de URL).
  • Je kan success- en error-functies gebruiken in combinatie met de jQuery post-functie (zie de documentatie). Dan hoef je niet zelf statuscodes uit te lezen.
  • Probeer je code consistent te houden. Het leest bijvoorbeeld prettiger als je kiest voor alleen enkele quotes, of alleen dubbele.
  • Als je de code slim schrijft, kan je dezelfde functie gebruiken voor zowel up- als downvoting.

If some cunt can fuck something up, that cunt will pick the worst possible time to fucking fuck it up, because that cunt’s a cunt.


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Ipv twee forms voor iedere up/downvote, kun je ook een form om de helelijst met items-om-op-te-voten heen zetten, en dan de knoppen een name-attribuut geven (btw, een <button> is flexibeler te stylen). Dan heb je geen data-id nodig, en omdat het normale submits zijn, werkt het zonder javascript ook.

日本!🎌

Pagina: 1