Sono abbastanza nuovo per jQuery, ma ho alcuni collegamenti sulla mia pagina che dovrebbero commutare le sezioni del modulo visibili quando si fa clic, o se javascript è disabilitato fa un postback completo per alternare quelle sezioniPerché il mio PostBack si verifica prima del mio evento click jQuery?
Funziona bene nel mio ambiente di test, con PostBack che si verifica dopo lo script jQuery, ma una volta distribuito, PostBack si verifica prima dell'evento click di jQuery. È distribuito su un server Windows 2003 con IIS 6.0, mentre il mio ambiente di test è Windows XP/IIS 5.1/VS2010
Ecco il codice che sto utilizzando. Lo script viene eseguito in produzione se lo inserisco in .click()
anziché .click()
, ma in .click()
non riesco nemmeno a ricevere l'avviso, quindi presumo che il problema riguardi PostBack prima che lo script jQuery abbia la possibilità di eseguirlo.
jQuery:
$(document).ready(function() {
// Toggle Details
$('.toggleDetailsButton').click(function() {
alert('test');
$(this).parentsUntil(".parentRow").parent().next().toggleClass("hidden");
return false;
});
});
Codice-behind:
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>
Modifica
Per un suggerimento nei commenti seguenti, l'esecuzione della funzione jQuery in onClientClick
fa sì che la pagina si comporti come dovrebbe, tuttavia desidero ancora sapere perché PostBack si verifica dopo l'evento jQuery nel mio ambiente di test, ma prima dell'evento jQuery in produzione.
Ho notato anche altre differenze tra i due. Ad esempio, ho anche un pulsante che attiva/disattiva un div di ricerca che funziona bene nei test ma non in produzione. Utilizza $('.toggleSearchButton').next()
per ottenere il div sotto il pulsante di ricerca e commuta il suo nome di classe. In produzione, questo oggetto restituisce [object Object]
, tuttavia chiamando .attr('class')
restituisce undefined
(così fa .attr('id')
, .attr('tag')
e .nodeName
). Nel mio ambiente di test, restituisce i valori corretti per il mio div di ricerca.
Ho provato questo comportamento in IE, FF e Chrome. Sulla mia macchina di prova, funziona bene su tutto 3. Sulla mia macchina di produzione, solo IE funziona come dovrebbe.
Vedi se http://api.jquery.com/event.stopPropagation/ nella vostra funzione di clic non a chiarire le cose . – asawyer
@asawyer L'avviso non viene visualizzato, quindi presumo che il PostBack si sia verificato prima dell'evento click. Ciò significa che "stopPropagation" non verrà eseguito (lo ha appena testato e non aiuta) – Rachel
Hai posizionato quella jQuery all'inizio o alla fine della pagina? –