Когда вы вызываете методы .click()
или .hover()
(или .keyup()
и т. Д.), JQuery назначает обработчик для любых элементов, которые соответствуют селектору ('.color'
в вашем случае) на данный момент . Это не относится ни к каким элементам, добавленным в будущем, или к существующим элементам, которые в настоящее время не соответствуют, но которые позже изменены. Он также не удаляет обработчик кликов автоматически из элементов, измененных, чтобы больше не соответствовать этому селектору.
К счастью, есть три способа назначить обработчик так, чтобы он работал для элементов, добавленных в будущем: .on()
, .delegate()
и .live()
- если вы используете jQuery 1.7+, вы должны использовать .on()
, в противном случае используйте .delegate()
, потому что .live()
устарела (и я упоминаю это только для полноты). В общих чертах, как работают все три, они назначают обработчик элементу контейнера, а затем, когда происходит событие, они проверяют, соответствует ли целевой элемент селектору, который вы указали изначально. Это означает, что все три позволяют вам определить свой обработчик один раз и автоматически применить его к элементам, добавленным в будущем. (Опять же для полноты я должен упомянуть, что .on()
делает больше, чем это, в зависимости от параметров, которые вы передаете - для полной информации читайте страницу документа.)
Так или иначе, чтобы исправить свой код, попробуйте это:
// if your elements have an appropriate container, then specify it
// like so:
$('#yourcontainer').on('hover', '.color .selected', function(){
$(".color span").css('background-position', '0px -24px');
},
function() {
$(".color span").css('background-position', '0px 0px');
});
// OR, if you don't have a container and don't want to add one
// just specify document:
$(document).on('hover', '.color .selected', function(){
// etc
Несмотря на то, что я не уверен, что вы можете назначить "hover" с помощью .on()
, .delegate()
или .live()
: вам, возможно, придется назначить "mouseenter" и "mouseleave" вместо этого.
РЕДАКТИРОВАТЬ: Относительно того, что вы делаете, добавляя пустой промежуток: вы, кажется, пытаетесь использовать это как флаг на вашем элементе. намного лучший способ сделать это - просто добавить и удалить другой класс к вашему элементу, используя .addClass()
и .removeClass()
.