Изменение размера элемента при клике
Доброго времени суток! 3 дня не ем и не сплю пытаюсь сделать такую вещь:
есть элемент, при клике на него необходимо сделать увеличение его размеров, и уменьшение при очередном клике. НО! необходимо также сделать уменьшение, если человек щелкнул мышью вне этого элемента на экране. Все это должно работать одновременно. Сейчас код выглядит примерно так:
$('.float').click(function() {
$('.float').toggleClass('size');
});
При клике добавляю/убираю класс с увеличенным размером. Как сделать еще клик со свободной областью ума не приложу. Если делать общий клик по документу то он перебивает клик по селектору. Помогите пожалуйста! Заранее благодарен! |
Вероятно не самый лучший вариант..
<style>
.float{height: 20px;background: yellow}
.size{height:100px}
</style>
<div class="float"></div>
<script>
(function(){
var onDocumentClick = function() {
setTimeout(function(){
element.addEventListener('click', onElementClick);
});
document.removeEventListener('click', onDocumentClick);
element.classList.remove('size');
};
var onElementClick = function() {
setTimeout(function(){
document.addEventListener('click', onDocumentClick);
});
element.removeEventListener('click', onElementClick);
element.classList.add('size');
};
var element = document.querySelector('.float');
element.addEventListener('click', onElementClick);
})();
</script>
|
Спасибо за решение, буду сидеть разбираться... делаю на jquery, поэтому для чистого js нужно немного вникнуть.
|
Единственное, что возможно вызывает непонимание - это setTimeout в onElementClick.
Без него, событие тут же отрабатывает на документе и логика ломается. Вместо setTimeout() можно просто остановить всплытие события: event.stopPropagation(); Причем в обработчике onDocumentClick setTimeout лишний - его можно удалить. |
еще решение
<body>
<style>
.float {
height: 20px;
background: yellow
}
.size {
height:100px
}
</style>
<div class="float"></div>
<script>
(function () {
var element = document.querySelector('.float');
document.onclick = function (e) {
var target = e && e.target || e.srcElement;
element.classList[target.className == 'float' ? 'add' : 'remove']('size');
return false;
}
})();
</script>
</body>
|
Забыл отметить что addEventListener нету в IE8, а classList - нету даже в IE9, и в старых версиях других браузеров. (но для всего этого есть костыли (polyfills))
Poznakomlus, твой вариант на мой взгляд, ибо нерационально - ловить все клики, когда есть возможность ловить не все. |
|
Цитата:
<head>
<style>
.float {
height: 20px;
background: yellow
}
.size {
height:100px
}
</style>
</head>
<body>
<a href="http://mail.ru">Mail.ru</a>
<div class="float"></div>
<script>
(function () {
var element = document.querySelector('.float');
document.onclick = function (event) {
event = event || window.event;
var target = event.target || event.srcElement;
element.className = 'float' + (target.className == 'float' ? ' size' : '');
return target.tagName == 'A';
}
})();
</script>
</body>
http://learn.javascript.ru/play/7BWXn Поправил исходя из советов danik.js ниже |
<зануда_mode>
1) Элемент <style> не должен быть внутри <body> (разве что с атрибутом scoped) 2) Твой скрипт отключит переход по ссылкам, так как ты предотвращаешь действие по умолчанию 3) Нет смысла переобъявлять переменную event (она уже объявлена как параметр) </зануда_mode> |
Цитата:
Можешь открыть инспектор и убедиться в этом. Хотя в общем то ничто не мешает поместить его в любое место скриптом в уже сформированном DOM-е. Между прочим, такая запись будет правильной: <style>/* тут стили */</style> <div>тут содержимое body</div> Браузер автоматом сформирует <head> и <body>, причем ошибок парсинга не возникнет, в отличие от твоего варианта. |
| Часовой пояс GMT +3, время: 10:27. |