Чувствительность jQuery к несвязанным селекторам CSS

Я работал над форком этой скрипки - все реквизиты идут к первоначальному автору.

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

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

Путем множества проб и ошибок (я не очень хорош в JS!), Я понял, что, в частности, когда Drupal добавляет класс 'menu-глубина-1' в li, скрипт теряется и выдает ошибку (из Chrome):

Uncaught Error: Syntax error, unrecognized expression: area[name=part-1 menu]

В этой ветке вышеописанного сценария все, что я добавил, - это разметка, которую добавляет Drupal.

http://jsfiddle.net/PUncle/Tr4hE/32/

Изменение исходного скрипта из:

<li class="menu-item-a"><a href="#">Part A</a></li>

Для того, чтобы:

<li class="leaf menu-depth-1 menu-item-a"><a href="#">Part A</a></li

Насколько я понимаю, скрипт ищет дефисный селектор, и когда он сталкивается с "menu-глубина-1", прежде чем он доберется до нужного "menu-item-a", он завершается неудачей.

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

function highlightArea(key) {
    $('area[name=part-' + key + ']').mouseenter();
    $('a').removeClass('hover');
    $('li.menu-item-' + key + ' a').addClass('hover');
}

Что мне нужно сделать, так это "укрепить" скрипт, чтобы он был очень специфичным для определенного селектора и игнорировал все остальное.

Я начал идти по пути очистки чрезмерной разметки меню в Drupals, но решил, что очистка пути для "тупого" кода, вероятно, не так эффективна, как заострение этого кода, чтобы ничто другое не могло на него повлиять!

Любые указатели будут с благодарностью.

2 ответа

Попробуй это

        $('a').hover(function () {
            var parts = $(this).closest('li').attr('class').split(' ');
            var parts1 = parts[1].split('-');
            var part = parts1[2];
            highlightArea(part);
        });

        //
        $('a').mouseleave(function () {
            var parts = $(this).closest('li').attr('class').split(' ');
            var parts1 = parts[1].split('-');
            var part = parts1[2];
            highlightAreaX(part);
        });

Селектор выглядит подозрительно. Разве ты не имел в виду

area[name="part-1 menu"]

(Я столкнулся с проблемами с такими селекторами уже сам, когда без скобок), или

area[name=part-1] menu

?

Другие вопросы по тегам