Ext.ns('com.trs.ImageDragger');
/**
*本組件對頁面中的圖片提供了拖動的功能,該功能主要是為了實現類似地圖的拖動效果,
*即:通過拖動圖片,可以將區域外的圖片顯示在當前的區域內部,從而對用戶可見。
*為了使頁面中的圖片支持拖動,需要進行以下步驟:
* 1)引入當前js依賴的基礎js庫﹔
* 2)引入當前的js﹔
* 3)對需要支持拖動的元素添加draggable-image樣式,屬性值可以任意﹔
* 4)對需要支持拖動的元素添加背景圖片樣式,該圖片將作為拖動的圖片﹔
*/
(function(){
var
/**
*頁面上需要支持圖片拖動的標識樣式,如果存在該class,則該元素將支持拖動
*/
className = 'draggable-image',
/**
*計算出圖片的原始寬度,並將該寬度設置到元素的屬性上,imageWidth為屬性的名稱
*/
imageWidth = 'data-image-width',
/**
*計算出圖片的原始高度,並將該高度設置到元素的屬性上,imageHeight為屬性的名稱
*/
imageHeight = 'data-image-height',
/**
*從拖動元素的backgroundImage樣式內部反解出來圖片地址的正則
*/
backgroundImageReg = /url\((["']*)([^)]*?)\1\)/i;
com.trs.ImageDragger = function(cfg){
Ext.apply(this, cfg);
this.el = $(this.el);
this.init();
};
com.trs.ImageDragger.prototype = {
init : function(){
var el = this.el;
var backgroundImage = el.style.backgroundImage;
if(!backgroundImage) return;
//獲取圖片的原始大小,以便拖動時限制圖片的拖動范圍
var img = new Image();
img.onload = function(){
el.setAttribute(imageWidth, this.width);
el.setAttribute(imageHeight, this.height);
};
img.src = backgroundImage.replace(backgroundImageReg, '$2');
this.initEvents();
},
//private
initEvents : function(){
var context = this;
Event.observe(this.el, 'mousedown', function(event){
var el = context.el;
//獲取圖片的初始位置信息
var position = el.style.backgroundPosition.split(" ");
var l = parseInt(position[0], 10), t = parseInt(position[1], 10);
var w = parseInt(el.offsetWidth, 10), h = parseInt(el.offsetHeight, 10);
var ox = event.pageX || event.clientX, oy = event.pageY || event.clientY;
var drag = function(event){
var x = event.pageX || event.clientX, y = event.pageY || event.clientY;
var px=x-ox+l, py=y-oy+t;
px = Math.min(Math.max(-(el.getAttribute(imageWidth)-w), px), 0);
py = Math.min(Math.max(-(el.getAttribute(imageHeight)-h), py), 0);
el.style.backgroundPosition = px+"px " + py + "px";
}
var dragStop=function(a){
if(drag){
Event.stopObserving(el, 'mousemove', drag, false);
drag = null;
}
if(dragStop){
Event.stopObserving(el, 'mouseup', dragStop, false);
dragStop = null;
}
};
Event.observe(el, 'mousemove', drag, false);
Event.observe(el, 'mouseup', dragStop, false);
Event.observe(el, 'mouseout', dragStop, false);
});
},
destroy : function(){
delete this.el;
}
};
DOM.ready(function(){
var doms = document.getElementsByClassName(className);
for(var index = 0; index < doms.length; index++){
new com.trs.ImageDragger({el : doms[index]});
}
});
})();