Почему не работает код
<!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 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 - this.offsetWidth;
if (newLeft > rightEdge) {
newLeft = rightEdge;
}
this.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>
Хочу чтоб три слайдера работали от одной функции, которая должна быть методом общей функции. Как ни пытался не получается. Помогите разобраться в чем причина? |
dmitry111, во-первых нету контейнера p3
во-вторых функция вызывается до определения соответствующих контейнеров в DOM (нужно вызывать после div-ов) |
lord2kim,
извините, всю ночь разбирался в этих this и наследовании.. Исправил, но скрипт все равно не работает ( За основу взят пример из учебника. И модифицирован для работы с множеством слайдеров. В примере используются: - this - это объект (ползунок слайдера). - this.parentNode - родитель ползунка. |
<!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 во вложенных функциях! |
эммм.. а как тут поставить себе плюсик? :)
|
Цитата:
|
необходимость!!!
две ночи просидел над кодом, чтоб понять в чем ошибка :write: |
Нах тебе плюсик, купи пива :D
PS: считай, что я тебе два раза подряд поставил за усидчивость |
:agree: так с пивом и сидел. Сидел бы без пива за полчаса бы управился :)
ок, спасибо ;) |
| Часовой пояс GMT +3, время: 20:09. |