元素拖拽

/*
 * touchScroll
 * param:el,evt
 * evt:{start:function(){},move:function(){},end:function(){}}
*/

(function(window,document,undefined){
    var hasTouch = 'ontouchstart' in window,
        hasPointer= navigator.msPointerEnabled,
        winW = document.body.clientWidth,
        winH = document.body.clientHeight;

    function Translate(el,evt){
        this.content = typeof el == 'string' ? document.getElementById(el) : el;
        this.wrapper = document.getElementById('previewContent');
        this.point={x:0,y:0,endX:0,endY:0}
        this.result = {x:0,y:0}
        this.evt = evt;
        this.initEvents();
        var _this=this;
        this.content.onload = function(){
            _this.imgHeight=this.height;
        }
        this.previewContentHeight = parseInt($('#previewContent').css('height'));
        this.bordersWidth=parseInt($('#border').css('height'));
    }

    Translate.prototype = {
        initEvents: function (remove) {
            var eventType = remove ? this.removeEvent : this.addEvent;
            eventType(window, 'orientationchange', this);
            eventType(window, 'resize', this);

            /*PC*/
            eventType(this.wrapper, 'mousedown', this);
            eventType(window, 'mousemove', this);
            eventType(window, 'mousecancel', this);
            eventType(window, 'mouseup', this);

            /*windows phone*/
            if ( hasPointer ) {
                eventType(this.wrapper, 'MSPointerDown', this);
                eventType(window, 'MSPointerMove', this);
                eventType(window, 'MSPointerCancel', this);
                eventType(window, 'MSPointerUp', this);
            }
            /*IOS android*/
            if ( hasTouch ) {
                eventType(this.wrapper, 'touchstart', this);
                eventType(window, 'touchmove', this);
                eventType(window, 'touchcancel', this);
                eventType(window, 'touchend', this);
            }
            eventType(this.wrapper, 'transitionend', this);
            eventType(this.wrapper, 'webkitTransitionEnd', this);
            eventType(this.wrapper, 'oTransitionEnd', this);
            eventType(this.wrapper, 'MSTransitionEnd', this);

        },
        start:function(e){
            var touches = e.touches ? e.touches[0] : e;
            this.point.y  = touches.pageY;
            this.enabled=true;//是否可以移动
            //console.log(0,this.point);
            e.stopPropagation();
            if(typeof this.evt.start == 'function') this.evt.start(this);
        },
        move:function(e){
            e.preventDefault();
            e.stopPropagation();
            if(!this.enabled) return false;
            var touches = e.touches ? e.touches[0] : e,
                diffY = parseInt(touches.pageY - this.point.y);
            this.point.endY = this.result.y+diffY;
            this.point.endY = this.result.y+diffY;
            //console.log(this.point.endY,this.result.y,diffY)
            /*if(this.point.endY>=0 || (this.imgHeight+this.point.endY)<this.previewContentHeight){
                //this.point.endY =0;
                return;
            }*/
            if(this.point.endY>=0){
                this.point.endY =0;
                return;
            }
            if((this.imgHeight+this.point.endY)<this.previewContentHeight){
            	 this.point.endY=this.previewContentHeight-this.imgHeight;
            }
            this.moveXY(this.point);
            if(typeof this.evt.move == 'function') this.evt.move(this);
        },
        end:function(e){
            this.enabled = true;
            this.result.y = this.point.endY;

            if(typeof this.evt.end == 'function') this.evt.end(this);
        },
        transitionEnd:function(){
            //CSS动画结束时操作
        },
        moveXY:function(point){
            //this.content.style.left = point.endX+'px';
            //if(this.imgHeight-Math.abs(point.endY)<this.previewContentHeight)
            this.content.style.top = point.endY+'px';

        },
        handleEvent: function (e) {
            switch ( e.type ) {
                case 'touchstart':
                case 'MSPointerDown':
                case 'mousedown':
                    this.start(e);
                    break;
                case 'touchmove':
                case 'MSPointerMove':
                case 'mousemove':
                    this.move(e);
                    break;
                case 'touchend':
                case 'MSPointerUp':
                case 'mouseup':
                case 'touchcancel':
                case 'MSPointerCancel':
                case 'mousecancel':
                    this.end(e);
                    break;
                case 'transitionend':
                case 'webkitTransitionEnd':
                case 'oTransitionEnd':
                case 'MSTransitionEnd':
                    this.transitionEnd(e);
                    break;
                case 'DOMMouseScroll':
                case 'mousewheel':
                    //this._wheel(e);
                    break;
                case 'keydown':
                    //this._key(e);
                    break;
            }
        },
        destroy: function () {
            this._initEvents(true);
        },
        addEvent:function (el, type, fn, capture) {
            el.addEventListener(type, fn, !!capture);
        },
        removeEvent:function (el, type, fn, capture) {
            el.removeEventListener(type, fn, !!capture);
        }
    }
    window.Translate = Translate;
})(window,document);

滑动,兼容了pc wp,但是主要更适用于Android IOS。

对象的初始化

new Translate('element',{
        start:function(){

        },
        end:function(scroll){

        }
     });

