Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.09.2012, 15:04
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

Почему не работает код
<!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, 16.09.2012 в 02:01.
Ответить с цитированием
  #2 (permalink)  
Старый 15.09.2012, 17:53
Аватар для lord2kim
Профессор
Отправить личное сообщение для lord2kim Посмотреть профиль Найти все сообщения от lord2kim
 
Регистрация: 03.05.2011
Сообщений: 848

dmitry111, во-первых нету контейнера p3
во-вторых функция вызывается до определения соответствующих контейнеров в DOM (нужно вызывать после div-ов)
Ответить с цитированием
  #3 (permalink)  
Старый 16.09.2012, 02:06
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

lord2kim,

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

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

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

В примере используются:
- this - это объект (ползунок слайдера).
- this.parentNode - родитель ползунка.
Ответить с цитированием
  #4 (permalink)  
Старый 16.09.2012, 03:46
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

<!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 во вложенных функциях!
Ответить с цитированием
  #5 (permalink)  
Старый 16.09.2012, 03:47
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

эммм.. а как тут поставить себе плюсик?
Ответить с цитированием
  #6 (permalink)  
Старый 16.09.2012, 12:56
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от dmitry111
эммм.. а как тут поставить себе плюсик?
слабость
Ответить с цитированием
  #7 (permalink)  
Старый 16.09.2012, 15:04
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

необходимость!!!
две ночи просидел над кодом, чтоб понять в чем ошибка
Ответить с цитированием
  #8 (permalink)  
Старый 16.09.2012, 15:12
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Нах тебе плюсик, купи пива
PS: считай, что я тебе два раза подряд поставил за усидчивость
Ответить с цитированием
  #9 (permalink)  
Старый 16.09.2012, 15:24
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

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

ок, спасибо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает простой код. Помогите, очень надо AntiBuger Internet Explorer 1 27.05.2010 16:35
Почему код работает? (обращение к форме из window) Василий Б. Элементы интерфейса 10 21.04.2010 10:10
Почему не работает document.getElementById() giGnet Events/DOM/Window 3 18.04.2010 14:30
Почему не работает код? JSprog Общие вопросы Javascript 4 16.08.2009 14:39
Код не работает в седьмом Эксплорере... vol4ara Общие вопросы Javascript 0 14.07.2008 18:53