2011-01-22 2 views
1

Пожалуйста, помогите мне с следующей проблемой:jquery selector не работает при замене html!

<!-- this is the visible code --> 
<div id="divid">{some default content}<img class="img" src="GoNextArrow.jpg" alt=""></div> 

<!-- this is a hidden list of contents --> 
<div style="display: none;"> 
    <div id="divid1">{some content 1}<img class="img" src="GoNextArrow.jpg" alt=""></div> 
    <div id="divid2">{some content 2}<img class="img" src="GoNextArrow.jpg" alt=""></div> 
    <div id="divid3">{some content 3}<img class="img" src="GoNextArrow.jpg" alt=""></div> 
    <div id="divid4">{some content 4}<img class="img" src="GoNextArrow.jpg" alt=""></div> 
    <div id="divid5">{some content 5}<img class="img" src="GoNextArrow.jpg" alt=""></div> 
</div> 

<!-- this is an jquery script which replace the #divid with any of divid1-divid5 --> 
$('#divid').hide().html(elem.html()).fadeIn(); 
<!-- elem is a variable, divid1 to divid5, e.g. var elem = $j('#divid'+id); --> 

<!-- I need a rollover effect, I made it so: --> 
$('img.img').hover(function() { 
    $(this).attr('src', 'GoNextArrowHover.jpg'); 
}, function() { 
    $(this).attr('src', 'GoNextArrow.jpg'); 
}); 

Это хорошо работает для первого сНу дивиде, но не для divid1-divid5, когда они загружены вместо дивиде. Где моя ошибка ??

Спасибо!

+0

Можете ли вы реализовать код, демонстрирующий проблему в http://jsfiddle.net/, чтобы помочь в отладке, пожалуйста, – Hawxby

ответ

2

Использование delegate()(docs) для управления событиями внутри divid контейнера.

$('#divid').delegate('img.img','mouseenter',function() { 
    $(this).attr('src', 'GoNextArrowHover.jpg'); 
}) 
    .delegate('img.img','mouseleave', function() { 
    $(this).attr('src', 'GoNextArrow.jpg'); 
}); 

Или, если это возможно, сделать <img> в <a> элемент вместо этого, и просто сделать это с помощью CSS, используя background-image свойство:

#divid > div > a { 
    background-image:url(GoNextArrow.jpg); 
    background-repeate:no-repeat; 
} 
#divid > div > a:hover { 
    background-image:url(GoNextArrowHover.jpg); 
} 

Вам нужно несколько больше свойств, чтобы сделать это только право

+0

Использование .delegate() - хорошая идея ... Я новичок в jquery, я не знал о .delegate(). Благодаря! –

+1

@ Денис: Добро пожаловать. Вы всегда можете использовать '.delegate()' вместо '.live()'. Они оба используют * событие делегирование *, но '.delegate()' давайте вам сосредоточить его на определенной части страницы, чтобы это был более эффективный подход. – user113716

0

При использовании .html() заменить содержимое элемента, вы создаете новые дочерние элементы (img в вашем случае), так что вам нужно пересвязать ваш hover обработчик нового img элемента после каждого вызова .html().

0

Используйте jQuery live, чтобы связать попытку наведения. Live mens, что функция будет применяться ко всем будущим элементам, которые также соответствуют селектору.

http://api.jquery.com/live/

$ (селектор) .live ('парения', функция() {});

+0

Это не сработает, потому что 'hover' не является реальным событием; кроме того, 'hover' требует двух обратных вызовов, в то время как' live' принимает только один. – casablanca

+0

Он может в последней версии jQuery –

+0

С сайта: Начиная с jQuery 1.4.1 может быть указано событие hover (сопоставление с mouseenter и mouseleave, которые, в свою очередь, отображаются на мышь и мышь). –

1

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

$('.hoverme').live('hover', function(event) { 
    if (event.type == 'mouseenter') { 
     $(this).attr('src', 'GoNextArrowHover.jpg'); 
    } 
    else { 
     $(this).attr('src', 'GoNextArrow.jpg'); 
    } 
}); 
+0

Ваша вторая функция: ваша передача не будет иметь никакого эффекта, потому что '.live()' может принимать только один обработчик. – user113716

+0

Я не собираюсь выбирать вас, o), но, вероятно, следует отметить, что ваше обновление не будет работать после jQuery 1.4.2. По какой-то странной причине (IMO) они начали сообщать о событии как «mouseenter» в 1.4.3. – user113716

+1

исправлено, спасибо !! – jondavidjohn

0

Вы можете посмотреть в использовании replaceWith():

$('#divid').hide().replaceWith(elem.fadeIn()); 

Если вы уже связаны функции к событиям на elem, те должны сохраняться даже после того, как вы поменялись местами elem для другого элемента на странице.

Пример: http://jsfiddle.net/redler/eLD9A/

Смежные вопросы