Учитывая эту структуру для веб-сайта
<html>
<head>
<!-- CSS at the beginning-->
<link/>
</head>
<body>
<div id="mainContainer">
<div id="side"></div>
<div id="content">
<!-- DHTML awesomeness happens here -->
</div>
</div>
<!-- Scripts at the end -->
<script/>
<script>
/* code that attach the JS logic to the HTML items */
</script>
</body>
</html>
Используя обычную веб-навигацию, страница отображается полностью в HTML, и, следуя подходу прогрессивного улучшения, в конце я ищу некоторые конкретные идентификаторы или классы и задаю им динамическое поведение, используя javascript и особенно jQuery. Этот код расширения происходит в самом конце тела после загрузки внешних сценариев.
В #content
происходит много jQuery AJAX-взаимодействий, некоторые из них получают другие частичные представления от сервера и вставляют их на страницу, но затем мне нужно снова искать эти идентификаторы и классы и присоединять к этому объекты javascript. новые элементы.
Это может быть очень громоздко, так как вы не хотите повторно применять контроллеры, обработчики событий или что-то еще для объектов, у которых они уже есть.
Пока что единственное решение, которое я нашел, - это мои частичные представления:
@if(Request.IsAjaxRequest())
{
<script>
/* code that attach the JS controllers to the HTML items of this view */
</script>
}
Я думаю, что похожая проблема возникает, например, когда вы хотите $('input.date').datepicker()
, и вы добавляете новые элементы <input type="text" class="date"/>
динамически, новые не имеют средства выбора даты, если вы повторно не выполняете предложение jQuery.
Например, учитывая, что в #content
у меня есть <input type="text" class="date"/>
:
Для того, чтобы заставить jQuery datepicer работать в первый раз, я должен
звоните $('input.date').datepicker()
в конце <body>
,
после внешних <script>
объявлений.
Если на странице загрузки частичных просмотров, где новые <input type="text" class="date"/>
элементы, я должен положить вызов инициализации в представлении для AJAX
вызовы.
Итак, я заканчиваю повторяющимся кодом, чего я не хочу, особенно в JS, где я не могу реорганизовать код так же легко, как в C #.
Это то, что сводит меня с ума на прошлой неделе, интересно, есть ли лучший способ сделать это? Лучшая техника или другой подход?
Как вы структурируете свои веб-приложения?
С уважением.
PS: Было бы неплохо иметь что-то вроде .live()
или .delegate()
, но не только с событиями, не так ли? Нет ли какого-либо события, которое jQuery / browser вызывает каждый раз, когда что-то добавляется в DOM?