2015-04-21 2 views
1

Так что я создаю функцию, которая будет увеличивать изображение при нажатии и сжимать изображение при повторном нажатии.JQuery изображение всплывающий код, удаление классов на клик, отказываясь работать

Это основной CSS для обоих больших и маленьких изображений:

.bigpic { 
position: absolute; 
width:40%; 
z-index: 100; 
} 
.smallpic { 
width:20%; 
} 

И это JQuery:

$(document).ready(function() { 

$('.smallpic').click(function() { 
    $('.bigpic').removeClass('bigpic'); 
    $(this).removeClass('smallpic'); 
    $(this).addClass('bigpic'); 
    $('body').append("<button class='imgbutton'>Close</button>"); 
    }) 

$('.bigpic').click(function() { 
    $(this).addClass('smallpic'); 
    $(this).removeClass('bigpic'); 
    }) 
$('.imgbutton').click(function() { 
    $('.bigpic').addClass('smallpic') 
    $('.smallpic').removeClass('bigpic') 
}) 
}); 

Как вы можете видеть, что я сделал это добавить «биографический фильм» и удалить «smallpic» классы, я также пробовал как альтернативный метод, добавляя кнопку, которая закрывала бы ее. Однако ни одно из способов нажатия на изображение или кнопку не вернет изображение в прежнее состояние.

+0

Добавить точку с запятой после щелчка() ЭВТ привязок –

+0

@EricLease Я немного забывчивый о том, что иногда, спасибо за напоминание! –

ответ

-1

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

Один из способов решения этой проблемы - использовать делегирование событий. Другой способ - изменить вашу логику.

С делегацией событий, вы связать обработчик предка элементов, но есть обработчик выполнить только тогда, когда click событие происходит на этих элементах:

$(document).on('click', '.smallpic', function() { 
    $('.bigpic').removeClass('bigpic'); 
    $(this).removeClass('smallpic'); 
    $(this).addClass('bigpic'); 
    $('body').append("<button class='imgbutton'>Close</button>"); 
}); 

$(document).on('click', '.bigpic', function() { 
    $(this).addClass('smallpic'); 
    $(this).removeClass('bigpic'); 
}); 

Но, возможно, лучше всего было бы добавить a pic класс для всех элементов изображения и привязка одного обработчика события. Вы можете использовать .toggleClass() для переключения классов или даже использовать .hasClass() для выполнения другой условной логики.

$('.pic').click(function() { 
    var $img = $(this); 
    $img.toggleClass('bigpic'); 
    $img.toggleClass('smallpic'); 
}); 
+0

Большое спасибо, что многое сделало намного понятнее! Рад, что есть легкое решение проблемы, которую я пытался исправить в течение недели сейчас.: D –

+0

@JohnS Это могло быть правдой в более старых версиях jQuery, где '.bind',' .live'. и '.delegate' должны были прикреплять обработчики событий по мере добавления элементов в DOM. Однако, по состоянию на v1.7, делегирование делегирования происходит автоматически с '.on'. И '.click' и' .on ('click') 'взаимозаменяемы. Поэтому большая часть этого ответа - красная селедка, если использовать относительно современную версию jQuery. –

+0

@EricLease - Делегирование событий не происходит автоматически с '.on()'; Вы должны привязать событие к элементу предка, а затем указать параметр 'selector', чтобы идентифицировать потомков. Из [jQuery documentation] (http://api.jquery.com/on/#direct-and-delegated-events): «Если' selector' опущен или имеет значение null, обработчик события называется _direct_ или _directly -bound_. [...] Когда предоставляется 'selector', обработчик события называется _delegated_." Если вы сравните код в вопросе с кодом в моем ответе, вы увидите, что я не просто изменил '.click (' to '.on ('click','. –

2

Как насчет переключаясь между классами:

$('.imgbutton').click(function() { 
    $(this).toggleClass('smallpic bigpic'); 
}) 
+0

Если бы я знал, что это существовало! , благодаря :) –

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