Hallo,

Zelf heb ik een orderbutton gemaakt met een quantity plus en min knop.
Op de artikelpagina werkt de button prima echter zodra ik mijn design op de artikellijst pagina wil gebruiken gaat het mis. Nu ben ik erachter gekomen wat het probleem is.

Op de artikellijst pagina worden 30 artikelen getoond, zodra je de eerst button aanklikt op de pagina telt hij 30 erbij. Dit komt omdat de id's het zelfde zijn. Hoe kan ik zorgen dat als ik op de plus en min klik dat hij kijkt naar de quantity die daarbij hoort?

Werken met this en hoe verwerk ik dat in mijn code?

html:

<orderit>
<input id="quantity" value="1"/>
<div class="quantity-buttons">
<div id="plus">+</div>
<div class="plus-minus_space"></div>  
<div id="minus">-</div>
</div>
<input name="orderbutton" type="submit" class="orderbutc" value="In winkelwagen" onclick="$.add2cart( 'product_{$article.nr}', 'cart')"></input>
</orderit>



jquery:

$(document).ready(function(){   
//klik element 
$('#plus').click(function(){
    //maak variabel en pak de value
    var quantity_old = $('#quantity').val();
    //string pak eerste gatal
    if ( parseFloat(quantity_old) >= 1 ) {
    //variabel = oude variabel + 1    
    var quantity_new = parseFloat(quantity_old) + 1;
        //value = variabel nieuw
        $('#quantity').val(quantity_new);
        if (quantity_new > 1){
            $("#quantity").fadeIn();
        };
    };
});//einde klik functie 
    
//klik element 
$('#minus').click(function(){
    //maak variabel en pak de value
    var quantity_old = $('#quantity').val();
    //string pak eerste gatal
    if ( parseFloat(quantity_old) >= 2 ) {
    //variabel = oude variabel - 1    
    var quantity_new = parseFloat(quantity_old) - 1;
        //value = variabel nieuw
        $('#quantity').val(quantity_new);
        if (quantity_new < 2){
            $("#quantity").fadeOut();
        };
    };

});//einde klik functie   
    
    $("#quantity").blur(function(){   
    if ($("#quantity").val() < 2){
        $("#quantity").val("1");
        $("#quantity").fadeOut()}
});
}); //einde script


Gr. Jop
Jop geen op 08/05/2015 15:50:57

Dit komt omdat de id's het zelfde zijn.


Id's moeten uniek zijn.
Dit komt omdat de id's het zelfde zijn.

Dit is je probleem: je artikelen hebben geen unieke identificatie (maar maken gebruik van een of ander volgnummer).

Als je aan een uniek product-id kunt refereren heb je dit probleem helemaal niet; het maakt dan immers niet uit op welke pagina dit product staat, of in welke volgorde of positie.
Dat klopt inderdaad. Dat is wat ik in mijn topic al aanga dat de id's het zelfde zijn.
In de onclick staat {$article.nr} dit is een smarty output, deze geeft het artikelid mee.
nu dacht ik dit simpelweg te kunnen realiseren door {$article.nr} in de id te zetten.
Echter jquery pakt de waarde niet van {$article.nr}.

Wat zou ik dan nog kunnen doen? Natuurlijk zou ik een attribuut kunnen maken met het artikelid maar dan weet jquery nog niet om welke element het gaat.


Gr. Jop
Maak van #plus en #minus klasses en gebruik binnen de click functies $(this) om te refereren aan het object waar op geklikt is.

Daarmee is je cart trouwens nog niet up-to-date met dit nieuwe aantal.

[size=xsmall]Toevoeging op 08/05/2015 16:54:35:[/size]

Jop geen op 08/05/2015 16:36:00
Echter jquery pakt de waarde niet van {$article.nr}.

Daar zou ik dan ook eens naar kijken.

de plus en minus heb ik veranderd in klasses.
Opzich snap ik de variable this wel maar hoe pas ik die toe in de code die ik al had?

$(".plus").click(function(){
$(this)....... Nu moet hij dus bij de juiste quantity de hoeveelheid met 1 verhogen.

});

De site is gemaakt met php smarty, de scripts javascript, jquery etc worden tussen de tags gezet.


{literal}
<script> 
je code
</script>
{/literal}

Ik weet verder niets van smarty, maar heb je de documentatie gelezen?

Hier staat:
If you need template tags embedded in a {literal} block, consider using {ldelim}{rdelim} to escape the individual delimiters instead.

Misschien biedt dat soelaas?

Ik zou altijd eerst proberen dit met conventionele middelen op te lossen.

