Несколько селекторов или несколько функций - какое-либо увеличение эффективности?

Я задаюсь вопросом если его возможное для создания следующего кода более кратким:

 $('#americasTrigger').hover(
  function () {
          $('#americasImg').fadeIn()
      },
  function(){
          $('#americasImg').fadeOut()
  }
  );

$('#europeTrigger').hover(
  function () {
      $('#europeImg').fadeIn();
  },
  function(){
      $('#europeImg').fadeOut();
  }
  );    

$('#middleEastTrigger').hover(
  function () {
      $('#middleEastImg').fadeIn();
  },
  function(){
      $('#middleEastImg').fadeOut();
  }
  );    

//More etc

Название страны остается таким же для каждого с 'Триггером' или 'Img', добавленным в конец. Существует большое повторение здесь, которое указывает мне, я не иду об этом лучшем способе.

У меня были мысли вокруг:

  • Crearting вариант развития событий, или
  • Так или иначе получая селектор, используемый для выбора, делая это строкой, разделяя, это - имя для получения страны, используемой и применяющейся, которые к вложенному постепенному появлению / функционируют с 'Img' на конце.

Это возможно, или я слишком необычен?

Редактирование 1: Спасибо verymuch для всех ответов, извинений за то, что не был отправлен HTML, я поместил этот рев. Короче говоря я использую карты изображения по изображению bg (земли), поскольку парение инициировало для исчезновения в / моих абсолютно расположенных изображениях на парении.

<div class="mapTub"> 

  <img src="images/transparentPixel.png" class="mapCover" usemap="#worldMap" width="524px" height="273px"/>

  <map name="worldMap" id="worldMap">
    <area id="americasTrigger" shape="poly" coords="1,2,3" href="#americas" />
    <area id="europeTrigger" shape="poly" coords="4,5,6" href="#europe" />
    <area id="middleEastTrigger" shape="poly" coords="7,8,9" href="#middleEast" />
  </map>

<img src="images/International_americas_dark.png" class="americas" id="americasImg" />
<img src="images/International_europe_dark.png" class="europe" id="europeImg" />
<img src="images/International_middleEast_dark.png" class="middleEast" id="middleEastImg"  />

</div>

Ответ Reigel кажется, что способ пойти сюда, плохо испытать его сообщают, дальнейшие приветствующиеся комментарии!:)

9
задан demolish 7 April 2014 в 23:29
поделиться

4 ответа

Я, не зная html, предлагаю это ...

$('#americasTrigger, #europeTrigger, #middleEastTrigger').hover(
    function () {
        var id = this.id;
        $('#'+id.replace('Trigger', 'Img')).fadeIn();
        //$('#'+id.slice('0',id.indexOf('Trigger'))+'Img').fadeIn();
    },
    function(){
        var id = this.id;
        $('#'+id.replace('Trigger', 'Img')).fadeOut();
        //$('#'+id.slice('0',id.indexOf('Trigger'))+'Img').fadeOut();
    }
);

Вы также можете использовать .replace () , как было предложено Анурагом в комментарии ниже ...


id ='europeTrigger';
alert(id.slice('0',id.indexOf('Trigger'))); // alerts 'europe'
// '#'+id.slice('0',id.indexOf('Trigger'))+'Img' is '#europeImg'

демонстрация

2
ответ дан 3 November 2019 в 07:46
поделиться

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

Спасибо @Andy за указание на снижение производительности в предыдущей версии с использованием $(...).each.

var regions = ['americas', 'europe', 'middleEast'];

$.each(regions, function(region) {
    var trigger = id(region, 'Trigger');
    var image = id(region, 'Image');

    $(trigger).hover(
        effect(image, 'fadeIn'),
        effect(image, 'fadeOut'),
    );
});

function effect(selector, method) {
    return function() {
        $(selector)[method]();
    };
}

function id(prefix, suffix) {
    return '#' + prefix + suffix;
}

Если вы можете изменить HTML, я бы закодировал все знания в самой странице, и просто использовал jQuery для настройки событий hover.

<div class='trigger' data-image='#americasImg'>
   ..
</div>
<div class='trigger' data-image='#europeImg'>
  ..
</div>

Javascript

function imageId(elem) {
    return $(elem).attr('data-image');
}

// Using the fade function from before
$('.trigger').hover(
    effect(imageId(this), 'fadeIn'),
    effect(imageId(this), 'fadeOut')
);
0
ответ дан 3 November 2019 в 07:46
поделиться

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

var lookmeup = [  [$('#americasTrigger'), $('#americasImg')],
                  [$('#europeTrigger'), $('#europeImg')],
                  [$('#middleEastTrigger'), $('#middleEastImg')]
               ];

$.each(lookmeup, function(index, element){
    element[0].hover(function(){
      element[1].fadeIn();
    }, function(){ 
      element[1].fadeOut();
    });
});

СУХОЙ! все сделано!

Еще один способ сделать это более эффективным - использовать делегирование событий .

Если все ваши элементы hover имеют одинаковый TAG , этот подход может быть полезен:

$(document.body).delegate('div', 'mouseenter', function(e){
     $('#' + e.target.id.replace(/Trigger/, 'Img')).fadeIn();
});

$(document.body).delegate('div', 'mouseleave', function(e){
     $('#' + e.target.id.replace(/Trigger/, 'Img')).fadeOut();
});

Предполагая, что все ваши элементы « hoverable » были DIV с. Вы все равно должны дать этим элементам имя класса , чтобы нацелены были только эти определенные элементы.

Имеет смысл ограничить корневой элемент для delegate () . Здесь я использую document.body , что и .live () . Самое замечательное в .delegate () заключается в том, что если ваши элементы при наведении курсора используют один родительский узел, вы можете применить delegate () к этому узлу. Таким образом вы уменьшите количество связанных обработчиков событий

(2 вместо 6).

2
ответ дан 3 November 2019 в 07:46
поделиться

Или, чтобы упростить задачу, добавьте класс маркера, например, «fadingImage», к каждому из изображений, а затем используйте этот код ...

$('.fadingImage').hover( 
    function () { 
        $(this).fadeIn() 
    }, 
    function(){ 
        $(this).fadeOut() 
    } 
); 

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

Обновление: Нет, я проснулся (спасибо, jAndy & Reigel!), Я исправлю свой пост, чтобы учесть тот факт, что зависший элемент не тот, который исчезает.

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

<div>
    <span class="fadingTrigger">first text to hover over<span>
    <img class="fadingImage" src="..." alt="first image to be faded"/>
<div>
<div>
    <span class="fadingTrigger">second text to hover over<span>
    <img class="fadingImage" src="..." alt="second image to be faded"/>
<div>

$('.fadingTrigger').hover( 
    function () { 
        $(this).parent().find(".fadingImage").fadeIn() 
    }, 
    function(){ 
        $(this).parent().find(".fadingImage").fadeOut() 
    } 
); 

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

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

0
ответ дан 3 November 2019 в 07:46
поделиться
Другие вопросы по тегам:

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