Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > Web Development
You last visited: Today at 16:19

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[jQuery] doppelte Abfragen verhindern

Discussion on [jQuery] doppelte Abfragen verhindern within the Web Development forum part of the Coders Den category.

Reply
 
Old   #1

 
Mr.Tr33's Avatar
 
elite*gold: 2778
Join Date: Feb 2012
Posts: 3,527
Received Thanks: 1,044
[jQuery] doppelte Abfragen verhindern

Moin,
mir ist folgendes aufgefallen:
Wenn ich nach einem "Klick" abfrage, dann funktioniert diese Abfrage nur für bereits existierende Elemente. Wenn ich dann ein neues hinzufüge, dann muss ich nochmal danach abfragen.
Also habe ich einfach meine Abfrage in eine Funktion getan und nach jedem "neuen" Element rufe ich diese Funktion auf. Leider werden dann die bereits existierenden Elemente doppelt abgefragt.
Wie kann ich da jetzt entgegen kommen, sodass trotzdem nur jedes Element 1x abfrage?

Beispiel:
Code:
$(document).ready(function() {
    $('input[name="addKategorie"]').click(function(){
        if ($('input[name="nameKategorie"]').val() != ""){
            sendFormular (".addKategorie", "kategorie_add", "addKategorie", function(data){
                if (isFinite(data)){
                    $('.kategorien div.add').before('<div class="" data-id="'+data+'">'+$('input[name="nameKategorie"]').val()+'</div>')
                    checkKategorie();
                }else if (data != ""){
                    alert(data);
                }
                $(".addKategorie").slideUp(function(){
                    $('.kategorien div.add').html("+");
                });
            });
        }else{
            $(".addKategorie").slideUp(function(){
                $('.kategorien div.add').html("+");
            });
        }
        
        return false;
    });
    checkKategorie();
    
    
    function checkKategorie(){
        $('.kategorien div').click(function(){
            alert($(this).html());
            if ($(this).attr("class") != "add"){
                $(this).toggleClass("aktiv", function(){
                    var kategorie = "";
                    $('.kategorien div').each(function(){
                        if ($(this).attr("class") == "aktiv") kategorie += $(this).attr("data-id")+",";
                    });
                    $(".kategorien input").val(kategorie);
                });
            }else{
                if ($(this).html() == "+"){
                    $(".addKategorie").slideDown(function(){
                        $('.kategorien div.add').html("-");
                    });
                }else{
                    $(".addKategorie").slideUp(function(){
                        $('.kategorien div.add').html("+");
                    });
                }
            }
        });
    }
});
MfG,
Mr.Tr33
Mr.Tr33 is offline  
Old 09/20/2014, 13:22   #2

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
Als ich mal in jQuery reingeschnuppert habe, habe ich gelernt, dass $('yourobject(s)').on('click', function() { }); bei dynamisch erzeugten Elementen funktioniert, .click() nicht.

Ist es das, wonach du suchst?
snow is offline  
Old 09/20/2014, 13:33   #3

 
Mr.Tr33's Avatar
 
elite*gold: 2778
Join Date: Feb 2012
Posts: 3,527
Received Thanks: 1,044
Ja das habe ich auch mal gelernt, aber mir wurde mal gesagt, dass es "falsch" wäre. Also es funktioniert, aber nicht dem Sinne gedacht. Ebenfalls würde es bei größeren Seiten die Seite verlangsammern (konnte ich noch nicht wirklich testen).
Mr.Tr33 is offline  
Old 09/20/2014, 17:29   #4
 
Hyukisawa's Avatar
 
elite*gold: 133
Join Date: May 2007
Posts: 506
Received Thanks: 194
Benutzte es aber ebenfalls so.
vllt hilft dir delegate ?

Hyukisawa is offline  
Old 09/20/2014, 17:38   #5
 
ThinSmoke's Avatar
 
elite*gold: 49
Join Date: Sep 2008
Posts: 906
Received Thanks: 600
Quote:
Originally Posted by Mr.Tr33 View Post
Ja das habe ich auch mal gelernt, aber mir wurde mal gesagt, dass es "falsch" wäre. Also es funktioniert, aber nicht dem Sinne gedacht. Ebenfalls würde es bei größeren Seiten die Seite verlangsammern (konnte ich noch nicht wirklich testen).
Doch, es funktioniert genau so wie es soll. Das Ding ist, dass wenn du ein Klick-Event bindest, es nur an bereits vorhandene Elemente gebunden wird. Alles was danach erzeut wird bekommt das Klick Event nicht, einfach weil du den Aufruf nicht nochmal gibst. JqueryUI (ich übrigens auch) macht das z.B. so, dass gebundene Elemente eine Klasse mitbekommen. Alles was danach erzeugt wird hat diese Klasse nicht und bekommt das Event dann neu gebunden, so wie du es jetzt machst. Hab dir mal schnell nen kleines Beispiel gebaut:



Das Elegante daran ist, dass sobald ein Element mehrere Events bekommt, bzw. mehrere Attribute mitbekommt, du Sie einfach im DOM erkennst. Macht das Debugging sehr einfach.
ThinSmoke is offline  
Old 09/21/2014, 16:48   #6

 
Mr.Tr33's Avatar
 