文件上传

 var fileElem = document.getElementById('file');
          fileElem.onchange = function startRead() {
          // obtain input element through DOM
          var file = fileElem.files[0];
          if(file){
            console.log(file);
            getAsText(file);
          }
        }

        function getAsText(readFile) {

          var reader = new FileReader();

          // Read file into memory as UTF-16
          reader.readAsText(readFile, "UTF-16");

          // Handle progress, success, and errors
          reader.onprogress = updateProgress;
          reader.onload = loaded;
          reader.onerror = errorHandler;
        }

        function updateProgress(evt) {
          if (evt.lengthComputable) {
            // evt.loaded and evt.total are ProgressEvent properties
            var loaded = (evt.loaded / evt.total);
            if (loaded < 1) {
              // Increase the prog bar length
              // style.width = (loaded * 200) + "px";
            }
          }
        }

        function loaded(evt) {
          // Obtain the read file data
          var fileString = evt.target.result;
          console.log(fileString);
          // Handle UTF-16 file dump
          if(utils.regexp.isChinese(fileString)) {
            //Chinese Characters + Name validation
          }
          else {
            // run other charset test
          }
          // xhr.send(fileString)
        }

        function errorHandler(evt) {
          if(evt.target.error.name == "NotReadableError") {
            // The file could not be read
          }
        }

参考链接 http://www.w3.org/TR/FileAPI/

时间: 2024-11-04 03:13:05

元素拖拽的相关文章

Selenium - 实现网页元素拖拽

Drag and Drop, 使用鼠标实现元素拖拽的操作貌似很复杂, 在Selenium中, 借助OpenQA.Selenium.Interactions.Actions类库中提供的方法, 实现起来还是比较简单的.道理如下: 1. 找到要拖拽的页面元素-源(source). 2. 找到要释放的页面元素-目标(target), 页面显示的这个元素可能是个坑, 但是在页面代码中他就是一个元素. 3. 借助(new Actions(IWebDriver)).DragAnddrop( source, t

WPF中元素拖拽的两个实例

原文:WPF中元素拖拽的两个实例 今天结合之前做过的一些拖拽的例子来对这个方面进行一些总结,这里主要用两个例子来说明在WPF中如何使用拖拽进行操作,元素拖拽是一个常见的操作,第一个拖拽的例子是将ListBox中的子元素拖拽到ListView的某一个节点,从而将该子元素作为当前节点的子节点.第二个例子就是将ListView的某一项拖拽到另外一项上从而使两个子项位置互换,这两个例子的原理类似,实现细节上有所差别,下面就具体分析一下这些细节. DEMO1 一 示例截图 图一 示例一截图 二 重点原理分

手机端touch事件实现元素拖拽效果 2

经上次的手机端拖拽事件,再次经过完善修改,加入了元素不能拖出屏幕范围功能,并做了一个小的函数接口 ps:经落雨大神指点. 代码如下: var touchEvent = (function(){ var oDiv = document.getElementsByTagName('div')[0], //获取可拖动元素 oIpt = document.getElementsByTagName('input')[0], //记录拖动元素位置 oIpt1 = document.getElementsBy

实现元素拖拽的两种方式

第一种方式:使用H5的API dataTransfer 实现思路: 1.为将要拖拽的元素设置允许拖拽,并赋予dragstart事件将其id转换成数据保存: 2.为容器添加dragover属性添加事件阻止浏览器默认事件,允许元素放置,并赋予drop事件进行元素的放置. 代码如下: <html> <head> <meta charset="utf-8"> <style> .box1 { width: 100px; height: 100px;

html元素拖拽

html 1 <div> 2 <div class="money-input"> 3 定投金额 : 4 <div class="input-rela"> 5 <input type="text" placeholder="2000"/> 6 <span>元</span> 7 </div> 8 9 </div> 10 <div

jq元素拖拽

<div id="a1"></div> js 1 <script type="text/javascript"> 2 $(function(){ 3 $('#a1').mousedown(function(e){ 4 var positionDiv = $(this).offset(); 5 var distenceX = e.pageX - positionDiv.left; 6 var distenceY = e.pageY

JQuery拖拽改变元素的尺寸

"元素拖拽改变大小"其实和"元素拖拽"一个原理,只是所动态改变的对象不同而已,主要在于 top.left.width.height 的运用,相对实现起来也非常容易.以下附出源码原型,弄明白了原理再扩展其他实际应用,思路就变得简单.清晰得多了.先来看看效果:塔河县臧清机械 下面是 JavaScript Code view source print? 01 <script type="text/javascript"> 02     /*

Extjs4 实现两个DataView之间元素的拖拽添加及删除

最近项目接到一个需求,要求用拖拽实现在两个Panel之间实现拖拽添加和删除元素的功能. 首先想到的是EXTJS提供的View组件,View组件绑定一个Store和Template就可以得到预期的UI显示效果,再加上EXTJS提供的DD(Drag and Drop)功能,则可以实现两个View组件之前的元素拖拽添加以及删除. 效果如下: Demo代码实例如下: 1 Ext.onReady(function(){ 2 3 var columnData = [ 4 ["Consignee",

JS拖拽元素原理及实现代码

拖拽功能主要是用在让用户做一些自定义的动作,比如拖动排序,弹出框拖动移动等等,效果还是蛮不错的.下面讲解一下拖拽的原理,希望可以帮助到有需要的朋友! 一.拖拽的流程动作①鼠标按下②鼠标移动③鼠标松开 二.拖拽流程中对应的JS事件①鼠标按下会触发onmousedown事件 [javascript] view plain copy obj.onmousedown = function(e) { //.......... } ②鼠标移动会触发onmousemove事件 [javascript] vie