Переменная становится undefined внутри else

108
06 марта 2022, 16:20

Всем привет. Вот часть моего кода в jquery. Здесь должно происходить сокрытие блока menu влево, при нажатии кнопки, с помощью margin-left и, соответственно, увеличение размера блока article до 100% ширины экрана. При повторном же нажатии на эту кнопку, происходит обратное действие.

В чем проблема:

При первичном нажатии, все идет как надо. Переменная menuWidth прекрасно подставляется в css. Но вот при повторном нажатии, блок menu возвращается на свое место, а margin-left, который принадлежит article не понимает, что такое newMenuWidth (т.е. article не возвращается на свое место. Это можно увидеть по кнопке, которая остается на том же месте). Попытка изменить переменную на menuWidth тоже ничего не дает. Если выводить в консоль, то newMenuWidth и menuWidth до else имеют числовое значение, а после else принимают значение undefined.

Не понимаю, в чем проблема. Везде пишут, если переменная undefined, значит у нее нет значения. Но я же задаю ей значение через var. Не может же оно исчезнуть в той же функции. Помогите, пожалуйста, где я делаю ошибку?

$(document).ready(function() { 
    var menusWidth = $('.menu').width(); 
    $('.article').css("margin-left", menusWidth); 
    var menu = $(".menu"); 
    var article = $(".article"); 
    var sizeLine = $("#sizeLine"); 
     
    var curr_width = menu.width() 
    var unlock = false; 
     
    $(document).mousemove(function(e) { 
        $(".menu").css("transition", "0ms"); 
        var userCursor = parseFloat(e.clientX * 100 / screen.width); 
		  var change = userCursor*screen.width/100; 
          var textWidth = screen.width - change; 
		  var menuMin= screen.width/100*15; 
       if(unlock) { 
			    if(change > (menuMin-1)){ 
				    menu.css("width", change); 
                    article.css("width", screen.width-change); 
                    $('.article').css("margin-left", change); 
                        if (parseInt($('.article').css('margin-left')) > screen.width/100*40) { 
                            $('.article').css('margin-left', screen.width/100*40); 
                        } 
                    sizeLine.css("background-color", "rgba(0, 0, 0, 0.6)"); 
			    } 
			    else { 
				    menu.css("width", screen.width/100*15); 
                    article.css("width", screen.width/100*85); 
                    $('.article').css("margin-left", menusWidth); 
                    sizeLine.css("background-color", "rgba(0, 0, 0, 0.6)"); 
            } 
        } 
    }); 
 
    sizeLine.mouseenter(function(e) { 
        sizeLine.css("background-color", "rgba(0, 0, 0, 0.6)"); 
    }) 
 
    sizeLine.mouseleave(function(e) { 
        sizeLine.css("background-color", "rgba(0, 0, 0, 0)"); 
    }) 
 
    sizeLine.mousedown(function(e) { 
        curr_width = menu.width(); 
        unlock = true; 
    }); 
 
    $(document).mousedown(function(e) { 
        if(unlock) { 
            e.preventDefault(); 
        } 
    }); 
 
    $(document).mouseup(function(e) { 
        unlock = false; 
        sizeLine.css("background-color", "rgba(0, 0, 0, 0)"); 
    }); 
}); 
 
var num = 0; 
$('#menuButton').click(function() {  
    if (num%2 == 0) { 
        var menuWidth = $(".menu").width(); 
        $(".menu").css("margin-left", -menuWidth); 
        $(".menu").css("transition", "300ms"); 
        $(".article").css("width", screen.width); 
        $(".article").css("margin-left", 0); 
        num += 1;  
        var newMenuWidth = menuWidth; 
    } else { 
        $(".menu").css("width", newMenuWidth); 
        $(".menu").css("margin-left", 0); 
        $(".menu").css("transition", "300ms"); 
        $(".article").css("width", screen.width-newMenuWidth); 
        $(".article").css("margin-left", newMenuWidth); 
        num += 1; 
    } 
});
body { 
	margin: 0; 
	padding: 0; 
	width: 100%; 
	height: 100%; 
	display: flex; 
	font-family: 'Helvetica','Sans-Serif';  
} 
 
.menu { 
	width: 15%; 
	min-width: 290px; 
	max-width: 40%; 
	height: 100vh; 
	background: #f2f2f2; 
	font-size: 18px; 
	display: flex; 
	justify-content: space-between; 
	resize: horizontal; 
	overflow: none; 
	position: fixed; 
} 
 
.menu::-webkit-scrollbar { 
  display: none; 
} 
 
 
.treeMenu { 
	margin: 40px 0 5px -20px; 
} 
 
#sizeLine { 
    float: right; 
    margin-right: 0; 
    width: 5px; 
    height: 100%; 
    background-color: rgba(0, 0, 0, 0); 
    z-index: 1; 
    cursor: e-resize; 
} 
 
.article { 
	display: flex; 
	flex-direction: column; 
	width: 85%; 
	min-width: 60%; 
	height: 100vh; 
	background: #ffffff; 
} 
 