elite*gold: 2778
Join Date: Feb 2012
Posts: 3,527
Received Thanks: 1,044
Quote:
Originally Posted by ci40pg View Post
Benutzte es aber ebenfalls so.
vllt hilft dir delegate ?

Und wo ist jetzt der große Unterschied zwischen on und delegate?
Quote:
Originally Posted by ThinSmoke View Post
Doch, es funktioniert genau so wie es soll. Das Ding ist, dass wenn du ein Klick-Event bindest, es nur an bereits vorhandene Elemente gebunden wird. Alles was danach erzeut wird bekommt das Klick Event nicht, einfach weil du den Aufruf nicht nochmal gibst. JqueryUI (ich übrigens auch) macht das z.B. so, dass gebundene Elemente eine Klasse mitbekommen. Alles was danach erzeugt wird hat diese Klasse nicht und bekommt das Event dann neu gebunden, so wie du es jetzt machst. Hab dir mal schnell nen kleines Beispiel gebaut:



Das Elegante daran ist, dass sobald ein Element mehrere Events bekommt, bzw. mehrere Attribute mitbekommt, du Sie einfach im DOM erkennst. Macht das Debugging sehr einfach.
Was du gemacht hat ist einfach zusätzliche Abfrage. Auf sowas könnte ich auch kommen
Aber gehts da nicht etwas "simpler" und besser?
Mr.Tr33 is offline  
Old 09/21/2014, 16:50   #7
 
Hyukisawa's Avatar
 
elite*gold: 133
Join Date: May 2007
Posts: 506
Received Thanks: 194
Habe dir nur eine alternative genannt wie gesagt ich selbst benutzte es so wie du
Hyukisawa is offline  
Old 09/21/2014, 18:00   #8
 
RecK's Avatar
 
elite*gold: 20
Join Date: Jan 2009
Posts: 304
Received Thanks: 55
Quote:
Originally Posted by Mr.Tr33 View Post
Moin,
Wenn ich nach einem "Klick" abfrage, dann funktioniert diese Abfrage nur für bereits existierende Elemente. Wenn ich dann ein neues hinzufüge, dann muss ich nochmal danach abfragen.

[...]

Wie kann ich da jetzt entgegen kommen, sodass trotzdem nur jedes Element 1x abfrage?
.click bindet das Event an ein Element.
Da ein dynamisch erzeugtes Element nicht existiert wenn du .click verwendest,
wird das Event nicht gesetzt.

Möglichkeiten:

1.
dynamische Elemente vor document.ready erzeugen.
In document.ready Callback Click-Event via .click binden.

2. (favourisiert)
Vor dem erneuten Binding deiner Funktion ein unbind durchführen.
Dadurch löscht du das alte Binding.
$.each [ ... ]
$('selector').unbind('click');
$('selector').click([...])
[ ... ]

lg, Tim


Ps: .on('click') und .click sind soweit ich weiß das gleiche.
Nur andere Syntax fürs Binding.
RecK is offline  
Reply


Similar Threads Similar Threads
jquery post to php
08/08/2014 - Web Development - 1 Replies
Hi, ich möchte gerne den ausgewählten Index eines <select> Elementes über jquery mit "$.post" übermitteln. Der Wert wird richtig ermittelt, aber er wird nicht "richtig" gesendet. jquery $(document).ready(function(){ $("#classSelect").click(function(){ $.post("backend.php?action=loadClass",{c lassname : $("#alleKlassen option:selected" ).text()}); });
[jQuery] Simple jQuery-Plugin Template
01/21/2014 - Coding Snippets - 0 Replies
Ohne Parameter: Der Code selbst: (function( $ ) { $.fn.popupContent = function() { //Funtions-Block alert($( this ).text()); }; }( jQuery ));
[S] Autocomplete jQuery
01/21/2014 - Coders Trading - 10 Replies
Hey! Ich suche ein fertiges jQuery Script (Autocomplete) wie bei Facebook. Also das man zb die ersten zwei Buchstaben eines Freundes eingibt, das dieser dann erscheint. Ich hätte gern ein fertiges Script, da ich es leider nicht schaffe es selbst aufzubaun. Ich bräuchte das Script + anbindung an eine Datenbank..Falls mir jemand sowas zukommen lassen kann, wäre ich bereit 5€ PayPal zu bezahlen. Bitte helft mir!
JQuery Problem
04/19/2012 - Web Development - 4 Replies
Moin, also es geht primär um dieses Beispiel: $("#arrow-top").wrap('<a href="#" onclick="getMap(\'Top\');"></a> '); Wenns ichs am PC teste (mit XAMPP) funktioniert es einwandfrei. Wenn ich es aber aufn Server lade, gehts nicht mehr, also er wrap'ed das Bild nicht mehr. Alles andere funktioniert sonst einwandfrei, nur eben das nicht.
jquery Problem
04/17/2012 - Web Development - 2 Replies
Hey Leute! Ich bin gerade dabei mir eine kleine Slideshow mittels Jquery zu basteln und nach tausenden versuchen scheint es einfach nicht zu funktionieren. Hoffe ihr könnt mir helfen :) $(document).ready(function() { $("#slide1").hover( function () {



All times are GMT +1. The time now is 16:21.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.