2009-03-14 9 views
1

J'ai une page ASP.NET avec un certain nombre d'instances ASP: Button sur elle. Pour certains, je dois afficher une invite de confirmation et, si l'utilisateur choisit oui, la méthode de publication d'origine est appelée. Sinon, le processus global est annulé.Comment j'interrompre une publication de bouton ASP.NET avec BlockUI et Jquery

J'ai un exemple en cours d'exécution mais je reçois des résultats incohérents, principalement dans FF3 où je reçois une exception levée:

[Exception... "Illegal operation on WrappedNative prototype object" nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)" location: "JS frame :: 

Je l'ai regardé cette erreur mais je suis en tirant une perte de où je me trompe. Voici mon exemple de cas. Note, pour l'instant j'utilise la classe css comme une recherche. À plus long terme, je peux intégrer le clientID du contrôle dans mon JS si cela s'avère nécessaire :).

fragment Html:

<asp:Button ID="StartButton" runat="server" CssClass="startbutton" Text="Start" OnClick="OnStartClicked" /> 

Javascript:

$(".startbutton").each(function(){ 
      $(document).data("startclick", $(this).get()[0].click); 
      $(this).unbind("click"); 
     }).click(function(){ 
      var oldclick = $(document).data("startclick"); 
      alert("hello"); 
      try 
      { 
       oldclick(); 
      } 
      catch(err) 
      { 
       alert(err); 
       alert(err.description); 
      } 
      return false; 
     }); 

Mon code est derrière relativement simple, la méthode OnStart exécute simplement un Response.Write

Je viens juste de commencer la recherche en bind, unbind et trigger donc mon utilisation ici est à peu près 'première fois'.

Merci pour toute aide ou conseil.

S

EDIT:

Cela décrit ce que je suis en train de faire et donne également une course vers le bas du genre de pièges:

http://www.nabble.com/onClick-prepend-td15194791s27240.html

Répondre

1

J'ai résolu mon problème pour IE7 et FF3.

L'astuce consiste à faire fonctionner la publication en tant que 'onclick' via un attribut ASP.NET sur le bouton (voir ci-dessous). En Javascript, ceci est retiré en tant que référence de la fonction lorsque vous lisez le clic dans JQuery.

Pour le faire fonctionner, vous puis désactivez l'attribut onclick (après l'avoir enregistré) et l'appeler plus tard.

Mon code ci-dessous montre en action. Ce code n'est pas complet car je suis en train de le transformer en une invite générique pour mon application. C'est aussi un peu mal aménagé! Mais au moins cela montre le principe.

bouton ASP.NET

<asp:Button ID="StartButton" runat="server" CssClass="startbutton" Text="Start" OnClick="OnStart" UseSubmitBehavior="false" /> 

Javascript:

$(".startbutton").each(function(){ 
      $(document).data("startclick", $(this).attr("onclick")); 
      $(this).removeAttr("onclick"); 
     }).click(function(){ 

      $.blockUI({ message: $('#confirm'), css: { width: '383', cursor: 'auto' } }); 

      $("#yes").click(function(){ 

       $.unblockUI(); 
       var oldclick = $(document).data("startclick"); 
       try 
       { 
        oldclick(); 
       } 
       catch(err) 
       { 
        alert(err); 
        alert(err.description); 
       } 
      }); 

      $("#no").click(function(){ 
       $.unblockUI(); 
      }); 


      return false; 
     }); 
2

Comment cela?

$(document).ready(function() { 
    $('.startbutton').click(function() { 
     return confirm('Are you sure?'); 
    }) 
}); 
+0

Malheureusement, l'écouteur d'événement défini par asp.net (onclick = "...") sera toujours appelé, même si vous renvoyez false depuis un gestionnaire jQuery. – ybo

+0

Merci, mais je ne sais pas comment cela fonctionnerait avec BlockUI. Je crois comprendre que je dois déclencher l'événement clic d'origine (le postback) dans mon gestionnaire oui/ok '. C'est le cas? – Simon

+0

@ybo: Cela fonctionne très bien pour moi (ASP.NET 2.0, VS2005). Quand est-ce qu'il a échoué pour vous? @Simon: Permettez-moi de jeter un coup d'œil à la documentation de BlockUI; Je posterai du code mis à jour. – elo80ka

0

Votre problème vient d'ici:

$(document).data("startclick", $(this).get()[0].click); 
... 
var oldclick = $(document).data("startclick"); 
... 
oldclick(); 

Ici, vous essayez d'intercepter un écouteur d'événement natif mais il y a deux erreurs:

  1. Utilisation unbind ne supprimera pas l'événement natif écouteur, juste ceux ajoutés avec jQuery
  2. click est, AFAIK, une méthode IE seulement utilisée pour simuler un clic, ce n'est pas la poignée d'événement r lui-même

Vous devrez utiliser onclick au lieu d'utiliser unbind plutôt que null. Enfin, ne le stockez pas dans $(document).data(...), vous aurez quelques problèmes lorsque vous ajoutez d'autres boutons. Voici un exemple de code que vous pouvez utiliser:

$("selector").each(function() 
    { 
    var oldclick = this.onclick; 
    this.onclick = null; 
    $(this).click(function() 
    { 
     if (confirm("yes or no ?")) oldclick(); 
    }); 
    }); 
+0

J'ai essayé ceci en enveloppant le contenu du clic dans un try-catch. Dans IE7 oldclick() soulève une erreur 'object expected' et dans FF3 j'obtiens 'TypeError: oldclick n'est pas une fonction'. Je mets une alerte sur this.click et this.onclick et onclick retournent null. Merci pour les pointeurs bien! – Simon

0

pour mi fonctionne: this.OnClientClick = « .blockUI $ ({message: $ ('# ConfirmacionBOX'), css : {width: '275px'}}); return false; "; Ceci est un bouton (est une classe de bouton)

Questions connexes