Jestem całkiem nowy w jQuery, ale mam kilka linków na mojej stronie, które powinny przełączać sekcje formularza widoczne po kliknięciu, lub jeśli javascript jest wyłączony, robi pełny odświeżenie, aby przełączyć te sekcjeDlaczego mój postBack występuje przed zdarzeniem kliknięcia jQuery?
Działa dobrze w moim środowisku testowym, gdy PostBack występuje po skrypcie jQuery, ale po wdrożeniu go PostBack występuje przed zdarzeniem kliknięcia jQuery. Został on wdrożony na serwerze Windows 2003 z IIS 6.0, podczas gdy moim środowiskiem testowym jest Windows XP/IIS 5.1/VS2010
Oto kod, którego używam. Skrypt uruchamia się, jeśli wstawię go do .ready()
zamiast .click()
, ale w .click()
nie otrzymuję nawet alertu, więc zakładam, że problem dotyczy PostBack, zanim skrypt jQuery ma szansę na wykonanie.
jQuery:
$(document).ready(function() {
// Toggle Details
$('.toggleDetailsButton').click(function() {
alert('test');
$(this).parentsUntil(".parentRow").parent().next().toggleClass("hidden");
return false;
});
});
Code-tył:
Protected Sub rpData_ItemCommand(ByVal sender As Object, ByVal e As RepeaterCommandEventArgs) Handles rpData.ItemCommand
// Manually toggle rows here
End Sub
ASP:
<asp:Repeater ID="rpData" runat="server">
<ItemTemplate>
<tr class="parentRow">
...
<asp:Button runat="server" ID="cmdViewDetails"
CommandName="ToggleDetails" Text="details"
CssClass="buttonAsLink toggleDetailsButton" />
...
</tr>
<tr id="rpData_DetailsRow" class="detailsRow hidden" runat="server">
</tr>
</ItemTemplate>
</asp:Repeater>
Edit
za sugestię w komentarzach poniżej uruchomienie funkcji jQuery w onClientClick
powoduje, że strona działa tak, jak powinna, ale nadal chcę wiedzieć, dlaczego PostBack występuje po zdarzeniu jQuery w moim środowisku testowym, ale przed zdarzeniem jQuery w produkcji.
Zauważyłem także inne różnice między tymi dwoma. Na przykład, mam również przycisk, który włącza/wyłącza dział wyszukiwania, który działa dobrze w testowaniu, ale nie w produkcji. Używa $('.toggleSearchButton').next()
, aby uzyskać div pod przyciskiem wyszukiwania i przełącza jego nazwę klasy. W produkcji obiekt ten zwraca [object Object]
, jednak wywołanie .attr('class')
zwraca undefined
(podobnie jak .attr('id')
, .attr('tag')
i .nodeName
). W moim środowisku testowym zwraca poprawne wartości dla mojego elementu div wyszukiwania.
Testowałem to zachowanie w IE, FF i Chrome. Na moim komputerze testowym działa dobrze na wszystkich 3. Na mojej maszynie produkcyjnej tylko IE działa tak, jak powinno.
Zobacz czy http://api.jquery.com/event.stopPropagation/ w funkcji click nie jasne rzeczy górę . – asawyer
@asawyer Wyrażenie 'alert' nie jest wyskakujące, więc zakładam, że PostBack ma miejsce przed zdarzeniem kliknięcia. Oznacza to, że 'stopPropagation' również się nie uruchomi (tylko przetestował i nie pomoże). – Rachel
Czy umieściłeś jQuery na początku lub na końcu strony? –