Raphael Brick

Raphael Brick Vince in bono
malum...

Temat: wielowykonywalność

Witam

Na stronie generuje x wiadomości które można skomentować. Pod każdą, wybierając rozwija się formularz i wszystko ok. Następnie zatwierdzenie formularza waliduje w jquery i chce zapisać. Wszystko działa do momentu zapisu.
Problem polega na tym że jquery przelatuje tyle razy ile mam wiadomości a chciałbym tylko dla konkretnie wybranej. Wynikiem tego jest wielokrotność rekordów w bazie :( POMOŻECIE ? :)

Oto kod:
$(document).ready(function(){

var errorColor = '#F3D2D3';
var correctColor = '#F2F2F2';
var errorMarks = 'background-color';

$("input[id ^= 'sk']").click(
$('#fk_nick'+$(this).attr('id')).css(errorMarks, correctColor);
$('#fk_tresc'+$(this).attr('id')).css(errorMarks, correctColor);

var hasError =
var fk_nickVal = $('#fk_nick'+$(this).attr('id')).val();
var fk_trescVal = $('#fk_tresc'+$(this).attr('id')).val();
var fk_wydarzVal = $('#fk_wydarz'+$(this).attr('id')).val();

if(fk_nickVal == '') {
$('#fk_nick'+$(this).attr('id')).css(errorMarks, errorColor);
hasError = true;
}

if(hasError == false) {
if($(this).attr('id') == ('sk'+fk_wydarzVal)){
$.ajax({
type: "POST",
url: "inskom.php",
data: {fk_nick: fk_nickVal, fk_tresc: fk_trescVal, fk_wydarz: fk_wydarzVal},
success: function(msg) {
$("#wrapp").html('Dziękujemy za Twój komentarz.');
$("#fk_inskomsk"+$(this).attr('id')).fadeOut("slow");
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$("#wrapp").html('Niestety nie udało się dopisać Twojego komentarza.');
$("#fk_inskomsk"+$(this).attr('id')).fadeOut("slow");
}
});
}
}
else
return false;
});
});
Marcin Witek

Marcin Witek isido.pl ułatwia
pracę - polski sytem
zarządzania
projekt...

Temat: wielowykonywalność

a
$("input[id ^= 'sk']")
to co to za input jest, nie submit przypadkiem?

W tym co wkleiłeś widzę "na sucho" coś takiego, że przy poprawnym wykonaniu handlera nie zwraca false, więc jeśli to submit, to wyśle dane ajaxem i dodatkowo forma normalnym submitem... pokaż może jeszcze kawałek HTML do tego ;)
Raphael Brick

Raphael Brick Vince in bono
malum...

Temat: wielowykonywalność

<div>
<input id="sk{$row.id}" type="button" value="Zapisz komentarz" />
</div>

konto usunięte

Temat: wielowykonywalność

Moze jestes w stanie wystawic to gdzies online testowo?
Wklejony kod wydaje sie miec bledy skladni.
Marcin Witek

Marcin Witek isido.pl ułatwia
pracę - polski sytem
zarządzania
projekt...

Temat: wielowykonywalność

Rafał Cegiełka:
<div>
<input id="sk{$row.id}" type="button" value="Zapisz
> komentarz" />
</div>

button też potrafi wysłać formularz - przynajmniej w FF ;) I tak jak pisze Kamil - na sucho będzie ciężko coś wymyśleć bo kod zdaje się jest pocięty jakoś i w samym kodzie "z kartki" nie widzę nic co mogłoby powodować opisane działanie, więc może przyczyna jest gdzieś poza fragmentem, który wkleiłeś.
Rafał Toboła

Rafał Toboła Razor s.c. -
współwłaściciel

Temat: wielowykonywalność

Opisana przez Ciebie sytuacja wygląda tak, jakbyś ten kod JS który podałeś wstawił w jakiegoś foreach-a w którym tworzysz wszystkie wiadomości i powstaje coś w stylu:

wiadomość1
js
wiadomość2
js

Wtedy na zdarzenie wywoła się tyle razy ile razy zostało podpięte :-).
Raphael Brick

Raphael Brick Vince in bono
malum...

Temat: wielowykonywalność

Rafał Toboła:
Opisana przez Ciebie sytuacja wygląda tak, jakbyś ten kod JS który podałeś wstawił w jakiegoś foreach-a w którym tworzysz wszystkie wiadomości i powstaje coś w stylu:

wiadomość1
js
wiadomo
js

Wtedy na zdarzenie wywoła się tyle razy ile razy zostało podpięte :-).
Bo tak jest. A jak zrobić inaczej skoro właśnie ma być to powtarzalne ?Rafał Cegiełka edytował(a) ten post dnia 23.08.10 o godzinie 14:12
Rafał Toboła

Rafał Toboła Razor s.c. -
współwłaściciel

Temat: wielowykonywalność

Zauważyłem jeszcze jedną rzecz:

// to
$("input[id ^= 'sk']").click(
// chyba miało być tak:
$("input[id ^= 'sk']").click(function(){


Ale mniejsza o to, coś się pewnie wycięło. Wywołanie tego JS może być albo powtarzalne, albo nie, w zależności od tego czy poprzez ,,$("input[id ^= 'sk']")'' dopasowujesz jednego inputa czy wiele. Sytuacja którą opisałeś wygląda tak jakbyś dał:


<input id='sk1'/>
<script>$("input[id ^= 'sk']").click( ... );</script>
<input id='sk2'/>
<script>$("input[id ^= 'sk']").click( ... );</script>
<input id='sk3'/>
<script>$("input[id ^= 'sk']").click( ... );</script>


co spowoduje że po kliknięciu każdego z tych trzech inputów funkcja w click(...) wywoła się trzy razy.

a powinno być albo:


<input id='sk1'/>
<input id='sk2'/>
<input id='sk3'/>
<script>$("input[id ^= 'sk']").click( ... );</script>


co daje jednorazowe podpięcie ,,click'' pod wszystkie inputy na raz, albo:


<input id='sk1'/>
<script>$("#sk1").click( ... );</script>
<input id='sk2'/>
<script>$("#sk2").click( ... );</script>
<input id='sk3'/>
<script>$("#sk3").click( ... );</script>


co daje podpięcie pojedynczo jednego wywołania funkcji pod jeden konkretny input.
Szymon Piłkowski

Szymon Piłkowski Senior JavaScript
Developer

Temat: wielowykonywalność

var hasError = 
?
Szymon Piłkowski

Szymon Piłkowski Senior JavaScript
Developer

Temat: wielowykonywalność

Szymon Piłkowski:
var hasError = 
?
powinno byc = false, zapewne.



Wyślij zaproszenie do