|
You last visited: Today at 16:19
Advertisement
[jQuery] doppelte Abfragen verhindern
Discussion on [jQuery] doppelte Abfragen verhindern within the Web Development forum part of the Coders Den category.
09/20/2014, 13:18
|
#1
|
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
|
|
|
09/20/2014, 13:22
|
#2
|
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?
|
|
|
09/20/2014, 13:33
|
#3
|
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).
|
|
|
09/20/2014, 17:29
|
#4
|
elite*gold: 133
Join Date: May 2007
Posts: 506
Received Thanks: 194
|
Benutzte es aber ebenfalls so.
vllt hilft dir delegate ?
|
|
|
09/20/2014, 17:38
|
#5
|
elite*gold: 49
Join Date: Sep 2008
Posts: 906
Received Thanks: 600
|
Quote:
Originally Posted by Mr.Tr33
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.
|
|
|
09/21/2014, 16:48
|
#6
|
elite*gold: 2778
Join Date: Feb 2012
Posts: 3,527
Received Thanks: 1,044
|
Quote:
Originally Posted by ci40pg
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
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?
|
|
|
09/21/2014, 16:50
|
#7
|
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
|
|
|
09/21/2014, 18:00
|
#8
|
elite*gold: 20
Join Date: Jan 2009
Posts: 304
Received Thanks: 55
|
Quote:
Originally Posted by Mr.Tr33
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.
|
|
|
 |
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.
|
|