2010-12-04 15 views
0

J'ai un masque de date JQuery, mais lorsque je lance la page, il génère une erreur "Erreur d'exécution de Microsoft JScript: l'objet ne supporte pas cette propriété ou cette méthode".Le plugin JQuery ne fonctionne pas

Maintenant, le contrôle que ce JQuery particulier est censé fonctionner est ajouté dynamiquement à un contrôle de répéteur. Grâce à cela, j'ai regardé les identifiants du contrôle, où il se cassait et s'arrêtait dans Visual Studio et ce qui est affiché sur la page ASPX. Les identifiants sont identiques à l'exception du "#" que JQuery a au début, qui n'est pas sur la page.

Dans mon code JQuery j'ai:

JQuery(function ($) { 

$('#<%=date.ClientID %>').mask("99/99/9999"); 

}); 

Est-il loin de dire JQuery de ne pas inclure le « # » lors de la recherche du contrôle? J'ai utilisé UniqueID mais cela change tout trait de soulignement en "$", ce qui n'est pas la même chose que sur la page. Mon seul problème est avec le signe "#" au début de l'ID. J'ai même ajouté une boîte d'alerte pour vérifier que la boîte de texte était là et elle est revenue comme nulle. J'ai essayé même en ajoutant un attribut CssClass à la zone de texte, mais cela à travers la même erreur, aussi.

Veuillez noter que le contrôle utilisateur personnalisé qui a la zone de texte est ajouté par programme au répéteur.

code ci-dessous:

contrôle utilisateur avec répéteur

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Step4.ascx.cs" 
    Inherits="Prototype.Step4" %> 
<div style="height: 800px; margin-top: 20px; overflow-x: hidden; overflow-y: scroll"> 
    <p> 
     <b>Edit Stage</b></p> 

    <asp:Repeater ID="Edit" runat="server"> 
     <HeaderTemplate> 
      <table> 
     </HeaderTemplate> 
     <FooterTemplate> 
      </table> 
     </FooterTemplate> 
     <ItemTemplate> 
      <tr> 
       <td> 
        <asp:Label ID="RowLabel" runat="server" Text="Label" ></asp:Label> 
       </td> 
       <td> 
        <asp:PlaceHolder ID="ControlPlaceHolder" runat="server"></asp:PlaceHolder> 
       </td> 
      </tr> 
     </ItemTemplate> 
    </asp:Repeater> 
</div> 

Control Mask qui est ajouté dynamiquement au contrôle ci-dessus

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MaskControl.ascx.cs" Inherits="Prototype.CommonControls.MaskControl" %> 


<asp:TextBox ID="date" runat="server" Width="136px" CssClass="dateMask"></asp:TextBox> 


<script src="../../Scripts/jquery-1.4.2.js" type="text/javascript"></script> 
<script src="../../Scripts/jquery.maskedinput.js" type="text/javascript"></script> 

<script type="text/javascript"> 
// jQuery(function ($) { 
//  $('.dateMask').mask("99/99/9999"); 
// }); 
    alert(document.getElementById("MaskedDateBox")); 
</script> 

Quelqu'un peut-il aider?

+0

avez-vous essayé d'inclure votre script entre CDATA? – Codex73

Répondre

0

avez-vous essayé d'utiliser:

$ (document) .ready (function() {. de $ (dateMask) .mask ("99/99/9999"); });

L'ajout dynamique de la commande usercontrol ne modifie pas la classe CSS des contrôles ajoutés, où elle modifiera l'ID en fonction de son conteneur de dénomination.

+0

Je n'ai pas essayé ce que vous avez donné ci-dessus, mais je peux le lundi, cependant. Cependant, n'avez-vous pas dit cela parce que j'ajoute le contrôle à travers le code derrière - dynamiquement que le JQuery ne sera pas en mesure de choisir l'identifiant de la zone de texte? Si oui, comment appliquer un masque sans JQuery et AJAX? – Andy5

+0

@ Andy5: Comme il est dit dans ma réponse, les identifiants sont difficiles à saisir car ils sont générés en fonction de la position dans la hiérarchie des conteneurs de dénomination. Vous devriez être en mesure d'obtenir vos éléments en utilisant jQuery par nom de classe css au lieu de id. – skajfes

+0

Salut Eh bien, j'appliqué le code suivant, et a ajouté quelques plus. $ (document) .ready() { $ ('dateMask') masque ("99/99/9999"); }); Pour vérifier que JQuery récupérait les identifiants du contrôle, j'ai ajouté $ ('input [classe $ = dateMask]') et j'ai envoyé la sortie à une boîte d'alerte. Heureusement, JQuery a trouvé le contrôle par classe, mais est tombé lors de l'application du masque. Donc, le problème réside dans le plugin! Je suis propre d'idées et je ne sais pas pourquoi! – Andy5

0
jQuery(function() { 
    jQuery('.dateMask').mask("99/99/9999"); 
}); 

devrait fonctionner.

Je ne suis pas vraiment sûr de ce que vous entendez par:

tell JQuery not to include the "#" when finding the control

Lorsque vous utilisez # dans un sélecteur, il signifie que vous trouverez le contrôle par id.

Il est plus propre d'obtenir des contrôles asp.net en utilisant un sélecteur de classe plutôt que le sélecteur d'ID, à mon humble avis.

Donc, pour développer un peu l'explication. Si vous n'utilisez pas ajax, peu importe comment vous avez généré vos contrôles - toutes vos zones de texte sont présentes sur la page lorsque l'événement $ (document) .ready() se déclenche et que leurs classes sont définies. Dans ce cas, vous devez exécuter le code suivant une seule fois (qui est mis js sur la page et non dans le contrôle)

jQuery(function() { 
    jQuery('.dateMask').mask("99/99/9999"); 
    jQuery('.phoneMask').mask("(999) 999-9999"); // if you have one 
    ... 
}); 

Si vous chargez les contrôles avec ajax que vous devez exécuter le code javascript au-dessus de chaque fois que la requête ajax est terminée.Vous pouvez le faire en vous inscrivant un script avec ScriptManager dans Page_Load comme ceci:

public void Page_Load(object sender, EventArgs e) { 
    ScriptManager.RegisterStartupScript(updatePanel, updatePanel.GetType(), "mask", "initMask();", true); 
} 

Vous devez définir la fonction javascript initMask() sur votre page.

function initMask() { 
    jQuery('.dateMask').mask("99/99/9999"); 
    jQuery('.phoneMask').mask("(999) 999-9999"); // if you have one 
    ... 
} 
+0

Cela ne fonctionnera pas comme écrit car la zone de texte fait partie d'un contrôle utilisateur qui est dynamiquement chargé dans l'espace réservé. Donc, la 'date' ne sera pas trouvée, donc l'identifiant client de ce contrôle ne sera pas rendu. – FiveTools

+0

@FiveTools: Que voulez-vous dire par dynamiquement? Ajax? Vous avez donné le même exemple de code dans votre réponse, sauf que le vôtre a une erreur de syntaxe. – skajfes

+0

Ok, existe-t-il une autre façon d'appliquer un masque de données qui ne repose pas sur JQuery ou AJAX. J'ai essayé l'AJAX avant le JQuery mais je l'ai laissé tomber en raison d'autres conflits sur les contrôles dynamiques – Andy5