Javascript для улучшения элементов в главных страницах ASP.NET - PullRequest
3 голосов
/ 07 октября 2008

Я столкнулся с небольшой проблемой и немного покопался, но изо всех сил пытался придумать окончательный ответ / исправить.

По сути, у меня есть некоторый javascript (созданный сторонней организацией), который делает некоторые элементы whizzbang для элементов страницы, чтобы они выглядели красиво. Код прекрасно работает на отдельных страницах (то есть без мастера), однако, когда я пытаюсь применить эффекты к странице содержимого внутри мастера, он не работает.

Короче говоря, у меня есть главная страница, которая содержит ссылку на основной скрипт. Все страницы будут использовать скрипт, но параметры, переданные ему, будут отличаться для страниц контента.

Справочник сценариев главной страницы

<script src="scripts.js" language="javascript" type="text/javascript" />

Одна страница

<script>
    MakePretty("elementID");
</script>

Как видите, мне нужна ссылка на каждой странице (следовательно, она находится в главной странице), но фактические элементы, которые я хочу "MakePretty", будут меняться в зависимости от содержимого.

Содержание страниц

Теперь, поскольку на странице содержимого нет элемента <head>, я использовал следующий код для добавления его к элементу главных страниц <head>:

HtmlGenericControl ctl = new HtmlGenericControl("script");
ctl.Attributes.Add("language", "javascript");
ctl.InnerHtml = @"MakePretty(""elementID"")";
Master.Page.Header.Controls.Add(ctl);

Теперь, это не работает . Однако, если я заменю что-то простое, например alert("HI!"), все работает нормально. Итак, код добавляется в порядке, просто он не всегда выполняется в зависимости от того, что он делает ..

Теперь, покопавшись, я узнал, что событие Load на этой странице содержимого возникает перед главными страницами, что может иметь эффект, однако я подумал, что весь javascript на странице был загружен / запущен один раз?

Простите, если это глупый вопрос, но я все еще относительно новичок в использовании javascript, особенно в сценарии мастер-страниц.

Как получить страницы с содержимым для вызова кода JavaScript, на который есть ссылка на главной странице?

Спасибо за любую помощь всем этим парням, вы действительно поможете мне с этой рабочей проблемой.

ПРИМЕЧАНИЯ:

  • RegisterStartupScript и т.п., похоже, не работает ни на одном уровне.
  • Идентификаторы элементов управления устанавливаются нормально, даже в среде MasterPage, и отображаются должным образом.

Извините, если что-то из этого неясно, я очень устала, поэтому, если нужно, прокомментируйте, если требуется переформулировка / уточнение.

Ответы [ 5 ]

5 голосов
/ 07 октября 2008

Поместите ContentPlaceHolder в раздел head главной страницы, затем добавьте элемент управления asp: Content на страницу содержимого со ссылкой на заполнитель и поместите свой сценарий в этот элемент управления. Вы можете настроить его для каждой страницы таким образом.

Кроме того, ссылка по идентификатору может не работать, поскольку при использовании главных страниц идентификаторы элементов управления на странице автоматически создаются на основе структуры контейнера. Таким образом, вместо «elementID», как и ожидалось, он может выводить «ctl00_MainContentPlaceHolder_elementID» Просмотреть ваш исходный код или использовать firebug для проверки элементов формы, чтобы увидеть, какие выводятся идентификаторы.

2 голосов
/ 07 октября 2008

Разве нельзя делать с чистым javascript? -)

- просто добавьте что-то похожее в тег body:

<script type="text/javascript">
  window.onload = function(){
    MakePretty("elementID");
  }
</script>

Кстати, скрипт-тег должен иметь конечный тег:

<script type="text/javascript" src="myScript.js"></script>
1 голос
/ 07 октября 2008

Почему бы не использовать jQuery, чтобы найти все элементы управления? Примерно так:

$(document).ready(function(){
  $("input[type='text'], input[type='radio'], input[type='checkbox'], select, textarea").each(function(){
    MakePretty(this);
  });
});

Таким образом, вы получите все элементы на странице, вы можете подождать, пока страница не будет готова (чтобы вы не модифицировали DOM нелегально). Селектор jQuery может получить элементы в немного более определенном формате, если вам нужно (т. Е. Добавить корневой элемент, такой как идентификатор элемента div).

Также было бы лучше изменить метод MakePretty, чтобы он принимал элемент, а не ID, в качестве параметра, чтобы уменьшить накладные расходы на обработку.

0 голосов
/ 07 октября 2008

При использовании главных страниц необходимо соблюдать осторожность с идентификатором атрибута html, поскольку .NET изменит это значение, так как оно должно поддерживать уникальность идентификаторов.

Я бы предположил, что ваш javascript применяет стили CSS через идентификатор, а когда вы используете главные страницы, идентификатор отличается от того, что есть в вашем aspx. Если вы проверяете, что ваш JavaScript всегда добавляется, ваш ответ должен учитывать следующее:

  • ВСЕГДА устанавливайте идентификатор своей главной страницы при загрузке страницы (this.ID = "myPrefix";)
  • Любой элемент HTML на вашей главной странице будет иметь префикс с идентификатором главной страницы (т. Е. На отображаемой странице будет "myPrefix_myDiv")
  • Любой HTML-элемент в вашем идентификаторе заполнителя контента будет иметь префикс с дополнительным префиксом (т.е. myPrefix_ContentPlaceHolderId1_myDiv)

Пожалуйста, дайте мне знать, если я смогу что-то уточнить. Надеюсь, это поможет!

0 голосов
/ 07 октября 2008

Как только вы используете мастер-страницы, идентификаторы элементов управления на стороне клиента уже не те, что вы думаете Вы должны использовать Control.ClientID при создании сценария.

...