javascript学习(一)
2016-04-16 23:49
344 查看
最近在做一个在图片上画矩形框的任务。
在网上先找了一段代码,准备进行学习。
Javascript代码:
DrawRectangle = function(id, onMouseUp, className){
document.oncontextmenu=function() {
return true;
};
this.IMG = document.getElementById(id);
var masker = document.createElement("div");
masker.id = "mask_" + id;
var position = this.getAbsolutePosition(this.IMG);
masker.style.width = position.width + "px";
masker.style.height = position.height + "px";
masker.style.left = position.left;
masker.style.top = position.top;
masker.style["background-image"] = "url("+this.IMG.src+")";
masker.className = "imgmasker";
this.masker = masker;
this.IMG.parentNode.appendChild(masker);
this.IMG.parentNode.removeChild(this.IMG);
this.isDraw = false;
this.isMouseUp = true;
this.index = 0;
this.currentDrawRectangle = null;
this.className = className;
this.RectangleDivs = [];
this.debug = true;
this._onMouseUp = onMouseUp;
this.bindListener();
};
DrawRectangle.prototype = {
bindListener: function(){
this.masker.onmousemove = this.dragSize.bind(this);
this.masker.onmouseup = this.onMouseUp.bind(this);
this.masker.onmouseout = this.onMouseOut.bind(this);
this.masker.onmouseover = this.onMouseOver.bind(this);
this.masker.onmousedown = this.drawLayer.bind(this);
this.masker.onmouseup = this.onMouseUp.bind(this);
},
drawLayer: function(){
//this.IMG.setCapture(true);
this.isDraw = true;
this.ismouseup = false;
this.index++;
var pos = this.getSourcePos();
var x = event.offsetX;
var y = event.offsetY;
var top = y + pos.top - 2;
var left = x + pos.left - 2;
var d = document.createElement("div");
// document.body.appendChild(d);
this.masker.appendChild(d);
d.style.border = "1px solid #ff0000";
1b024
d.style.width = 0;
d.style.height = 0;
d.style.overflow = "hidden";
d.style.position = "absolute";
d.style.left = left + "px";
d.style.top = top + "px";
d.style.opacity = 0.5;
d.style["z-index"] = 2;
if(this.className) {
d.className = this.className;
}
d.id = "draw" + this.index;
if (this.debug) {
d.innerHTML = "<div class='innerbg'>x:" + x + ",y:" + y + "..</div>";
}
this.currentDrawRectangle = d;
this.RectangleDivs[this.index] = {
left: left,
top: top,
el: d
};
},
getSourcePos: function(){
return this.getAbsolutePosition(this.masker);
},
dragSize: function(){
if (this.isDraw) {
if (!(event.srcElement.tagName.toLowerCase() == "div" && event.srcElement.className == "imgmasker"))
return;
var pos = this.getSourcePos();
var img_x = pos.top;
var img_y = pos.left;
var x = event.offsetX;
var y = event.offsetY;
var drawW = (x + img_x) - this.RectangleDivs[this.index].left;
var drawH = (y + img_y) - this.RectangleDivs[this.index].top;
this.currentDrawRectangle.style.width = (drawW > 0 ? drawW : -drawW) + "px";
this.currentDrawRectangle.style.height = (drawH > 0 ? drawH : -drawH) + "px";
if (drawW < 0) {
this.currentDrawRectangle.style.left = (x + img_x) + "px";
}
if (drawH < 0) {
this.currentDrawRectangle.style.top = (y + img_y) + "px";
}
if (this.debug) {
this.currentDrawRectangle.innerHTML = "<div class='innerbg'>x:" + x + ",y:" + y +
". img_x:" +
img_x +
",img_y:" +
img_y +
". drawW:" +
drawW +
",drawH:" +
drawH +
". Dleft[i]:" +
this.RectangleDivs[this.index].left +
",Dtop[i]:" +
this.RectangleDivs[this.index].top +
"src:" +
event.srcElement.tagName +
",this.isDraw: " + this.isDraw +
",this.isMouseUp: " + this.isMouseUp +
".</div>";
}
}
else {
return false;
}
},
stopDraw: function(){
this.isDraw = false;
},
onMouseOut: function(){
if (!this.isMouseUp) {
this.isDraw = false;
}
},
onMouseUp: function(){
this.isDraw = false;
this.isMouseUp = true;
//this.IMG.releaseCapture();
if(this._onMouseUp) {
this._onMouseUp.call(this, this.currentDrawRectangle);
}
},
onMouseOver: function(){
if (!this.isMouseUp) {
this.isDraw = true;
}
},
getAbsolutePosition: function(obj){
var t = obj.offsetTop;
var l = obj.offsetLeft;
var w = obj.offsetWidth;
var h = obj.offsetHeight;
while (obj = obj.offsetParent) {
t += obj.offsetTop;
l += obj.offsetLeft;
}
return {
top: t,
left: l,
width: w,
height: h
};
}
};
document.getElementById:返回对拥有指定 ID 的第一个对象的引用。
document.createElement():在对象中创建一个对象,要与appendChild() 或 insertBefore()方法联合使用。其中,appendChild() 方法在节点的子节点列表末添加新的子节点。insertBefore() 方法在节点的子节点列表任意位置插入新的节点。
具体例子参见网站:http://www.jb51.net/article/34740.htm
getAbsolutePosition:
getAbsolutePosition: function(obj){
var t = obj.offsetTop;
var l = obj.offsetLeft;
var w = obj.offsetWidth;
var h = obj.offsetHeight;
while (obj = obj.offsetParent) {
t += obj.offsetTop;
l += obj.offsetLeft;
}
return {
top: t,
left: l,
width: w,
height: h
};
}
假设 obj 为某个 HTML 控件。
obj.offsetTop 指 obj 间隔上方或上层控件的地位,整型,单位像素。
obj.offsetLeft 指 obj 间隔左方或上层控件的地位,整型,单位像素。
obj.offsetWidth 指 obj 控件自身的宽度,整型,单位像素。
obj.offsetHeight 指 obj 控件自身的高度,整型,单位像素。
1.offsetTop :
当前对象到其上级层顶部的间隔.
不克不及对其进行赋值.设置对象到页面顶部的间隔请用style.top属性.
2.offsetLeft :
当前对象到其上级层左边的间隔.
不克不及对其进行赋值.设置对象到页面左部的间隔请用style.left属性.
3.offsetWidth :
当前对象的宽度.
与style.width属性的差别在于:如对象的宽度设定值为百分比宽度,则无论页面变大还是变小,style.width都返回此百分比,而offsetWidth则返回在不合页面中对象的宽度值而不是百分比值
4.offsetHeight :
与style.height属性的差别在于:如对象的宽度设定值为百分比高度,则无论页面变大还是变小,style.height都返回此百分比,而offsetHeight则返回在不合页面中对象的高度值而不是百分比值
5.offsetParent :
当前对象的上级层对象.
重视.若是对象是包含在一个DIV中时,此DIV不会被当做是此对象的上级层,(即对象的上级层会跳过DIV对象)上级层是Table时则不会有题目.
详见:http://blog.csdn.net/fswan/article/details/17238933
DrawRectangle.prototype =
此句.prototype表示扩展类DrawRectangle。
bindListener: function(){
this.masker.onmousemove = this.dragSize.bind(this);
this.masker.onmouseup = this.onMouseUp.bind(this);
this.masker.onmouseout = this.onMouseOut.bind(this);
this.masker.onmouseover = this.onMouseOver.bind(this);
this.masker.onmousedown = this.drawLayer.bind(this);
this.masker.onmouseup = this.onMouseUp.bind(this);
}
onmousemove
事件会在鼠标指针移动时发生。
onmousedown,onmouseup:首先当点击鼠标按钮时,会触发
onmousedown 事件,当释放鼠标按钮时,会触发 onmouseup 事件,最后,当完成鼠标点击时,会触发 onclick 事件。
onmouseover
和 onmouseout 事件可用于在用户的鼠标移至 HTML 元素上方或移出元素时触发函数。
var x = event.offsetX;
var y = event.offsetY;
event.offsetX、event.offsetY
鼠标相对于事件源元素(srcElement)的X,Y坐标,只有IE事件有这2个属性,标准事件没有对应的属性。
d.style.overflow = "hidden";
overflow 属性规定当内容溢出元素框时发生的事情。
d.style.opacity = 0.5;
opacity设置
div 元素的不透明级别。
d.style["z-index"] = 2;
z-index
属性设置元素的堆叠顺序。拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面。
在网上先找了一段代码,准备进行学习。
Javascript代码:
DrawRectangle = function(id, onMouseUp, className){
document.oncontextmenu=function() {
return true;
};
this.IMG = document.getElementById(id);
var masker = document.createElement("div");
masker.id = "mask_" + id;
var position = this.getAbsolutePosition(this.IMG);
masker.style.width = position.width + "px";
masker.style.height = position.height + "px";
masker.style.left = position.left;
masker.style.top = position.top;
masker.style["background-image"] = "url("+this.IMG.src+")";
masker.className = "imgmasker";
this.masker = masker;
this.IMG.parentNode.appendChild(masker);
this.IMG.parentNode.removeChild(this.IMG);
this.isDraw = false;
this.isMouseUp = true;
this.index = 0;
this.currentDrawRectangle = null;
this.className = className;
this.RectangleDivs = [];
this.debug = true;
this._onMouseUp = onMouseUp;
this.bindListener();
};
DrawRectangle.prototype = {
bindListener: function(){
this.masker.onmousemove = this.dragSize.bind(this);
this.masker.onmouseup = this.onMouseUp.bind(this);
this.masker.onmouseout = this.onMouseOut.bind(this);
this.masker.onmouseover = this.onMouseOver.bind(this);
this.masker.onmousedown = this.drawLayer.bind(this);
this.masker.onmouseup = this.onMouseUp.bind(this);
},
drawLayer: function(){
//this.IMG.setCapture(true);
this.isDraw = true;
this.ismouseup = false;
this.index++;
var pos = this.getSourcePos();
var x = event.offsetX;
var y = event.offsetY;
var top = y + pos.top - 2;
var left = x + pos.left - 2;
var d = document.createElement("div");
// document.body.appendChild(d);
this.masker.appendChild(d);
d.style.border = "1px solid #ff0000";
1b024
d.style.width = 0;
d.style.height = 0;
d.style.overflow = "hidden";
d.style.position = "absolute";
d.style.left = left + "px";
d.style.top = top + "px";
d.style.opacity = 0.5;
d.style["z-index"] = 2;
if(this.className) {
d.className = this.className;
}
d.id = "draw" + this.index;
if (this.debug) {
d.innerHTML = "<div class='innerbg'>x:" + x + ",y:" + y + "..</div>";
}
this.currentDrawRectangle = d;
this.RectangleDivs[this.index] = {
left: left,
top: top,
el: d
};
},
getSourcePos: function(){
return this.getAbsolutePosition(this.masker);
},
dragSize: function(){
if (this.isDraw) {
if (!(event.srcElement.tagName.toLowerCase() == "div" && event.srcElement.className == "imgmasker"))
return;
var pos = this.getSourcePos();
var img_x = pos.top;
var img_y = pos.left;
var x = event.offsetX;
var y = event.offsetY;
var drawW = (x + img_x) - this.RectangleDivs[this.index].left;
var drawH = (y + img_y) - this.RectangleDivs[this.index].top;
this.currentDrawRectangle.style.width = (drawW > 0 ? drawW : -drawW) + "px";
this.currentDrawRectangle.style.height = (drawH > 0 ? drawH : -drawH) + "px";
if (drawW < 0) {
this.currentDrawRectangle.style.left = (x + img_x) + "px";
}
if (drawH < 0) {
this.currentDrawRectangle.style.top = (y + img_y) + "px";
}
if (this.debug) {
this.currentDrawRectangle.innerHTML = "<div class='innerbg'>x:" + x + ",y:" + y +
". img_x:" +
img_x +
",img_y:" +
img_y +
". drawW:" +
drawW +
",drawH:" +
drawH +
". Dleft[i]:" +
this.RectangleDivs[this.index].left +
",Dtop[i]:" +
this.RectangleDivs[this.index].top +
"src:" +
event.srcElement.tagName +
",this.isDraw: " + this.isDraw +
",this.isMouseUp: " + this.isMouseUp +
".</div>";
}
}
else {
return false;
}
},
stopDraw: function(){
this.isDraw = false;
},
onMouseOut: function(){
if (!this.isMouseUp) {
this.isDraw = false;
}
},
onMouseUp: function(){
this.isDraw = false;
this.isMouseUp = true;
//this.IMG.releaseCapture();
if(this._onMouseUp) {
this._onMouseUp.call(this, this.currentDrawRectangle);
}
},
onMouseOver: function(){
if (!this.isMouseUp) {
this.isDraw = true;
}
},
getAbsolutePosition: function(obj){
var t = obj.offsetTop;
var l = obj.offsetLeft;
var w = obj.offsetWidth;
var h = obj.offsetHeight;
while (obj = obj.offsetParent) {
t += obj.offsetTop;
l += obj.offsetLeft;
}
return {
top: t,
left: l,
width: w,
height: h
};
}
};
document.getElementById:返回对拥有指定 ID 的第一个对象的引用。
document.createElement():在对象中创建一个对象,要与appendChild() 或 insertBefore()方法联合使用。其中,appendChild() 方法在节点的子节点列表末添加新的子节点。insertBefore() 方法在节点的子节点列表任意位置插入新的节点。
具体例子参见网站:http://www.jb51.net/article/34740.htm
getAbsolutePosition:
getAbsolutePosition: function(obj){
var t = obj.offsetTop;
var l = obj.offsetLeft;
var w = obj.offsetWidth;
var h = obj.offsetHeight;
while (obj = obj.offsetParent) {
t += obj.offsetTop;
l += obj.offsetLeft;
}
return {
top: t,
left: l,
width: w,
height: h
};
}
假设 obj 为某个 HTML 控件。
obj.offsetTop 指 obj 间隔上方或上层控件的地位,整型,单位像素。
obj.offsetLeft 指 obj 间隔左方或上层控件的地位,整型,单位像素。
obj.offsetWidth 指 obj 控件自身的宽度,整型,单位像素。
obj.offsetHeight 指 obj 控件自身的高度,整型,单位像素。
1.offsetTop :
当前对象到其上级层顶部的间隔.
不克不及对其进行赋值.设置对象到页面顶部的间隔请用style.top属性.
2.offsetLeft :
当前对象到其上级层左边的间隔.
不克不及对其进行赋值.设置对象到页面左部的间隔请用style.left属性.
3.offsetWidth :
当前对象的宽度.
与style.width属性的差别在于:如对象的宽度设定值为百分比宽度,则无论页面变大还是变小,style.width都返回此百分比,而offsetWidth则返回在不合页面中对象的宽度值而不是百分比值
4.offsetHeight :
与style.height属性的差别在于:如对象的宽度设定值为百分比高度,则无论页面变大还是变小,style.height都返回此百分比,而offsetHeight则返回在不合页面中对象的高度值而不是百分比值
5.offsetParent :
当前对象的上级层对象.
重视.若是对象是包含在一个DIV中时,此DIV不会被当做是此对象的上级层,(即对象的上级层会跳过DIV对象)上级层是Table时则不会有题目.
详见:http://blog.csdn.net/fswan/article/details/17238933
DrawRectangle.prototype =
此句.prototype表示扩展类DrawRectangle。
bindListener: function(){
this.masker.onmousemove = this.dragSize.bind(this);
this.masker.onmouseup = this.onMouseUp.bind(this);
this.masker.onmouseout = this.onMouseOut.bind(this);
this.masker.onmouseover = this.onMouseOver.bind(this);
this.masker.onmousedown = this.drawLayer.bind(this);
this.masker.onmouseup = this.onMouseUp.bind(this);
}
onmousemove
事件会在鼠标指针移动时发生。
onmousedown,onmouseup:首先当点击鼠标按钮时,会触发
onmousedown 事件,当释放鼠标按钮时,会触发 onmouseup 事件,最后,当完成鼠标点击时,会触发 onclick 事件。
onmouseover
和 onmouseout 事件可用于在用户的鼠标移至 HTML 元素上方或移出元素时触发函数。
onMouseover当鼠标经过的时候,触发 = 后面的脚本函数
onMouseout 当鼠标离开 。。
var x = event.offsetX;
var y = event.offsetY;
event.offsetX、event.offsetY
鼠标相对于事件源元素(srcElement)的X,Y坐标,只有IE事件有这2个属性,标准事件没有对应的属性。
d.style.overflow = "hidden";
overflow 属性规定当内容溢出元素框时发生的事情。
hidden | 内容会被修剪,并且其余内容是不可见的。 |
opacity设置
div 元素的不透明级别。
d.style["z-index"] = 2;
z-index
属性设置元素的堆叠顺序。拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面。
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解
- call/apply/bind 的理解与实例分享