.header { 
	height: 60px; 
	position: sticky; 
	top: 0; 
} 
 
#menuButton { 
	width: 30px; 
	height: 40px; 
	border: 0; 
	margin: 5px 0 0 10px; 
	background: #666666 no-repeat center; 
	cursor: pointer; 
	opacity: 0.5; 
} 
 
#menuButton:hover { 
	opacity: 1; 
	transition: 0.3; 
} 
 
.content { 
	width: 900px; 
	align-items: center; 
	margin: 0 auto 0; 
	display: flex; 
	text-align: center; 
	flex-direction: column; 
} 
 
.contentBox { 
	display: flex; 
	flex-direction: column; 
	max-width: 900px; 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<!DOCTYPE html> 
<html> 
<head> 
	<title>owl</title> 
	<meta charset="utf-8"> 
	<link type="text/css" rel="stylesheet" href="style.css"> 
	<link href="https://fonts.googleapis.com/css?family=Ubuntu+Mono&display=swap" rel="stylesheet"> 
</head> 
<body> 
 
	<!-- Меню -->  
 
	<div class="menu"> 
		<ol class="treeMenu"> 
			<li>Пункт1</li> 
			<li id="name2">Пункт2 
				<ol id="pp2"> 
					<li><a href="#">Подпункт</a></li> 
					<li><a href="#">Подпункт</a></li> 
					<li><a href="#">Подпункт</a></li> 
		      		<li><a href="#">Подпункт</a></li> 
		      		<li><a href="#">Подпункт</a></li> 
		      		<li><a href="#">Подпункт</a></li> 
				</ol> 
			</li> 
			<li id="name3">Пункт3 
				<ol id="pp3"> 
					<li><a href="#">Подпункт</a></li> 
					<li><a href="#">Подпункт</a></li> 
					<li><a href="#">Подпункт</a> 
						<ol id="ppp33"> 
							<li><a href="#">Подподпункт</a></li> 
							<li><a href="#">Подподпункт</a></li> 
							<li><a href="#">Подподпункт</a></li> 
						</ol> 
					</li> 
					<li><a href="#">Подпункт</a></li> 
					<li><a href="#">Подпункт</a></li> 
				</ol> 
			</li> 
			<li>Пункт4</li> 
			<li id="name5">Пункт5 
				<ol id="pp5"> 
					<li><a href="#">Подпункт</a></li> 
					<li><a href="#">Подпункт</a></li> 
				</ol> 
			</li> 
		</ol> 
		<div id="sizeLine"></div> 
	</div> 
 
 
	<div class="article"> 
		<div class="header"> 
			<input type="button" name="menuButton" id="menuButton"> 
		</div> 
		<div class="content"> 
			<div class="contentBox"> 
 
<h1>Это контент</h1> 
 
			</div> 
		</div> 
	</div> 
<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript" src="script.js"></script> 
</body> 
</html>

  var num = 0;
$('#menuButton').click(function() { 
    if (num%2 == 0) {
        var menuWidth = $(".menu").width();
        $(".menu").css("margin-left", -menuWidth);
        $(".menu").css("transition", "300ms");
        $(".article").css("width", screen.width);
        $(".article").css("margin-left", 0);
        num += 1; 
        var newMenuWidth = menuWidth;
    } else {
        $(".menu").css("width", newMenuWidth);
        $(".menu").css("margin-left", 0);
        $(".menu").css("transition", "300ms");
        $(".article").css("width", screen.width-newMenuWidth);
        $(".article").css("margin-left", newMenuWidth);
        num += 1;
    }
});
Answer 1

Переменную надо объявить снаружи функции-обработчика. Тогда эта переменная будет сохранять свое значение между кликами.

var newMenuWidth = null;
$('#menuButton').click(function() { 
    if (newMenuWidth == null) {
        var menuWidth = $(".menu").width();
        $(".menu").css("margin-left", -menuWidth);
        $(".menu").css("transition", "300ms");
        $(".article").css("width", screen.width);
        $(".article").css("margin-left", 0);
        newMenuWidth = menuWidth;
    } else {
        $(".menu").css("width", newMenuWidth);
        $(".menu").css("margin-left", 0);
        $(".menu").css("transition", "300ms");
        $(".article").css("width", screen.width-newMenuWidth);
        $(".article").css("margin-left", newMenuWidth);
        newMenuWidth = null;
    }
});
READ ALSO
jquery удалить обработчик события

jquery удалить обработчик события

Решил недавно заюзать для сайта pjax

104
Как оптимизировать проверку условий в форме?

Как оптимизировать проверку условий в форме?

Помогите, пожалуйста, оптимизировать код проверки условий на странице оформления заказа

230
SQL запрос на выборку складов

SQL запрос на выборку складов

Например, имеется много складов и таблица в которой каждая запись отражает на каком складе конкретный товар и сколько штукОдин товар может...

96