Как сделать этот работающий Java-скрипт более эффективным

0

У меня есть рабочий сценарий jQuery, который работает нормально, что означает его назначение.

Вопрос в следующем: как сделать этот скрипт более эффективным?

В настоящее время скрипт активируется в тот момент, когда пользователь накладывает указатель мыши на (hover) определенный тег раздела HTML5 с идентификатором. В настоящий момент сценарий удаляет существующий класс с именем "noDisplay" из подчиненного навигационного тега, содержащего список подменю, поэтому содержимое становится видимым для пользователя. Этот список подменю может быть от трех до четырех уровней. Подменю хранятся в классах (subMenu1, subMenu2, subMenu3, subMenu4 и т.д.). Сценарий записывается для индивидуального обслуживания каждого из указанных идентификаторов раздела и его классов подуровня.

В основном сценарий взаимодействует с DOM, удаляя класс "noDisplay" при наведении мыши и восстанавливая тот же класс при уходе с мыши. (Пробовал дать четкое объяснение. Если нет, спросите.)

Вот описание JSfiddle: введите ссылку здесь

Я надеюсь, что кто-то может предложить способ сделать это гораздо эффективнее. Возможно, с большим количеством разделов (# ID) и subMenu-уровней (класс за уровень).

Использование отображения свойств CSS: none; и 'display: block;' было бы самым простым решением, но это нежелательно, потому что поисковый робот решил отказаться от содержимого, помеченного как невидимое для пользователя или на экране. Используемый здесь класс NoDisplay сохраняет контент невидимым для пользователей и сохраняет читаемость для читателей (и, следовательно, для большинства поисковых роботов).

Таким образом, в основном функция скрипта остается так же, как удалить и добавить класс "noDisplay" при наведении. Цель состоит в том, чтобы получить более эффективный сценарий, который мог бы использовать переменные экземпляра для каждого раздела вместо того, чтобы писать код для каждого нового раздела и, следовательно, расширять текущий скрипт.

//section1$("#section1 .NavUL1 .subMenu1").hover(function(){
    $(".NavUL2").removeClass("noDisplay");            //display
    },function(){
    $(".NavUL2").addClass("noDisplay");            //no display
});
$("#section1").hover(function(){
    $("#section1 .NavUL1").removeClass("noDisplay");            //display
    },function(){
    $("#section1 .NavUL1").addClass("noDisplay");            //no display
});
$("#section1 .NavUL1 .subMenu1").hover(function(){
    $(".NavUL2").removeClass("noDisplay");            //display
    },function(){
    $(".NavUL2").addClass("noDisplay");            //no display
});
//#section2
$("#section2").hover(function(){
    $("#section2 .NavUL1").removeClass("noDisplay");            //display
    },function(){
    $("#section2 .NavUL1").addClass("noDisplay");            //no display
});
$("#section2 .subMenu1").hover(function(){
    $(".subMenu1 .NavUL2").removeClass("noDisplay");            //display
    },function(){
    $(".subMenu1 .NavUL2").addClass("noDisplay");            //no display
});
$("#section2 .subMenu2").hover(function(){
    $(".subMenu2 .NavUL2").removeClass("noDisplay");            //display
    },function(){
    $(".subMenu2 .NavUL2").addClass("noDisplay");            //no display
});
$("#section2 .subMenu3").hover(function(){
    $(".subMenu3 .NavUL2").removeClass("noDisplay");            //display
    },function(){
    $(".subMenu3 .NavUL2").addClass("noDisplay");            //no display
});
$("#section2 .subMenu4").hover(function(){
    $(".subMenu4 .NavUL2").removeClass("noDisplay");            //display
    },function(){
    $(".subMenu4 .NavUL2").addClass("noDisplay");            //no display
});
  • 0
    Ваше использование класса и идентификатора кажется выключенным. идентификаторы уникальны, в то время как класс является общим
  • 0
    Я знаю это. Здесь это специально, поскольку разделы уникальны, поскольку классы для subMenu1 (-x) и NavUL1 (-x) не являются уникальными.
Показать ещё 1 комментарий

3 ответа

1
Лучший ответ

Я бы рекомендовал просто использовать CSS, не должно быть необходимости в JS:

nav ul{
    position: absolute;
    border: 1px solid #444444;
    box-shadow: 8px 8px 11px #222222;
    background: #888;
    padding: 0.5em 0.5em 0.5em 0em;
    list-style-type: none;
    margin-left: 15%;
    display: none;
}
.sectionBox:hover nav > ul, nav li:hover > ul {
    display: block;
}

