Я могу заставить простые примеры работать нормально, пока не задействована эталонная страница. Все, что я хочу сделать, это нажать кнопку и сказать «привет, мир» с javascript в файле .js, используя главную страницу. Любая помощь очень ценится :)
Как использовать JQuery с главными страницами?
Ответы (13)
ИЗМЕНИТЬ
Как указывает @Adam в комментариях, существует собственный механизм jQuery, который в основном делает то же самое, что и хак в моем первоначальном ответе. Используя jQuery, вы можете сделать
$('[id$=myButton]').click(function(){ alert('button clicked'); });
Мой хак изначально был разработан как прототип для ASP.NET, и я адаптировал его для исходного ответа. Обратите внимание, что jQuery в основном делает то же самое под капотом. Однако я рекомендую использовать способ jQuery вместо реализации моего хака.
Исходный ответ оставлен для контекста комментария
При использовании главной страницы ASP.NET изменяет имена элементов управления на зависимых страницах. Вам нужно найти способ найти правильный элемент управления для добавления обработчика (при условии, что вы добавляете обработчик с помощью javascript).
Я использую эту функцию, чтобы сделать это:
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;
}
}
Затем вы можете сделать что-то вроде:
jQuery(asp$('myButton','input')).click ( function() { alert('button clicked'); } );
где у вас есть следующее на вашей дочерней странице
<asp:Button ID="myButton" runat="server" Text="Click Me" />
Если на вашем сайте есть страницы контента в других папках, использование метода ResolveUrl
страницы в пути src гарантирует, что ваш файл js всегда можно будет найти:
<script type="text/javascript" src='<%= ResolveUrl("~/Scripts/jquery-1.2.6.min.js") %>' ></script>
Public Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Dim lit As New Literal() lit.Text = String.Format("<script type='text/javascript' src='{0}'><" & "/script>", ResolveUrl("~/Script/jquery-1.6.1.js")) Page.Header.Controls.Add(lit) End Sub
- person Andomar; 13.06.2011
Убедитесь, что jQuery добавляется на главную страницу. Учитывая, что у вас есть этот элемент управления:
<asp:Button ID="myButton" runat="server" Text="Submit" />
Вы можете подключить javascript следующим образом:
$(document).ready(function() {
$('[id$=myButton]').click(function() { alert('button clicked'); });
});
$(document).ready()
срабатывает, когда DOM полностью загружен, и все элементы должны быть там. Вы можете упростить это с помощью
$(function() {});
Синтаксис селектора $('[id$=myButton]')
ищет элементы на основе их атрибута id, но соответствует только концу строки. И наоборот, '[id^=myButton]'
будет соответствовать началу, но для целей фильтрации UniqueID это будет не очень полезно. Есть много других полезных селекторов, которые вы можете использовать с jQuery. Изучите их все, и большая часть вашей работы будет сделана за вас.
Проблема в том, что ASP.Net создает уникальный идентификатор и атрибут имени для каждого элемента, что затрудняет их поиск. Раньше вам нужно было передать свойство UniqueID в javascript с сервера, но jQuery делает это ненужным.
С помощью селекторов jQuery вы можете полностью отделить javascript от серверной части и подключить события непосредственно в коде javascript. Вам больше не нужно добавлять javascript в разметку, что улучшает читабельность и значительно упрощает рефакторинг.
Просто переместите тег <script type="text/javascript" src="jquery.js" />
в тег заголовка главной страницы. Затем вы можете использовать jquery на всех страницах контента.
В использовании эталонных страниц с jQuery нет ничего волшебного.
Решение Адама является лучшим. Простой!
Основная страница:
<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>
Страница содержания:
<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>
где кнопка
<asp:Button ID="AlertButton" runat="server" Text="Button" />
Ссылайтесь на файл Jquery .js в заголовке MasterPage следующим образом:
<script type="text/javascript" src="/Scripts/jquery-1.2.6.min.js"></script>
(некоторым браузерам не нравится оканчиваться на />)
Затем вы можете написать что-то вроде
$('#<%= myBtn.ClientID%>').show()
в вашем javascript, убедившись, что вы используете ClientId при ссылке на элемент управления ASP.Net в своем клиентском коде. Это справится с любым «искажением» имен и идентификаторов элементов управления.
Основная страница:
Библиотека jQuery находится на главной странице. Посмотрите, правильно ли указан путь. Вы можете добавить дополнительную документацию следующим образом:
<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>
Основная страница:
<head>
<script type="text/javascript">
$(document).ready(
function()
{
alert('Hello!');
}
);
</script>
</head>
CodeBehind для страниц контента и пользовательских элементов управления:
this.textBox.Attributes.Add("onChange",
String.Format("passElementReferenceToJavascript({0})", this.textBox.ClientID));
Посмотрите этот пост:
http://blogs.msdn.com/webdevtools/archive/2008/10/28/rich-intellisense-for-jquery.aspx
также объясняет, как получить IntelliSense для jQuery в Visual Studio.
Когда страницы отображаются вместе с мастер-страницами, идентификатор элемента управления изменяется при отображении страницы, поэтому мы не можем сослаться на них в jQuery, как это #controlid
. Вместо этого мы должны попробовать использовать input[id$=controlid]
. Если элемент управления отображается как элемент управления вводом или в качестве тега привязки, используйте a[id$=controlid]
в jQuery.
В случае, если кто-то хочет получить доступ к метке, вот синтаксис
$('[id$=lbl]').text('Hello');
где lbl
— это идентификатор метки, а текст, отображаемый в метке, — «Привет».
Я также начал с простейших примеров и не повезло. В конце концов мне пришлось добавить файл jquery .js снаружи раздела <head>
главной страницы. Это был единственный способ заставить что-либо работать в Firefox (еще не пробовал другие браузеры).
Мне также пришлось ссылаться на файл .js с абсолютным адресом. Не совсем уверен, что с этим.
Адам Лассек ссылается на использование селекторов jQuery, хотя я думаю, что стоит явно вызывать выбор элементов по их классу, а не по их идентификатору.
например Вместо $("#myButton").click(function() { alert('button clicked'); });
вместо этого используйте $(".myButtonCssClass").click(function() { alert('button clicked'); });
и добавьте класс к кнопке:
<asp:Button ID="myButton" runat="server" Text="Submit" CssClass="myButtonCssClass" />
Преимущество этого заключается в том, что вам не нужно беспокоиться о том, что два идентификатора элементов управления «заканчиваются» одинаково, в дополнение к возможности применять один и тот же код jQuery к нескольким элементам управления одновременно (с одним и тем же классом css).
ПРОБЛЕМА --> при использовании страниц Site.Master имена идентификаторов элементов управления (для элементов управления ASP) получают префикс ContentPlaceHolderID. (Обратите внимание, что это не проблема для элементов управления, отличных от ASP, поскольку они не «переинтерпретируются» - т.е. они просто отображаются так, как написано)
РЕШЕНИЯ:
- Simplest --> add ClientIDMode="Static" to the asp control definition (or set with properties) in aspx page
- Альтернативы включают:
- Hardcoding the ContentPlaceHolderID name in the js code e.g "#ContentPlaceHolder1_controlName" - eek!!!!
- using the <%= controlName.ClientID %> in the ASP page - plus, assigning it - there- to a variable (or object of variables). The variable (or object dot notation) can then be used in external js page (NOTE: Can't use <%= controlName.ClientID %> in external js)
- Using CssClass with a unique(same name as ID) in ASP page and refering to the control as ".controlName" instead of "#controlName"
- Using the "[id$=_controlName]" instead of "#controlName" - this is involves a small search and is looking for a control that ends with the unique name - that way the start is irrelevant