2012-02-04 3 views
3

Это код в моем HTML файл:Jquery затрагивает все элементы с таким же именем

<div id="centerBlock"> 
     <block> 
      <site style="padding-top: 10px; margin-left: 20px"> 
       <img src="./images/site1.png" alt="some_text"/> 
      </site> 
      <textOnImage style="padding-top: 10px; margin-left: 20px"> 
       lolol 
      </textOnImage> 
     </block> 

     <block> 
      <site style="padding-top: 163px; margin-left: 20px"> 
       <img src="./images/site1.png" alt="some_text"/> 
      </site> 
      <textOnImage style="padding-top: 163px; margin-left: 20px"> 
       lolol 
      </textOnImage> 
     </block> 

    </div> 

И это мой JavaScript:

$("block").mouseenter(function(){   
    $("site").fadeTo("slow", 0.25); 
    $("textOnImage").animate({ 
     opacity: "1" 
    }, 600); 
}); 

$("block").mouseleave(function(){   
    $("site").fadeTo("slow", 1); 
    $("textOnImage").animate({ 
     opacity: "0" 
    }, 600); 
}); 

Однако, когда я наведите курсор мыши на один из двух блоков элементы они оба спускаются в непрозрачность, и когда я отворачиваю свою мышь от них, они возвращаются в исходное состояние. Я искал часы, и я на 100% уверен, что искал неправильные условия. Как я могу сделать это индивидуально?

+0

, потому что вы не давая какие-либо конкретные DIVS идентификаторов, что отбор идет для всех – kobe

+0

Я новичок к jquery, можете ли вы сказать мне, как я это сделаю? – Ridz

+1

этот сайт довольно быстр и имеет много умных людей, я собирался ввести ответ, но у вас уже есть то, что вы ищете – kobe

ответ

4

Используйте this для таргетинга только на блок, инициировавший событие, а затем используйте .find(), чтобы найти нужный элемент в этом конкретном блоке. То, как вы делали это раньше, очевидно находило все элементы site и все элементы textOnImage на всей странице не только те, что были в блоке, вызвавшем событие.

$("block").mouseenter(function(){   
    var $this = $(this); 
    $this.find("site").fadeTo("slow", 0.25); 
    $this.find("textOnImage").animate({ 
     opacity: "1" 
    }, 600); 
}); 

$("block").mouseleave(function(){   
    var $this = $(this); 
    $this.find("site").fadeTo("slow", 1); 
    $this.find("textOnImage").animate({ 
     opacity: "0" 
    }, 600); 
}); 
+0

@Ridz, как отправлено jfriend, это относится к текущему объекту или текущему контексту.Если вы делаете mousenter на блоке, в этот момент это относится к элементам внутри этого – kobe

+0

Так же, как и с другими ответами, это повлияет только на второй «блок»:/ – Ridz

+0

@Ridz - он работает так, как ожидается здесь: http : //jsfiddle.net/jfriend00/ZLepq/. Если он не работает на вашей фактической странице, то что-то не так с вашим кодом/HTML, что вы не показываете нам. – jfriend00

2

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

$("block").mouseenter(function(){   
    $(this).find("site").fadeTo("slow", 0.25); 
    $(this).find("textOnImage").animate({ 
     opacity: "1" 
    }, 600); 
}); 

$("block").mouseleave(function(){   
    $(this).find("site").fadeTo("slow", 1); 
    $(this).find("textOnImage").animate({ 
     opacity: "0" 
    }, 600); 
}); 

В обработчике события, this является ссылкой на элемент, к которому привязан обработчик.

Возможно, вы использовали .children() вместо .find(), так как целевые элементы находятся на одном уровне.


Примечание стороны, вы можете использовать .hover() и передать две функции, как это ..

$("block").hover(function(){   
    $(this).find("site").fadeTo("slow", 0.25); 
    $(this).find("textOnImage").animate({ 
     opacity: "1" 
    }, 600); 
}, 
    function(){   
    $(this).find("site").fadeTo("slow", 1); 
    $(this).find("textOnImage").animate({ 
     opacity: "0" 
    }, 600); 
}); 

Вы, вероятно, также хотят, чтобы добавить некоторые .stop() вызовы перед вашими fadeTo и animate вызовов, в противном случае, когда вы быстро и быстро наводите указатель мыши, анимации будут скопированы в очередь.

+0

Нет, извините, но это не работает. Используя find, это повлияет только на второй «блок», и с помощью детей ничего не произойдет ... – Ridz

+0

@Ridz: Что ты имеешь в виду? Затем обработчики привязаны к '' block '', а не к' "centerBlock" '. –

+0

Спасибо, что сделали код более компактным. Я собирался искать что-то, что остановило бы анимацию очереди. Но, опять же, это влияет только на второй «блок». Под блоком я подразумеваю элемент, начинающийся с 163 пикселей. – Ridz

2

Попробуйте это (предоставить this контекст выбор Jquery для целевого конкретных элементов):

$("block").mouseenter(function(){   
    $("site", this).fadeTo("slow", 0.25); 
    $("textOnImage", this).animate({ 
     opacity: "1" 
    }, 600); 
}); 

$("block").mouseleave(function(){   
    $("site", this).fadeTo("slow", 1); 
    $("textOnImage", this).animate({ 
     opacity: "0" 
    }, 600); 
}); 
+0

То же, что и с ответом am not i am, это повлияет только на второй «блок». – Ridz

+0

@Ridz: Вы оставили тот же комментарий по всем трем ответам. Вам пришло в голову, что, поскольку все ответы фактически одинаковы, возможно, они одинаковы по причине? [Вот демонстрация] (http://jsfiddle.net/PpjSe/), чтобы вы видели, как он работает. –

+0

Я удалил абсолютный атрибут позиции в файле css и теперь, похоже, работает ... Неловко, но спасибо всем :) – Ridz

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