Daarnaast: als alles in een omvattende container zit en/of de opbouw van elementen altijd vast is, kun je prima via jQuery "navigeren" van een button(click) naar het bijbehorende input-veld.

Als je HTML-structuur logisch is opgezet kun je overal bij.

Voorbeeld:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
<style type="text/css">
div.element { display: block; width: 250px; margin: 10px; padding: 10px; border: 1px solid #ffcccc; }
</style>
</head>

<body>
<div class="container">
    <div class="element">
        <input type="text" value="" />
        <button type="button" class="clickme">click</button>
    </div>

    <div class="element">
        <input type="text" value="" />
        <button type="button" class="clickme">click</button>
    </div>

    <div class="element">
        <input type="text" value="" />
        <button type="button" class="clickme">click</button>
    </div>

    <div class="element">
        <input type="text" value="" />
        <button type="button" class="clickme">click</button>
    </div>
</div>

<script type="text/javascript">
//<![CDATA[
$().ready(function() {
    $('button.clickme').click(function() {
        // clear backgrounds
        $('div.container div').css('background-color', '');
        // clear input fields
        $('div.element input').val('');

        // fill background of current clicked div
        $parentDiv = $(this).parent();
        $parentDiv.css('background-color', '#ffcccc');

        // multiple ways to navigate to the input field, this is one
        $input = $parentDiv.find('input');
        $input.val('clicked!');
    });
});
//]]>
</script>
</body>
</html>
Beste Thomas,

Dank voor het meedenken. In de documentatie heb ik die tags over het hoofd gezien, excuses hiervoor.


De opbouw is als volgt:

html:

<form class="ordercontainer" name="product_adding" method="post" action="index.php" id="product_10351">
<input type="hidden" name="artid" value="10351">

<div class="bestelcontainer">
<div class="orderbtnblock">
<input id="quantity" name="quantity" value="1">
<div class="quantity-buttons">
<div id="plus">+</div>
<div class="plus-minus_space"></div>  
<div id="minus">-</div>
</div>
<input name="orderbutton" type="submit" class="orderbutc" value="In winkelwagen" onclick="$.add2cart( 'product_10351', 'cart')">
</div>
</div>
  </form>


Het artikel id waar nu zoals nu bovenstaand 10351 staat word door smarty(php) neergezet
{$article.nr}
Uhm, en wat is nu het probleem?
Als je voor je buttons ids gebruikt kun je deze niet hergebruiken.

Als je hier classes voor gebruikt kan dit wel (waarom trouwens divs en niet gewoon buttons?).

Je zou hier click events voor kunnen definieren. Vervolgens selecteer je met $(this).parent().parent() je orderbtn block. Plak je hier .find('input') aan vast heb je je inputveld en met .val() kun je de waarde uitlezen / wegschrijven.

EDIT: ook hier zou ik het id uit verwijderen, omdat dit herbruikbaarheid belemmert. Tenzij dat element ook echt maar 1x voorkomt op de pagina.
Hallo Thomas,


Dit is wat ik ervan gemaakt heb:
[code]
//<![CDATA[
$(document).ready(function(){

//maak klik functie
$(".plus").click(function(){
var quantity_old = $(this).parent().parent().find("input[name='how-much']").val();
if ( parseFloat(quantity_old) >= 1 ) {
//variabel = oude variabel + 1
var quantity_new = parseFloat(quantity_old) + 1;
$(this).parent().parent().find("input[name='how-much']").val(quantity_new);
};
if (quantity_new > 1){
$(this).parent().parent().find("input[name='how-much']").fadeIn();
};
});

//maak klik functie
$(".minus").click(function(){
var quantity_old = $(this).parent().parent().find("input[name='how-much']").val();
if ( parseFloat(quantity_old) >= 2 ) {
//variabel = oude variabel - 1
var quantity_new = parseFloat(quantity_old) - 1;
$(this).parent().parent().find("input[name='how-much']").val(quantity_new);
};
if (quantity_new < 2){
$(this).parent().parent().find("input[name='how-much']").fadeOut();
};
});

$(".quantity").blur(function(){
if ($(this).val() < 2){
$(this).val("1");
$(this).fadeOut()
};
});

$('.quantity').keypress(function(e) {
if (e.which == 13) {
e.preventDefault();

};
});

});
//]]>
[code]


Bedankt voor de hulp :)
Als je meerdere keren aan het input-veld refereert kun je beter een variabele aanmaken, dan wordt je code een stuk korter.
var $input = $(this).parent().parent().find("input[name='how-much']");

Vervolgens kun je $input.val(), $input.val(quantity_new), $input.fadeOut() gebruiken in plaats van de uitgeschreven variant.

Reageren