Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему не работает код (https://javascript.ru/forum/misc/31642-pochemu-ne-rabotaet-kod.html)

dmitry111 15.09.2012 15:04

Почему не работает код
 
<!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>


Хочу чтоб три слайдера работали от одной функции, которая должна быть методом общей функции.
Как ни пытался не получается.
Помогите разобраться в чем причина?

lord2kim 15.09.2012 17:53

dmitry111, во-первых нету контейнера p3
во-вторых функция вызывается до определения соответствующих контейнеров в DOM (нужно вызывать после div-ов)

dmitry111 16.09.2012 02:06

lord2kim,

извините, всю ночь разбирался в этих this и наследовании..
Исправил, но скрипт все равно не работает (

За основу взят пример из учебника.

И модифицирован для работы с множеством слайдеров.

В примере используются:
- this - это объект (ползунок слайдера).
- this.parentNode - родитель ползунка.

dmitry111 16.09.2012 03:46

<!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 во вложенных функциях!

dmitry111 16.09.2012 03:47

эммм.. а как тут поставить себе плюсик? :)

bes 16.09.2012 12:56

Цитата:

Сообщение от dmitry111
эммм.. а как тут поставить себе плюсик?

слабость ;)

dmitry111 16.09.2012 15:04

необходимость!!!
две ночи просидел над кодом, чтоб понять в чем ошибка :write:

bes 16.09.2012 15:12

Нах тебе плюсик, купи пива :D
PS: считай, что я тебе два раза подряд поставил за усидчивость

dmitry111 16.09.2012 15:24

:agree: так с пивом и сидел. Сидел бы без пива за полчаса бы управился :)

ок, спасибо ;)


Часовой пояс GMT +3, время: 11:28.