Это устраняет все идентификаторы и классы при сохранении того же эффекта. Теперь вы html выглядите так (просто фрагмент):

<ul>
    <li><h2>various whatever1</h2></li>
    <li><a href="localhost">link11</a></li>
    <li><a href="localhost">link12</a></li>
    <li><a href="localhost">link13</a></li>
    <li><a href="localhost">link14</a></li>
    <li><h2>sub1</h2>
        <ul>
            <li><a href="localhost">sub1-link11</a></li>
            <li><a href="localhost">sub1-link12</a></li>
            <li><a href="localhost">sub1-link13</a></li>
            <li><a href="localhost">sub1-link14</a></li>
        </ul>
    </li>
</ul>

Здесь он работает: http://jsfiddle.net/VGXNz/1/

Обновить:

Если вы хотите использовать свои оригинальные стили noDisplay это будет CSS:

nav ul{
    position:absolute;
    border: 0;
    clip: rect(0 0 0 0);
    width: 1px;
    height: 1px;
    margin: -1px;
    overflow: hidden;
    padding: 0;
}
.sectionBox:hover nav > ul, nav li:hover > ul{
    height: auto;
    width: auto;
    margin: 0 0 0 15%;
    border:1px solid #444444;
    box-shadow:8px 8px 11px #222222;
    background:#888;
    padding:0.5em 0.5em 0.5em 0em;
    list-style-type:none;
    clip: auto;
    overflow: visible;
}

Здесь скрипка: http://jsfiddle.net/KKmVU/1/

  • 0
    В моем вопросе я объясняю, что "Использование свойства CSS" display: none; ' было бы самым простым решением, но это не желательно ". Извините, это не ответ.
  • 0
    @snahl - я обновил свой ответ, чтобы не использовать display: none; ,
Показать ещё 3 комментария
3

Мое предложение состояло в том, чтобы создать новый класс, называть его любым, но в демонстрационных целях мы будем называть его hover-class

Тогда это становится простым:

$('.hover-class').hover(
    function() { $(this).addClass('noDisplay'); },
    function() { $(this).removeClass('noDisplay'); }
);
  • 0
    Зачем кому-то отказывать в этом?
  • 0
    я не знаю, но +1 это правильный ответ
Показать ещё 3 комментария
0

почему вы используете js в первую очередь? Css отлично способен обрабатывать состояния наведения, а IMO вы всегда должны искать решение css, если оно есть.

Я сделал несколько быстрых (и грязных) изменений в вашей скрипке: http://jsfiddle.net/3epRN/1/

Я удалил кучу классов и id из разметки, удалил все js и немного изменил css. Соответствующий css выглядит так:

.sectionBox nav {
     display: none;   
}
.sectionBox:hover nav {
    display: block;
    position: absolute;
    top: 90%;
    left: 50px;
    background-color:#646464;
    z-index: 5;
}
.sectionBox nav ul ul {
    display: none;    
}
.sectionBox nav ul li {
    position: relative;
}
.sectionBox nav ul li:hover ul {
    display: block;
    position: absolute;
    top: 0;
    left: 80%;
    background-color:#646464;
    z-index: 5;
}

Очевидно, что это требует некоторой тонкости, но я уверен, что у вас есть идея...

редактировать
Должен признаться, я пропустил часть display:none для вас это не проблема. Я должен сказать, что я не согласен с вашими аргументами относительно того, почему (он используется al по сети, а сканеры и устройства для чтения с экрана в настоящее время достаточно умны).

Как ни странно, ничто не мешает вам использовать стили CSS, которые вы теперь используете, чтобы скрыть контент (добавив класс noDisplay) прямо в ваш css, где я использовал display:none; , и против этого, когда вы хотите отображать контент, добавив следующее вместо обычного display:block:

    height: auto;
    width: auto;
    clip: auto;
    overflow: visible;

Результат будет идентичен вашему решению js. Я обновил свою скрипку, чтобы продемонстрировать: http://jsfiddle.net/3epRN/2/

  • 0
    То же самое здесь: в моем вопросе я объясняю, что «Использование свойства CSS« display: none; » было бы самым простым решением, но это не желательно ". Извините, это не ответ.
  • 0
    Действительно, эта версия редактирования также работает, исключая java-скрипт и добавляя свойства CSS.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню