jQuery, Что является Лучшим, Имеет Все Связывание в Одном Единственном Файле Для Всего Сайта или на на Основание Страницы?

Я посреди создания веб-приложения с интенсивным использованием плагинов jQuery и большой привязкой.

Бэкенд был разработан с шаблонной системой, которая только позволяет (на данный момент) помещать все сценарии в тот файл HTML. Мы будем использовать компрессор YUI для слияния всех они в один.

Теперь, для привязки, как плохо это должно иметь, связывает в файле HTML (который теперь является шаблоном для целого сайта) для элементов, которые не могут присутствовать на конкретной странице?

Любой совет значительно ценится

5
задан Sam3k 11 February 2010 в 15:54
поделиться

6 ответов

Я довольно широко использовал решение Пола Айриша на основе разметки на крупных сайтах.

2
ответ дан 14 December 2019 в 19:12
поделиться

Одной из самых больших проблем при этом является производительность - селектор будет оцениваться и DOM будет перебираться для каждой привязки, не предназначенной для конкретной страницы. По крайней мере, возможно установить объектный литерал для запуска соответствующего готового кода привязки на основе идентификатора страницы, который может быть window.location.href или его подстрокой. Что-то вроде

// avoid global pollution!
(function() {

    var pages = {

        pageX : {

            ready: function() { /* code to run on ready */ },
            teardown: function() { /* code to run on teardown */ }

        },

        pageY : {

            ready: function() { /* code to run on ready */ },
            teardown: function() { /* code to run on teardown */ }

        },

    }

    // set up ready event handler 
    $(ready);

    // handler function to execute when ready event raised
    // Note: Access to pages through closure
    function ready() {
        var location = window.location.href;
        pages[location].ready();
    }

})();
2
ответ дан 14 December 2019 в 19:12
поделиться

Будьте осторожны с селекторами, если у вас есть несколько больших страниц. Например, если у вас есть несколько страниц с большими, но инертными (без привязок) таблицами, а на других страницах таблицы маленькие, но в них есть элементы управления, вам, вероятно, не стоит делать следующее:

$('td.bindMe').bind('whatever', function() { ... });

(Отложите в сторону проблему live(); иногда вам нужно работать с каждым элементом, и это то, о чем я говорю). Проблема в том, что Sizzle придется просматривать все элементы td на странице, что потенциально возможно. Вместо этого можно поместить некий "маркерный" контейнер вокруг таких вещей, как "активная" таблица с элементами управления, и работать таким образом:

$('table#withControls').find('td.bindMe').bind(/* ... */);

Таким образом, Sizzle нужно только выяснить, что нет таблицы с названием "withControls", и все готово.

1
ответ дан 14 December 2019 в 19:12
поделиться

Самая большая проблема при использовании всех привязок на всех страницах заключается в том, что вы можете получить привязки, которые не собирались иметь, что вызывает проблемы ...

И, конечно, у вас будут проблемы с производительностью при загрузке страницы, но если это проблема, конечно, зависит от того, сколько привязок у вас есть и как выглядит код.

0
ответ дан 14 December 2019 в 19:12
поделиться

Вы можете потерять некоторую производительность на стороне клиента (анализ файла, выполнение обработчика подготовки документа), но это улучшает кэширование на клиенте (т. Е. файл не нужно передавать более одного раза). Это также сохраняет поиск сервера. Я думаю, что это скорее преимущество, чем недостаток, если вы можете быть уверены, что случайно не измените объекты.

0
ответ дан 14 December 2019 в 19:12
поделиться

Удалите суффикс : link , и вы должны быть в порядке:

#mydiv { background-color:blue; }
#mydiv a { color:white; }

Либо вы можете добавить имя класса к ссылке:

<div id="mydiv"> 
    <%= Html.ActionLink("Some Text", "SomeAction", 
            new { @class = "class-name" }) %> 
</div> 
-121--3036598-

В Scala можно моделировать , если с правильной оценкой побочных эффектов с помощью аргументов call-by-name.

def If[A](cond : Boolean, truePart : => A, falsePart : => A) = if (cond) truePart else falsePart

Эта функция также может использоваться для моделирования партий новых структур управления .

-121--2461711-

Я думаю, что механизм селектора достаточно быстр, чтобы вы, или кто-либо еще, не заметили разницы.

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

0
ответ дан 14 December 2019 в 19:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: