J'ai créé une page qui combine une inline JQuery UI DatePicker . Je ne voudrais pas initier un rappel à l'UpdatePanel lorsque l'utilisateur clique sur une nouvelle date pour mettre à jour certaines données. Maintenant, cette page comporte plusieurs étagères de mise à jour (ne demandez pas :)), alors j'ai besoin de vérifier quel UpdatePanel a effectué la recharge afin de faire certaines choses Clientside. J'utilise Le problème est que, dans FF, le rappel me dit que ce n'est pas une opération ASYNC, et que les données que je dois avoir à vérifier quelle updatepanel a effectué la mise à jour sur NULL. P> My problème est que cela fonctionne correctement dans IE, mais pas dans aucun autre navigateur, qui pourrait être causé par 2 choses: c'est-à-dire entre un quirksmode qui résout la question (c'est ce que je pense) ou que c'est-à-dire qu'il a une sorte de support natif pour L'UpdatePanel que d'autres navigateurs ne font pas. P> J'ai réduit le problème et produisait un test de test: P> __ dopostback code> pour faire le post-plan et
sys.webforms.pagerequestmanager.getinstance (). Add_endreQuest (fonction (expéditeur, args) {} code> Pour écouter quand une mise à jour est terminé.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Test</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js "></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js "></script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<script type="text/javascript">
function doAspNetPostback() {
__doPostBack('<%= hiddenOnSelectionChangedButton.ClientID %>', '');
}
$(document).ready(function() {
/* Create the datepicker */
buildDatepicker();
/* Add callback-method for when the scriptmanager finished a request */
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, args) {
/* Show the panelID - This is 'upd1|hiddenOnSelectionChangedButton' in IE as it should be, and null in Chrome / FF */
alert(sender._postBackSettings.panelID);
});
});
function buildDatepicker() {
var dp = $("#datepicker").datepicker({
onSelect: function(dateText, inst) {
/* Do a postback when someone clicks a date */
doAspNetPostback();
}
});
}
</script>
<div id="datepicker">
</div>
<asp:UpdatePanel UpdateMode="Conditional" ID="upd1" runat="server">
<ContentTemplate>
<asp:Button ID="hiddenOnSelectionChangedButton" Text="Press me" runat="server" />
<div id="lala" runat="server">
Upd1
</div>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
10 Réponses :
Un problème commun avec les combinaisons d'Ajax et de JQuery est que cela ...
$(document).ready(function() { buildDatepicker(document); ... function buildDatepicker(element) { var dp = $("#datepicker", element).datepicker({ onSelect: function(dateText, inst) { /* Do a postback when someone clicks a date */ doAspNetPostback(); } }); }
Eh bien, la datePicker est déjà en dehors du contenu du contenu de l'UpdatePanel, il ne devrait donc pas être affecté. J'ai essayé votre solution, mais cela montre toujours NULL dans Firefox :(
Vous pouvez essayer d'utiliser DatePicker pour définir un altfield et vérifier que des modifications apportées à un publication. P>
Oui, on dirait que c'est la seule façon d'aller :(
J'ai essayé votre code pour reproduire l'erreur et je peux reproduire l'erreur. Et je suis arrivé à la conclusion qu'il y a un problème avec JQuery / UpdatePanels. P>
Si je remplace le bouton avec un linkbutton, vous pouvez voir que le lien appelle directement __dopostback (...), la même fonction exacte avec les mêmes arguments que vous appelez. Et cliquez sur le bouton de liaison qui fonctionne directement, mais en cliquant sur une date, ça ne marche pas. P>
Cela signifie que quelque chose se passe à l'intérieur de JQuery qui change du contexte. Mais je n'ai aucune idée de ce que ce serait. P>
J'ai trouvé un autre script un certain temps que j'utilise depuis un moment et que je n'ai jamais eu de problèmes. Vous pouvez toujours définir manuellement une fonction de rappel exactement comme si vous le faites dans votre script ci-dessus. p> Vous devrez également ajouter manuellement un gestionnaire de scriptresource (impossible de souvenir Lequel) mais je me souviens spécifiquement de poser des problèmes d'appel à l'async et aux posts non asynchrones. Espère que cela aide. P> p>
J'ai corrigé divers problèmes asynchronisés avec jQuery / updatePanels à l'aide de l'argument ScriptMode = "Libération" sur le scriptManager.
<asp:ScriptManager ID="scriptManager" runat="server" ScriptMode="Release"> </asp:ScriptManager>
ressemble à une condition de course, essayez updateemode = "conditionnel" et enfantsastriggers = "false", référence . P>
N'a pas aidé, bien que je suis d'accord, cela ressemble à une condition de course :)
Cependant, si je passe à travers le code dans Firebug assez lentement, ça marche p>
Oh? Pourquoi ne pas lui donner une seconde pour le calculer? p>
xxx pré> blockQuote>
Hehe .. Ouais, essayé ça, mais ce n'est pas vraiment le genre de solution que je recherche XD
Je pense que je trouve mon article de MSDN intéressant: http: // msdn.microsoft.com/en-us/magazine/cc163413.cexaspx
L'article dit que "sys.webforms.pagerequestmanager.getinstance (). add_pageloaded strong> (" attache également à UpdatePanel Evénements complets. P> Il tire également chaque fois un
Callback asynchrone lancé sur
Behalf d'un contrôle UpdatePanel
complète et le contenu à l'intérieur
UpdatePanel est mis à jour. P>
blockQquote> Dans votre gestionnaire, vous pouvez faire boucle via les étagères mis à jour avec P>
var panels = args.get_panelsUpdated();
for (i=0; i < panels.length; i++) { alert(panels[i]); }
J'ai aimé la réponse de Tim, entourant l'idée que vous devriez utiliser arg.get_panelSupdated () dans l'événement pageloaded. Cela semble être le moyen approprié de faire ce que vous essayez de faire. Essayez-le - si cela ne fonctionne pas, j'ai une autre idée de ma manche (bien que son genre de sale). P>
Je pensais que c'était intéressant, si vous ajoutez une alerte après que le dopostback, FF ne renvoie pas NULL.
function doAspNetPostback() { __doPostBack('<%= hiddenOnSelectionChangedButton.ClientID %>', ''); alert('<%= hiddenOnSelectionChangedButton.ClientID %>'); }