Je peux obtenir des exemples simples pour bien fonctionner tant qu'il n'y a pas de page maître impliquée. Tout ce que je veux faire, c'est cliquer sur un bouton et lui faire dire "bonjour le monde" avec le javascript dans un fichier .js, en utilisant une page maître. Toute aide sera grandement appréciée :)
MODIFIER
Comme @Adam le souligne dans les commentaires, il existe un mécanisme natif jQuery qui fait essentiellement la même chose que le hack dans ma réponse d'origine. En utilisant jQuery, vous pouvez faire
$('[id$=myButton]').click(function(){ alert('button clicked'); });
Mon hack a été développé à l'origine comme un travail de prototype pour ASP.NET et je l'ai adapté pour la réponse originale. Notez que jQuery fait essentiellement la même chose sous le capot. Je recommande cependant d'utiliser la méthode jQuery plutôt que d'implémenter mon hack.
Réponse originale laissée pour le contexte du commentaire
Lorsque vous utilisez une page maître, ASP.NET modifie les noms des contrôles sur les pages dépendantes. Vous devrez trouver un moyen de trouver le bon contrôle auquel ajouter le gestionnaire (en supposant que vous ajoutez le gestionnaire avec javascript).
J'utilise cette fonction pour cela:
function asp$( id, tagName ) {
var idRegexp = new RegExp( id + '$', 'i' );
var tags = new Array();
if (tagName) {
tags = document.getElementsByTagName( tagName );
}
else {
tags = document.getElementsByName( id );
}
var control = null;
for (var i = 0; i < tags.length; ++i) {
var ctl = tags[i];
if (idRegexp.test(ctl.id)) {
control = ctl;
break;
}
}
if (control) {
return $(control.id);
}
else {
return null;
}
}
Ensuite, vous pouvez faire quelque chose comme:
jQuery(asp$('myButton','input')).click ( function() { alert('button clicked'); } );
où vous avez ce qui suit sur votre page enfant
<asp:Button ID="myButton" runat="server" Text="Click Me" />
Si votre site contient des pages de contenu dans d'autres dossiers, l'utilisation de la méthode ResolveUrl
de la page dans le chemin src garantira que votre fichier js sera toujours trouvé:
<script type="text/javascript" src='<%= ResolveUrl("~/Scripts/jquery-1.2.6.min.js") %>' ></script>
Assurez-vous que jQuery est ajouté dans la page maître. Étant donné que vous avez ce contrôle:
<asp:Button ID="myButton" runat="server" Text="Submit" />
Vous pouvez câbler le javascript avec ceci:
$(document).ready(function() {
$('[id$=myButton]').click(function() { alert('button clicked'); });
});
$(document).ready()
se déclenche lorsque le DOM est complètement chargé, et tous les éléments doivent être là. Vous pouvez encore simplifier cela avec
$(function() {});
La syntaxe du sélecteur $('[id$=myButton]')
recherche les éléments en fonction de leur attribut id, mais ne correspond qu'à la fin de la chaîne. À l'inverse, '[id^=myButton]'
Correspondrait au début, mais pour filtrer le UniqueID, cela ne serait pas très utile. Il existe de nombreux autres sélecteurs utiles que vous pouvez utiliser avec jQuery. Apprenez-les tous , et une grande partie de votre travail sera fait pour vous.
Le problème est que ASP.Net crée un attribut id et nom unique pour chaque élément, ce qui rend leur recherche difficile. Auparavant, vous deviez transmettre la propriété UniqueID au javascript du serveur, mais jQuery rend cela inutile.
Grâce à la puissance des sélecteurs de jQuery, vous pouvez dissocier le javascript du côté serveur et les événements de câblage directement dans votre code javascript. Vous ne devriez plus avoir à ajouter de javascript dans le balisage, ce qui améliore la lisibilité et facilite la refactorisation.
Déplacez simplement le <script type="text/javascript" src="jquery.js" />
dans la balise head de la page maître. Ensuite, vous pouvez utiliser jquery dans toutes les pages de contenu.
Il n'y a pas de magie à utiliser des pages maîtres avec jQuery.
La solution d'Adam est la meilleure. Facile!
La page principale:
<head runat="server">
<title></title>
<link href="~/Styles/Site.css" rel="stylesheet" type="text/css" />
<script src="Scripts/jquery-1.3.2.js" type="text/javascript"></script>
<asp:ContentPlaceHolder ID="HeadContent" runat="server">
</asp:ContentPlaceHolder>
</head>
Contenu de la page:
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
<script type="text/javascript">
$(document).ready(function () {
$("[id$=AlertButton]").click(function () {
alert("Welcome jQuery !");
});
});
</script>
</asp:Content>
où se trouve le bouton
<asp:Button ID="AlertButton" runat="server" Text="Button" />
Référencez le fichier .js Jquery dans la tête de la MasterPage comme suit:
<script type="text/javascript" src="/Scripts/jquery-1.2.6.min.js"></script>
(certains navigateurs n'aiment pas le terminer avec />)
Ensuite, vous pouvez écrire des choses comme
$('#<%= myBtn.ClientID%>').show()
dans votre javascript en vous assurant d'utiliser le ClientId lors du référencement d'un contrôle ASP.Net dans votre code client. Cela gérera tout "mangling" des noms et identifiants des contrôles.
La page principale:
La bibliothèque jQuery va dans la page maître. Vérifiez si le chemin est correctement référencé. Vous voudrez peut-être ajouter la documentation supplémentaire comme ceci:
<head>
<script type="text/javascript" src="/Scripts/jquery-1.2.6.min.js"></script>
<% if (false) { %>
<script type="text/javascript" src="/Scripts/jquery-1.2.6-vsdoc.js"></script>
<% } %>
</head>
La page principale:
<head>
<script type="text/javascript">
$(document).ready(
function()
{
alert('Hello!');
}
);
</script>
</head>
CodeBehind pour les pages de contenu et les contrôles utilisateur:
this.textBox.Attributes.Add("onChange",
String.Format("passElementReferenceToJavascript({0})", this.textBox.ClientID));
Lorsque les pages sont rendues avec les pages maîtres, l'ID de contrôle est modifié lors du rendu des pages, nous ne pouvons donc pas les référencer dans jQuery comme ceci #controlid
. Au lieu de cela, nous devrions essayer d'utiliser input[id$=controlid]
. Si le contrôle est rendu comme contrôle d'entrée ou comme balise d'ancrage, utilisez a[id$=controlid]
dans jQuery.
Si quelqu'un veut accéder à une étiquette, voici la syntaxe
$('[id$=lbl]').text('Hello');
où lbl
est l'ID de l'étiquette et le texte à afficher dans l'étiquette est "Bonjour"
Découvrez ce post:
http://blogs.msdn.com/webdevtools/archive/2008/10/28/rich-intellisense-for-jquery.aspx
explique également comment obtenir intellisense pour jQuery dans Visual studio.
J'ai également commencé avec les exemples les plus simples et je n'ai pas eu de chance. J'ai finalement dû ajouter le fichier jquery .js extérieur du <head>
section de la page maître. C'était le seul moyen de faire fonctionner quoi que ce soit dans Firefox (je n'ai pas encore essayé d'autres navigateurs).
J'ai également dû référencer le fichier .js avec une adresse absolue. Je ne sais pas vraiment ce qui se passe avec celui-là.
Adam Lassek est lié à l'utilisation des sélecteurs jQuery, bien que je pense que cela vaut la peine d'appeler explicitement la sélection des éléments par leur classe, par opposition à leur identifiant.
par exemple. Au lieu de $("#myButton").click(function() { alert('button clicked'); });
utilisez plutôt $(".myButtonCssClass").click(function() { alert('button clicked'); });
et ajoutez la classe au bouton:
<asp:Button ID="myButton" runat="server" Text="Submit" CssClass="myButtonCssClass" />
Cela a l'avantage de ne pas avoir à se soucier de savoir si deux identifiants de contrôle "se terminent" de la même manière en plus de pouvoir appliquer le même code jQuery à plusieurs contrôles à la fois (avec la même classe css).
PROBLÈME -> lors de l'utilisation des pages Site.Master, les noms d'ID de contrôle (pour ASP) obtiennent le préfixe ContentPlaceHolderID. (Notez que ce n'est pas un problème pour les contrôles non asp car ils ne le font pas ' t être "réinterprété" - c'est-à-dire qu'ils apparaissent juste comme écrit)
SOLUTIONS: