slider.js
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:9k
源码类别:

Ajax

开发平台:

Others

  1. // Copyright (c) 2005 Marty Haught
  2. // 
  3. // See scriptaculous.js for full license.
  4. if(!Control) var Control = {};
  5. Control.Slider = Class.create();
  6. // options:
  7. //  axis: 'vertical', or 'horizontal' (default)
  8. //  increment: (default: 1)
  9. //  step: (default: 1)
  10. //
  11. // callbacks:
  12. //  onChange(value)
  13. //  onSlide(value)
  14. Control.Slider.prototype = {
  15.   initialize: function(handle, track, options) {
  16.     this.handle  = $(handle);
  17.     this.track   = $(track);
  18.     this.options = options || {};
  19.     this.axis      = this.options.axis || 'horizontal';
  20.     this.increment = this.options.increment || 1;
  21.     this.step      = parseInt(this.options.step) || 1;
  22.     this.value     = 0;
  23.     var defaultMaximum = Math.round(this.track.offsetWidth / this.increment);
  24.     if(this.isVertical()) defaultMaximum = Math.round(this.track.offsetHeight / this.increment);   
  25.     
  26.     this.maximum = this.options.maximum || defaultMaximum;
  27.     this.minimum = this.options.minimum || 0;
  28.     // Will be used to align the handle onto the track, if necessary
  29.     this.alignX = parseInt (this.options.alignX) || 0;
  30.     this.alignY = parseInt (this.options.alignY) || 0;
  31.     // Zero out the slider position
  32.     this.setCurrentLeft(Position.cumulativeOffset(this.track)[0] - Position.cumulativeOffset(this.handle)[0] + this.alignX);
  33.     this.setCurrentTop(this.trackTop() - Position.cumulativeOffset(this.handle)[1] + this.alignY);
  34.     this.offsetX = 0;
  35.     this.offsetY = 0;
  36.     this.originalLeft = this.currentLeft();
  37.     this.originalTop  = this.currentTop();
  38.     this.originalZ    = parseInt(this.handle.style.zIndex || "0");
  39.     // Prepopulate Slider value
  40.     this.setSliderValue(parseInt(this.options.sliderValue) || 0);
  41.     this.active   = false;
  42.     this.dragging = false;
  43.     this.disabled = false;
  44.     // FIXME: use css
  45.     this.handleImage    = $(this.options.handleImage) || false; 
  46.     this.handleDisabled = this.options.handleDisabled || false;
  47.     this.handleEnabled  = false;
  48.     if(this.handleImage)
  49.       this.handleEnabled  = this.handleImage.src || false;
  50.     if(this.options.disabled)
  51.       this.setDisabled();
  52.     // Value Array
  53.     this.values = this.options.values || false;  // Add method to validate and sort??
  54.     Element.makePositioned(this.handle); // fix IE
  55.     this.eventMouseDown = this.startDrag.bindAsEventListener(this);
  56.     this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
  57.     this.eventMouseMove = this.update.bindAsEventListener(this);
  58.     this.eventKeypress  = this.keyPress.bindAsEventListener(this);
  59.     Event.observe(this.handle, "mousedown", this.eventMouseDown);
  60.     Event.observe(document, "mouseup", this.eventMouseUp);
  61.     Event.observe(document, "mousemove", this.eventMouseMove);
  62.     Event.observe(document, "keypress", this.eventKeypress);
  63.   },
  64.   dispose: function() {
  65.     Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
  66.     Event.stopObserving(document, "mouseup", this.eventMouseUp);
  67.     Event.stopObserving(document, "mousemove", this.eventMouseMove);
  68.     Event.stopObserving(document, "keypress", this.eventKeypress);
  69.   },
  70.   setDisabled: function(){
  71.     this.disabled = true;
  72.     if(this.handleDisabled)
  73.       this.handleImage.src = this.handleDisabled;
  74.   },
  75.   setEnabled: function(){
  76.     this.disabled = false;
  77.     if(this.handleEnabled)
  78.       this.handleImage.src = this.handleEnabled;
  79.   },  
  80.   currentLeft: function() {
  81.     return parseInt(this.handle.style.left || '0');
  82.   },
  83.   currentTop: function() {
  84.     return parseInt(this.handle.style.top || '0');
  85.   },
  86.   setCurrentLeft: function(left) {
  87.     this.handle.style.left = left +"px";
  88.   },
  89.   setCurrentTop: function(top) {
  90.     this.handle.style.top = top +"px";
  91.   },
  92.   trackLeft: function(){
  93.     return Position.cumulativeOffset(this.track)[0];
  94.   },
  95.   trackTop: function(){
  96.     return Position.cumulativeOffset(this.track)[1];
  97.   }, 
  98.   getNearestValue: function(value){
  99.     if(this.values){
  100.       var i = 0;
  101.       var offset = Math.abs(this.values[0] - value);
  102.       var newValue = this.values[0];
  103.       for(i=0; i < this.values.length; i++){
  104.         var currentOffset = Math.abs(this.values[i] - value);
  105.         if(currentOffset < offset){
  106.           newValue = this.values[i];
  107.           offset = currentOffset;
  108.         }
  109.       }
  110.       return newValue;
  111.     }
  112.     return value;
  113.   },
  114.   setSliderValue:  function(sliderValue){
  115.     // First check our max and minimum and nearest values
  116.     sliderValue = this.getNearestValue(sliderValue);
  117.     if(sliderValue > this.maximum) sliderValue = this.maximum;
  118.     if(sliderValue < this.minimum) sliderValue = this.minimum;
  119.     var offsetDiff = (sliderValue - (this.value||this.minimum)) * this.increment;
  120.     
  121.     if(this.isVertical()){
  122.       this.setCurrentTop(offsetDiff + this.currentTop());
  123.     } else {
  124.       this.setCurrentLeft(offsetDiff + this.currentLeft());
  125.     }
  126.     this.value = sliderValue;
  127.     this.updateFinished();
  128.   },  
  129.   minimumOffset: function(){
  130.     return(this.isVertical() ? 
  131.       this.trackTop() + this.alignY :
  132.       this.trackLeft() + this.alignX);
  133.   },
  134.   maximumOffset: function(){
  135.     return(this.isVertical() ?
  136.       this.trackTop() + this.alignY + (this.maximum - this.minimum) * this.increment :
  137.       this.trackLeft() + this.alignX + (this.maximum - this.minimum) * this.increment);
  138.   },  
  139.   isVertical:  function(){
  140.     return (this.axis == 'vertical');
  141.   },
  142.   startDrag: function(event) {
  143.     if(Event.isLeftClick(event)) {
  144.       if(!this.disabled){
  145.         this.active = true;
  146.         var pointer = [Event.pointerX(event), Event.pointerY(event)];
  147.         var offsets = Position.cumulativeOffset(this.handle);
  148.         this.offsetX =  (pointer[0] - offsets[0]);
  149.         this.offsetY =  (pointer[1] - offsets[1]);
  150.         this.originalLeft = this.currentLeft();
  151.         this.originalTop = this.currentTop();
  152.       }
  153.       Event.stop(event);
  154.     }
  155.   },
  156.   update: function(event) {
  157.    if(this.active) {
  158.       if(!this.dragging) {
  159.         var style = this.handle.style;
  160.         this.dragging = true;
  161.         if(style.position=="") style.position = "relative";
  162.         style.zIndex = this.options.zindex;
  163.       }
  164.       this.draw(event);
  165.       // fix AppleWebKit rendering
  166.       if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
  167.       Event.stop(event);
  168.    }
  169.   },
  170.   draw: function(event) {
  171.     var pointer = [Event.pointerX(event), Event.pointerY(event)];
  172.     var offsets = Position.cumulativeOffset(this.handle);
  173.     offsets[0] -= this.currentLeft();
  174.     offsets[1] -= this.currentTop();
  175.         
  176.     // Adjust for the pointer's position on the handle
  177.     pointer[0] -= this.offsetX;
  178.     pointer[1] -= this.offsetY;
  179.     var style = this.handle.style;
  180.     if(this.isVertical()){
  181.       if(pointer[1] > this.maximumOffset())
  182.         pointer[1] = this.maximumOffset();
  183.       if(pointer[1] < this.minimumOffset())
  184.         pointer[1] =  this.minimumOffset();
  185.     // Increment by values
  186.     if(this.values){
  187.       this.value = this.getNearestValue(Math.round((pointer[1] - this.minimumOffset()) / this.increment) + this.minimum);
  188.       pointer[1] = this.trackTop() + this.alignY + (this.value - this.minimum) * this.increment;
  189.     } else {
  190.       this.value = Math.round((pointer[1] - this.minimumOffset()) / this.increment) + this.minimum;
  191.     }
  192.     style.top  = pointer[1] - offsets[1] + "px";
  193.     } else {
  194.       if(pointer[0] > this.maximumOffset()) pointer[0] = this.maximumOffset();
  195.       if(pointer[0] < this.minimumOffset()) pointer[0] =  this.minimumOffset();
  196.       // Increment by values
  197.       if(this.values){
  198.         this.value = this.getNearestValue(Math.round((pointer[0] - this.minimumOffset()) / this.increment) + this.minimum);
  199.         pointer[0] = this.trackLeft() + this.alignX + (this.value - this.minimum) * this.increment;
  200.       } else {
  201.         this.value = Math.round((pointer[0] - this.minimumOffset()) / this.increment) + this.minimum;
  202.       }
  203.       style.left = (pointer[0] - offsets[0]) + "px";
  204.     }
  205.     if(this.options.onSlide) this.options.onSlide(this.value);
  206.   },
  207.   endDrag: function(event) {
  208.     if(this.active && this.dragging) {
  209.       this.finishDrag(event, true);
  210.       Event.stop(event);
  211.     }
  212.     this.active = false;
  213.     this.dragging = false;
  214.   },  
  215.   finishDrag: function(event, success) {
  216.     this.active = false;
  217.     this.dragging = false;
  218.     this.handle.style.zIndex = this.originalZ;
  219.     this.originalLeft = this.currentLeft();
  220.     this.originalTop  = this.currentTop();
  221.     this.updateFinished();
  222.   },
  223.   updateFinished: function() {
  224.     if(this.options.onChange) this.options.onChange(this.value);
  225.   },
  226.   keyPress: function(event) {
  227.     if(this.active && !this.disabled) {
  228.       switch(event.keyCode) {
  229.         case Event.KEY_ESC:
  230.           this.finishDrag(event, false);
  231.           Event.stop(event); 
  232.           break;
  233.       }
  234.       if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
  235.     }
  236.   }
  237. }