玩下Javascript
玩下Javascript
前言
好久没有更新博客了,也蛮少捣弄javascript,今儿看到一个题目,关于给你一个面板,你可以随意的在上面画矩形,可以移动和删除任意一个你创建的矩形,心血来潮搞着玩哈,实现起来挺简单的,但这代码是我怎么看就是觉得不舒服,求指点,同时代码中有更好的实现方式也请提出,感谢!
关于这道题目
要求:<br>1.body中仅给出一个div当作面板,在此区域任意位置画矩形<br>2.在画出的任意矩形中可以选中想要的那个,并改变其背景色以区分<br>3.可以控制任意一个矩形的位置,同时不能影响其他矩形<br>4.可以删除任意一个矩形 |
实现遇到问题
其实呢很多人看到这个问题,很所人觉得很简单,不就是对dom的操作以及是事件的处理嘛!看似很简单,其实有些地方还是要注意滴啦!废话也不多说,先上个效果图:
我们要完成的就是这样的个东东,下面来谈谈这个题目我们需要考虑的地方:
1.选择矩形的时候如何正确的获取你要的那个,特别是矩形有重叠时
2.鼠标按下时怎么区分你是要画下一个矩形还是准备移动当前鼠标所在位置的矩形
3.在移动当前矩形的时候如何做到不影响其他矩形
4.删除时怎么辨别删除哪个,毕竟创建的矩形时属性样式都相似,不会某一个矩形比其他矩形多什么属性
.........
简单的叙说小弟如何解决,有些解决的特坑
第一个问题:这个是一个事件侦听的,涉及到传说中的事件的捕获和事件的冒泡。
第二个问题:其实我之前特纠结,不知道如何去区分鼠标按下是要创建新矩形呢还是选中当前鼠标位置所在矩形,后来我的解决办法是为鼠标移动添加一个键盘事件,也就是按下键盘ctrl+鼠标左键就是移动,否则视为创建新矩形。
第三个问题:就是移动元素时怎么做才会不影响其他矩形,之前做过的应该知道,当你移动某一个矩形时如果鼠标碰到其他矩形会有其他矩形乱跳到其他位置,弱弱的我的方法:选中哪个矩形就设置它的z-index为所有矩形中的最大值,移动完以后又给还原回去,这样就行了。
第四个问题:删除,这个我选择按delete键实现的,很简单,细节注意就行。
自知写的特丑,但还是放上来了
大神见笑了,小弟javascript不咋地,学习ing,不对的地方批评指正,不胜感激、、、、、、
注意下面提供的下载文件运行时,画图前按一下ctrl键
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>画矩形</title>
<style type="text/css">
*
{
margin: 0;
padding: 0;
}
#panel
{
width: 100%;
height: 500px;
margin: 0px auto;
background-color: #3cb371;
position: absolute;
cursor: default;
}
</style>
</head>
<body>
<form id="forms">
<div id="panel">
</div>
</form>
</body>
<script type="text/javascript">
var panel = document.getElementById("panel");
var beginX, beginY, endX, endY; //设置鼠标的前后位置
var beginIndex, endIndex;
panel.addEventListener("mousedown", function (event) {
var parentPanel = document.getElementById("panel"); if (parentPanel.style.cursor == "move" && event.target != parentPanel) {
beginIndex = event.target.style.zIndex;
event.target.style.zIndex = panel.childNodes.length+1;
currentDivLeft = parseInt(event.target.style.left);
currentDivTop = parseInt(event.target.style.top);
beginX = event.pageX, beginY = event.pageY;
} else if (parentPanel.style.cursor == "default") {
beginX = event.pageX, beginY = event.pageY;
}
}, false);
var newDivx;
panel.addEventListener("mousemove", function (e) {
var parentPanel = document.getElementById("panel");
if (parentPanel.style.cursor == "move" && currentDivLeft != null && e.target != parentPanel) {
var offsetX = e.pageX - beginX;
var offsetY = e.pageY - beginY;
e.target.style.left = currentDivLeft + offsetX + "px";
e.target.style.top = currentDivTop + offsetY + "px";
} else if (parentPanel.style.cursor == "default") {
if (beginX != null) {
endX = e.pageX, endY = e.pageY;
newDivx = getDiv(data.W, data.H, data.L, data.T, 'FFD558');
panel.appendChild(newDivx);
}
}
}, false);
panel.addEventListener("mouseup", function (e) {
var parentPanel = document.getElementById("panel");
if (parentPanel.style.cursor == "move" && e.target != parentPanel) {
var offsetX = e.pageX - beginX;
var offsetY = e.pageY - beginY;
e.target.style.left = currentDivLeft + offsetX + "px";
e.target.style.top = currentDivTop + offsetY + "px";
currentDivLeft = null;
currentDivTop = null;
e.target.style.zIndex = beginIndex;
} else if (parentPanel.style.cursor == "default") {
endX = e.pageX, endY = e.pageY;
if (endX != beginX && endY != beginY) {
var data = getWH(beginX, beginY, endX, endY);
var newDivx = getDiv(data.W, data.H, data.L, data.T, 'FFD558');
panel.appendChild(newDivx);
beginX = 0, beginY = 0, endX = 0, endY = 0;
}
}
}, false);
function getDiv(width, height, left, top, bgcolor) {
var newDiv = document.createElement("div");
newDiv.style.position = "absolute";
newDiv.style.left = left + "px";
newDiv.style.top = top + "px";
newDiv.style.background = '#' + bgcolor;
newDiv.style.width = width + "px";
newDiv.style.height = height + "px";
newDiv.style.border = "solid 1px";
return newDiv;
}
function getWH(bx, by, ex, ey) {
var width = Math.abs(ex - bx);
var height = Math.abs(ey - by);
//确定画矩形的方向
var left = (ex - bx) > 0 ? bx : ex;
var top = (ey - by) > 0 ? by : ey;
var style = { W: width, H: height, L: left, T: top };
return style;
}
panel.addEventListener("mousedown", function (event) {
var parentPanel = document.getElementById("panel");
if (event.target != parentPanel) {
clearOtherPanelColor();
event.target.style.background = "red";
event.target.id = "currentDiv"; //这句必须要,不然创建的元素最后不能删除
}
}, false);
/*--------------此函数有待修改ing--------------
panel.addEventListener("mousemove", function (event) {
var parentPanel = document.getElementById("panel");
if (event.target != parentPanel) {
console.log(event.target.style.left + "--" + event.target.style.width+"--"+event.pageX);
if (event.pageX == (parseInt(event.target.style.left) + (parseInt(event.target.width)))) {
//alert(1);
}
}
}, false);
-----------------------------------------------*/
/*------清除所有div的背景颜色------*/
function clearOtherPanelColor() {
var divs = document.getElementById("panel").childNodes;
for (var i = 1; i < divs.length; i++) {
divs[i].style.background = "#FFD558";
divs[i].id = "";
}
}
/*定义当前所选div的大小*/
var currentDivLeft, currentDivTop;
function currentDivPosition(element) {
currentDivLeft = element.style.left;
currentDivTop = element.style.top;
}
document.onkeydown = function (e) {
var divs = document.getElementById("panel");
var theEvent = window.event || e;
var code = theEvent.keyCode || theEvent.which;
if (code == 17) {
divs.style.cursor = "move";
} else if (code == 46) {
divs.removeChild(document.getElementById("currentDiv"));
}
};
document.onkeyup = function (e) {
var divs = document.getElementById("panel");
divs.style.cursor = "default";
};
</script>
</html>
源码:下载
玩下Javascript的更多相关文章
- 弱弱的玩下Javascript
前言 好久没有更新博客了,也蛮少捣弄javascript,今儿看到一个题目,关于给你一个面板,你可以随意的在上面画矩形,可以移动和删除任意一个你创建的矩形,心血来潮搞着玩哈,实现起来挺简单的,但这代码 ...
- IE下javascript cookie path设置Bug
项目中设置完cookie,在Firefox下顺利测试通过.IE测试出现问题,经定位发现是Javascript设置 Cookie 时的 path 有问题.IE下Cookie设置在 /或者URL所在路径时 ...
- 浏览器环境下Javascript脚本加载与执行探析之DOMContentLoaded
在”浏览器环境下Javascript脚本加载与执行探析“系列文章的前几篇,分别针对浏览器环境下JavaScript加载与执行相关的知识点或者属性进行了探究,感兴趣的同学可以先行阅读前几篇文章,了解相关 ...
- 浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
在<浏览器环境下JavaScript脚本加载与执行探析之defer与async特性>中,我们研究了延迟脚本(defer)和异步脚本(async)的执行时机.浏览器支持情况.浏览器bug以及 ...
- 浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
defer和async特性相信是很多JavaScript开发者"熟悉而又不熟悉"的两个特性,从字面上来看,二者的功能很好理解,分别是"延迟脚本"和"异 ...
- 研究下JavaScript中的Rest參数和參数默认值
研究下JavaScript中的Rest參数和參数默认值 本文将讨论使 JavaScript 函数更有表现力的两个特性:Rest 參数和參数默认值. Rest 參数 通常,我们须要创建一个可变參数的函数 ...
- 朋友想玩下百度的ORC我鼓捣鼓捣thinkphp3集成百度sdk
他想玩的是文字识别 那就玩下 咱们开始 1 先到百度文字识别 添加个应用 这样就有了APPID API KEY SECRET KEY https://console.bce.baidu.com ...
- 好久没玩laravel了,今天玩下Laravel项目迁移步骤
.在新的目录中克隆git远程版本库 .执行composer install安装依赖 .执行php artisan key:generate生成key 好久没玩laravel了,今天玩下Laravel项 ...
- 玩转JavaScript module pattern精髓
JavaScript module pattern是一种常见的javascript编码模式.这种模式本身很好理解,但是有很多高级用法还没有得到大家的注意.本文,我们将回顾这种设计模式,并且介绍一些高级 ...
随机推荐
- C#中使用ref 和 out 的一点认识
ref 通常我们向方法中传递的是值,方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不会受到影响. 这种情况是通常的,当然还有另外一种情况,我们向方法传递 ...
- 在ubuntu上部署hadoop时出现的问题
1. 配置ssh登录 不须要改动/etc/ssh/sshd_config 2. 新建hadoop用户时,home以下没有hadoop文件夹 用以下命令创建 useradd -m hadoop 3. n ...
- 开发现代ASP.NET应用程序
新思想.新技术.新架构——更好更快的开发现代ASP.NET应用程序(续1) 今天在@张善友和@田园里的蟋蟀的博客看到微软“.Net社区虚拟大会”dotnetConf2015的信息,感谢他们的真诚付 ...
- sql 给表结构增加说明
create proc proc_addReMark @TableName nvarchar(50), @RowName nvarchar(50), @RowReMark nv ...
- IOS开发中绘制地图线路
地图应用经常会涉及到线路的绘制问题,ios下可以使用MKMapView进行地图开发,使用 MKOverlayView进行线路的绘制. 使用MKMapView添加MKMap.framework 和Cor ...
- [连载]Java程序设计(04)---任务驱动的方法:工资结算系统
任务:或在公司,该公司将其分为三类人员:部门经理.销售员.在发工资的时候,部门经理拿固定月薪8000元.技术人员按每小时100元领取月薪.销售人员依照500元底薪加当月销售额的4%进行提成.设计并实现 ...
- 探讨css中repaint和reflow
(个人blog迁移文章.) 前言: 页面设计中,不可避免的需要浏览器进行repaint和reflow.那到底什么是repaint和reflow呢.下面谈谈自己对repaint和reflow的理解,以及 ...
- 配置phonegap Android开发环境
phonegap的安装路途曲折,首先要基于多种程序,中途还要解决各种问题,下面是phonegap需要的程序 1.NodeJs 2.Phonegap 3.jdk,jre 4.Apache Ant 5.A ...
- 快速构建Windows 8风格应用6-GridView数据控件
原文:快速构建Windows 8风格应用6-GridView数据控件 本篇博文主要介绍什么是GridView数据控件.如何构建常用的GridView数据呈现样式. 什么是GridView数据控件? G ...
- Session变量不能转移到下页.解决: session.use_trans_sid = 1
附:文摘 ============================================================ 在PHP使用SESSION的朋友可能会碰到这么一个问题.SESSIO ...