<!DOCTYPE HTML>
<html>
<head>
<style>
#s1, #s2, #s3 {
border-radius: 5px;
background: #E0E0E0;
background: -moz-linear-gradient(left top , #E0E0E0, #EEEEEE) repeat scroll 0 0 transparent;
background: -webkit-gradient(linear, left top, right bottom, from(#E0E0E0), to(#EEEEEE));
background: linear-gradient(left top, #E0E0E0, #EEEEEE);
width: 310px;
height: 15px;
margin: 15px;
}
#p1, #p2, #p3 {
width: 10px;
height: 25px;
border-radius: 3px;
position: relative;
left: 10px;
top: -5px;
background: blue;
cursor: pointer;
}
</style>
</head>
<body>
<div id="s1">
<div id="p1"></div>
</div>
<div id="s2">
<div id="p2"></div>
</div>
<div id="s3">
<div id="p3"></div>
</div>
<script>
function func() {
func.sliders = function(event) {
var self = this;
var parent = this.parentNode; // контейнер ползунка
var thumbCoords = this.getBoundingClientRect();
var shiftX = event.pageX - thumbCoords.left;
var sliderCoords = parent.getBoundingClientRect();
document.onmousemove = function(event) {
var newLeft = event.pageX - shiftX - sliderCoords.left;
if (newLeft < 0) {
newLeft = 0;
}
var rightEdge = parent.offsetWidth - self.offsetWidth;
if (newLeft > rightEdge) {
newLeft = rightEdge;
}
self.style.left = newLeft + 'px';
};
document.onmouseup = function() {
document.onmousemove = document.onmouseup = null;
};
};
document.getElementById("p1").onmousedown = func.sliders;
document.getElementById("p2").onmousedown = func.sliders;
document.getElementById("p3").onmousedown = func.sliders;
}
func();
</script>
</body>
</html>
Работает!
В чем была ошибка:
Если вложенная функция вызывается как функция, то значением this будет либо глобальный объект (в нестрогом режиме), либо undefined (в строгом режиме).
Соответственно, если переменной присвоить значение this в родительской функции, то можно манипулировать этой переменной и соответственно this во вложенных функциях!