1. <html>
  2. <head></head>
  3. <style>
  4. body{padding-top:50px;padding-left:100px;padding-right:150px;}
  5. .fileDiv{float:left;width:100px;height:100px;text-align:center;line-height:100px;font-size:12px;border:1px solid #cccccc;margin-right:10px;margin-bottom:10px;}
  6. .seled{border:1px solid #ff0000;background-color:#D6DFF7;}
  7. </style>
  8. <script type="text/javascript">
  9. /*--------------------------------- 以下4个方法 摘自网络 ----------------------------------------*/
  10. Array.prototype.remove = function( item ){
  11. for( var i = 0 ; i < this.length ; i++ ){
  12. if( item == this[i] )
  13. break;
  14. }
  15. if( i == this.length )
  16. return;
  17. for( var j = i ; j < this.length - 1 ; j++ ){
  18. this[ j ] = this[ j + 1 ];
  19. }
  20. this.length--;
  21. }
  22.  
  23. String.prototype.replaceAll = function (AFindText,ARepText){ raRegExp = new RegExp(AFindText,"g"); return this.replace(raRegExp,ARepText);}
  24.  
  25. function getAllChildren(e) {
  26. return e.all ? e.all : e.getElementsByTagName('*');
  27. }
  28.  
  29. document.getElementsBySelector = function(selector) {
  30.  
  31. if (!document.getElementsByTagName) {
  32. return new Array();
  33. }
  34.  
  35. var tokens = selector.split(' ');
  36. var currentContext = new Array(document);
  37. for (var i = 0; i < tokens.length; i++) {
  38. token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;
  39. if (token.indexOf('#') > -1) {
  40.  
  41. var bits = token.split('#');
  42. var tagName = bits[0];
  43. var id = bits[1];
  44. var element = document.getElementById(id);
  45. if (tagName && element.nodeName.toLowerCase() != tagName) {
  46.  
  47. return new Array();
  48. }
  49. currentContext = new Array(element);
  50. continue;
  51. }
  52. if (token.indexOf('.') > -1) {
  53.  
  54. var bits = token.split('.');
  55. var tagName = bits[0];
  56. var className = bits[1];
  57. if (!tagName) {
  58. tagName = '*';
  59. }
  60.  
  61. var found = new Array;
  62. var foundCount = 0;
  63. for (var h = 0; h < currentContext.length; h++) {
  64. var elements;
  65. if (tagName == '*') {
  66. elements = getAllChildren(currentContext[h]);
  67. } else {
  68. elements = currentContext[h].getElementsByTagName(tagName);
  69. }
  70. for (var j = 0; j < elements.length; j++) {
  71. found[foundCount++] = elements[j];
  72. }
  73. }
  74. currentContext = new Array;
  75. var currentContextIndex = 0;
  76. for (var k = 0; k < found.length; k++) {
  77. if (found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) {
  78. currentContext[currentContextIndex++] = found[k];
  79. }
  80. }
  81. continue;
  82. }
  83. if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
  84. var tagName = RegExp.$1;
  85. var attrName = RegExp.$2;
  86. var attrOperator = RegExp.$3;
  87. var attrValue = RegExp.$4;
  88. if (!tagName) {
  89. tagName = '*';
  90. }
  91. var found = new Array;
  92. var foundCount = 0;
  93. for (var h = 0; h < currentContext.length; h++) {
  94. var elements;
  95. if (tagName == '*') {
  96. elements = getAllChildren(currentContext[h]);
  97. } else {
  98. elements = currentContext[h].getElementsByTagName(tagName);
  99. }
  100. for (var j = 0; j < elements.length; j++) {
  101. found[foundCount++] = elements[j];
  102. }
  103. }
  104. currentContext = new Array;
  105. var currentContextIndex = 0;
  106. var checkFunction;
  107. switch (attrOperator) {
  108. case '=':
  109. checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
  110. break;
  111. case '~':
  112. checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
  113. break;
  114. case '|':
  115. checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
  116. break;
  117. case '^':
  118. checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
  119. break;
  120. case '$':
  121. checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
  122. break;
  123. case '*':
  124. checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
  125. break;
  126. default :
  127. checkFunction = function(e) { return e.getAttribute(attrName); };
  128. }
  129. currentContext = new Array;
  130. var currentContextIndex = 0;
  131. for (var k = 0; k < found.length; k++) {
  132. if (checkFunction(found[k])) {
  133. currentContext[currentContextIndex++] = found[k];
  134. }
  135. }
  136. continue;
  137. }
  138. tagName = token;
  139. var found = new Array;
  140. var foundCount = 0;
  141. for (var h = 0; h < currentContext.length; h++) {
  142. var elements = currentContext[h].getElementsByTagName(tagName);
  143. for (var j = 0; j < elements.length; j++) {
  144. found[foundCount++] = elements[j];
  145. }
  146. }
  147. currentContext = found;
  148. }
  149. return currentContext;
  150. }
  151.  
  152. /*--------------------------------------------------------------------------------------------------------*/
  153. /**
  154. * author: 王永山
  155. * version: 1.1 beta
  156. * date: 2008-09-09
  157. * email: [email]wangys0927@163.com[/email]
  158. *
  159. * update:
  160. * 1. 针对前2个beta版,该版本修复了前两个版本出现的 bug ,
  161. * 2. 进行了代码的简单封装(由于本人初学js,对js掌握的很浅,因此面向对象的理解很差,封装的不好);
  162. * 3. 增加了对 Ctrl 和 Shift 键的支持(目前shift键的功能和ctrl键的功能一样,还不能达到仿windows的选区Shift键的功能)。
  163. * 4. 增加了获取“被选区选中元素”的方法<a href="http://www.codesky.net" class="hden">源码天空</a>,可以点击按钮“getRegions”看效果。
  164. */
  165.  
  166. function addEvent(eventType,eventFunc,eventObj){
  167. eventObj = eventObj || document;
  168. if(window.attachEvent) eventObj.attachEvent("on"+eventType,eventFunc);
  169. if(window.addEventListener) eventObj.addEventListener(eventType,eventFunc,false);
  170. }
  171. function clearEventBubble(evt){
  172. evt = evt || window.event;
  173. if (evt.stopPropagation) evt.stopPropagation(); else evt.cancelBubble = true;
  174. if (evt.preventDefault) evt.preventDefault(); else evt.returnValue = false;
  175. }
  176.  
  177. function posXY(event){
  178. event = event || window.event;
  179. var posX = event.pageX || (event.clientX +
  180. (document.documentElement.scrollLeft || document.body.scrollLeft));
  181. var posY = event.pageY || (event.clientY +
  182. (document.documentElement.scrollTop || document.body.scrollTop));
  183. return {x:posX, y:posY};
  184. }
  185. //----------- 区域选择关键方法 -----------------------
  186. var _selectedRegions = [];
  187. function RegionSelect(selRegionProp){
  188. this.regions =[];
  189. var _regions = document.getElementsBySelector(selRegionProp["region"]);
  190. if(_regions && _regions.length > 0){
  191. var _self = this;
  192. for(var i=0; i< _regions.length;i++){
  193. _regions[i].onmousedown = function(){
  194. var evt = window.event || arguments[0];
  195. if(!evt.shiftKey && !evt.ctrlKey){
  196. // 清空所有select样式
  197. _self.clearSelections(_regions);
  198. this.className += " "+_self.selectedClass;
  199. // 清空selected数组,并加入当前select中的元素
  200. _selectedRegions = [];
  201. _selectedRegions.push(this);
  202. }else{
  203. if(this.className.indexOf(_self.selectedClass) == -1){
  204. this.className += " "+_self.selectedClass;
  205. _selectedRegions.push(this);
  206. }else{
  207. this.className = this.className.replaceAll(_self.selectedClass,"");
  208. _selectedRegions.remove(this);
  209. }
  210. }
  211. clearEventBubble(evt);
  212. }
  213. this.regions.push(_regions[i]);
  214. }
  215. }
  216. this.selectedClass = selRegionProp["selectedClass"];
  217. this.selectedRegion = [];
  218. this.selectDiv = null;
  219. this.startX = null;
  220. this.startY = null;
  221. }
  222.  
  223. RegionSelect.prototype.select = function(){
  224. var _self = this;
  225. addEvent("mousedown",function(){
  226. var evt = window.event || arguments[0];
  227. _self.onBeforeSelect(evt);
  228. clearEventBubble(evt);
  229. },document);
  230.  
  231. addEvent("mousemove",function(){
  232. var evt = window.event || arguments[0];
  233. _self.onSelect(evt);
  234. clearEventBubble(evt);
  235. },document);
  236.  
  237. addEvent("mouseup",function(){
  238. _self.onEnd();
  239. },document);
  240. }
  241.  
  242. RegionSelect.prototype.onBeforeSelect = function(evt){
  243. // 创建模拟 选择框
  244. if(!document.getElementById("selContainer")){
  245. this.selectDiv = document.createElement("div");
  246. this.selectDiv.style.cssText = "position:absolute;width:0px;height:0px;font-size:0px;margin:0px;padding:0px;border:1px dashed #0099FF;background-color:#C3D5ED;z-index:1000;filter:alpha(opacity:60);opacity:0.6;display:none;";
  247. this.selectDiv.id = "selContainer";
  248. document.body.appendChild(this.selectDiv);
  249. }else{
  250. this.selectDiv = document.getElementById("selContainer");
  251. }
  252.  
  253. this.startX = posXY(evt).x;
  254. this.startY = posXY(evt).y;
  255. this.isSelect = true;
  256.  
  257. }
  258.  
  259. RegionSelect.prototype.onSelect = function(evt){
  260. var _self = this;
  261. if(_self.isSelect){
  262. if(_self.selectDiv.style.display == "none") _self.selectDiv.style.display = "";
  263.  
  264. var posX = posXY(evt).x;
  265. var poxY = posXY(evt).y;
  266.  
  267. _self.selectDiv.style.left = Math.min(posX, this.startX);
  268. _self.selectDiv.style.top = Math.min(poxY, this.startY);
  269. _self.selectDiv.style.width = Math.abs(posX - this.startX);
  270. _self.selectDiv.style.height = Math.abs(poxY - this.startY);
  271.  
  272. var regionList = _self.regions;
  273. for(var i=0; i< regionList.length; i++){
  274. var r = regionList[i], sr = _self.innerRegion(_self.selectDiv,r);
  275. if(sr && r.className.indexOf(_self.selectedClass) == -1){
  276. r.className = r.className + " "+_self.selectedClass;
  277. _selectedRegions.push(r);
  278. }else if(!sr && r.className.indexOf(_self.selectedClass) != -1){
  279. r.className = r.className.replaceAll(_self.selectedClass,"");
  280. _selectedRegions.remove(r);
  281. }
  282.  
  283. }
  284. }
  285. }
  286.  
  287. RegionSelect.prototype.onEnd = function(){
  288. if(this.selectDiv){
  289. this.selectDiv.style.display = "none";
  290. }
  291. this.isSelect = false;
  292. //_selectedRegions = this.selectedRegion;
  293. }
  294.  
  295. // 判断一个区域是否在选择区内
  296. RegionSelect.prototype.innerRegion = function(selDiv, region){
  297. var s_top = parseInt(selDiv.style.top);
  298. var s_left = parseInt(selDiv.style.left);
  299. var s_right = s_left + parseInt(selDiv.offsetWidth);
  300. var s_bottom = s_top + parseInt(selDiv.offsetHeight);
  301.  
  302. var r_top = parseInt(region.offsetTop);
  303. var r_left = parseInt(region.offsetLeft);
  304. var r_right = r_left + parseInt(region.offsetWidth);
  305. var r_bottom = r_top + parseInt(region.offsetHeight);
  306.  
  307. var t = Math.max(s_top, r_top);
  308. var r = Math.min(s_right, r_right);
  309. var b = Math.min(s_bottom, r_bottom);
  310. var l = Math.max(s_left, r_left);
  311.  
  312. if (b > t+5 && r > l+5) {
  313. return region;
  314. } else {
  315. return null;
  316. }
  317.  
  318. }
  319.  
  320. RegionSelect.prototype.clearSelections = function(regions){
  321. for(var i=0; i<regions.length;i++){
  322. regions[i].className = regions[i].className.replaceAll(this.selectedClass,"");
  323. }
  324. }
  325.  
  326. function getSelectedRegions(){
  327. return _selectedRegions;
  328. }
  329. /*-------------------------------------- 区域选择方法结束 --------------------------------------------*/
  330.  
  331. function showSelDiv(){
  332. var selInfo = "";
  333. var arr = getSelectedRegions();
  334. for(var i=0; i<arr.length;i++){
  335. selInfo += arr[i].innerHTML+"\n";
  336. }
  337.  
  338. alert("共选择 "+arr.length+" 个文件,分别是:\n"+selInfo);
  339.  
  340. }
  341.  
  342. </script>
  343. <body>
  344. <button onclick="showSelDiv();">getRegions</button>
  345. <div class="fileDiv">file1</div>
  346. <div class="fileDiv">file2</div>
  347. <div class="fileDiv">file3</div>
  348. <div class="fileDiv">file4</div>
  349. <div class="fileDiv">file5</div>
  350. <div class="fileDiv">file6</div>
  351. <div class="fileDiv">file7</div>
  352. <div class="fileDiv">file8</div>
  353. <div class="fileDiv">file9</div>
  354. <div class="fileDiv">file10</div>
  355. <div class="fileDiv">file11</div>
  356. <div class="fileDiv">file12</div>
  357. <div class="fileDiv">file13</div>
  358. <div class="fileDiv">file14</div>
  359. <div class="fileDiv">file15</div>
  360. <div class="fileDiv">file16</div>
  361. <div class="fileDiv">file17</div>
  362. <div class="fileDiv">file18</div>
  363. <div class="fileDiv">file19</div>
  364. <div class="fileDiv">file20</div>
  365. <div class="fileDiv">file21</div>
  366. <div class="fileDiv">file22</div>
  367. <div class="fileDiv">file23</div>
  368. <div class="fileDiv">file24</div>
  369. <div class="fileDiv">file25</div>
  370. <div class="fileDiv">file26</div>
  371. <div class="fileDiv">file27</div>
  372. <div class="fileDiv">file28</div>
  373. <div class="fileDiv">file29</div>
  374. <div class="fileDiv">file30</div>
  375. <div class="fileDiv">file31</div>
  376. <div class="fileDiv">file32</div>
  377. <div class="fileDiv">file33</div>
  378. <div class="fileDiv">file34</div>
  379. <div class="fileDiv">file35</div>
  380. <div class="fileDiv">file36</div>
  381. <div class="fileDiv">file37</div>
  382. <div class="fileDiv">file38</div>
  383. <div class="fileDiv">file39</div>
  384. <div class="fileDiv">file40</div>
  385. <div class="fileDiv">file41</div>
  386. <div class="fileDiv">file42</div>
  387. <div class="fileDiv">file43</div>
  388. <div class="fileDiv">file44</div>
  389. <div class="fileDiv">file45</div>
  390. <div class="fileDiv">file46</div>
  391. <div class="fileDiv">file47</div>
  392. <div class="fileDiv">file48</div>
  393. <div class="fileDiv">file49</div>
  394. <div class="fileDiv">file50</div>
  395. <div class="fileDiv">file51</div>
  396. <div class="fileDiv">file52</div>
  397. <div class="fileDiv">file53</div>
  398. <div class="fileDiv">file54</div>
  399. <div class="fileDiv">file55</div>
  400. <div class="fileDiv">file56</div>
  401. <div class="fileDiv">file57</div>
  402. <div class="fileDiv">file58</div>
  403. <div class="fileDiv">file59</div>
  404. <div class="fileDiv">file60</div>
  405.  
  406. <div style="float:left;width:100%;"><button onclick="showSelDiv();">getRegions</button></div>
  407. </body>
  408. <script>
  409. new RegionSelect({
  410. region:'div.fileDiv',
  411. selectedClass: 'seled'
  412. }).select();
  413. </script>
  414. </html>

js 在页面上模拟多选,蚂蚁线线框的更多相关文章

  1. Progress.js – 为页面上的任意对象创建进度条效果

    Progress.js 是一个 JavaScript 和 CSS3 的库,它帮助开发人员为网页上的每个对象创建和管理进度条效果.你可以设计自己的模板,进度条或者干脆定制. 您可以使用 Progress ...

  2. JS 在页面上直接将json数据导出到excel,支持chrome,edge,IE10+,IE9,IE8,Safari,Firefox

    JS 在页面上直接将json数据导出到excel,支持chrome,edge,IE10+,IE9,IE8,Safari,Firefox <html> <head> </h ...

  3. 使用js在页面上新建文件夹

    使用js在页面上新建文件夹 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  4. 如何使用 js 检测页面上全局变量

    如何使用 js 检测页面上全局变量 js 检测页面全局变量脚本 <!DOCTYPE html> <html lang="zh-Hans"> <head ...

  5. js禁用页面上右键菜单、选中和复制

    有时候我们不想页面上的内容被人复制走,那么就可以使用js对页面进行设置,禁止右键菜单.禁止选中.禁止复制等功能可以有效的达到这个效果,js代码如下所示: /** * 禁用右键菜单 */ documen ...

  6. js检查页面上有无重复id的代码分享

    用js代码检查一个页面上是否用重复的id. 方法一: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ...

  7. 如何用JS获取页面上的所有标签

    最近忙的一匹,忙着大保健,都来不及写博客,今天特意抽出点时间来写一写 前两天看到一个题,是问如何从页面上获取所有的标签的并查看他们的数量,感觉还是有点意思的,所以给大家来搞一下子 我们先来捋捋思路,那 ...

  8. JS 将页面上的表格导出为 Excel 文件

    如果在页面上展示了一个表格,想把这个表格导出为Excel文件,那么在要求不高的情况下,可以直接利用 JavaScript 的 Blob 和 Object URL 特性将表格导出.不过,这就是利用了 E ...

  9. 使用typed.js实现页面上的写字功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 横向不间断滚动DIV

    横向不间断滚动DIV,5个一组,js控制,自动生成任意组显示 <!DOCTYPE html> <html> <head> <meta http-equiv=& ...

  2. linux 时间管理——概念、注意点(一)【转】

    转自:http://www.cnblogs.com/openix/p/3324243.html 参考:1.http://bbs.eyeler.com/thread-69-1-1.html        ...

  3. c# 动态调用.net编写的webservices接口

    创建类WebServiceHelper: public class WebServiceHelper { #region 动态调用WebService动态调用地址 /// < summary&g ...

  4. 通过jquery获取天气的方法

    代码为: $.getScript('http://int.dpool.sina.com/iplookup/iplookup.php?format=js',function(_result){ if(r ...

  5. 安装AdventureWorks2008R2

    在微软的网站,有介绍安装示例数据库AdventureWorks的说明. 你可以在这里下载到压缩包 (AdventureWorks2008R2_Database.zip),解压后会得到两个文件: Adv ...

  6. 描述性统计分析-用脚本将统计量函数批量化&分步骤逐一写出

    计算各种描述性统计量函数脚本(myDescriptStat.R)如下: myDescriptStat <- function(x){ n <- length(x) #样本数据个数 m &l ...

  7. android中的位置服务(LBS)

    自己的位置:LocationManager 基本用法:创建实例:LocationManager locationManager =  (LocationManager)getSystemService ...

  8. Bootstrap_Javascript

    弹窗 一. 结构分析 Bootstrap框架中的模态弹出框,分别运用了“modal”.“modal-dialog”和“modal-content”样式,而弹出窗真正的内容都放置在“modal-cont ...

  9. 30.Nginx集群搭建笔记

    源码安装Nginx: tar -zxvf nginx-1.8.0.tar.gz -C /nginx/        #解压Nginx rpm -ivh keepalived-1.2.13-5.el6_ ...

  10. Linux C++线程池

    .为什么需要线程池? 部分应用程序需要执行很多细小的任务,对于每个任务都创建一个线程来完成,任务完成后销毁线程,而这就会产生一个问题:当执行的任务所需要的时间T1小于等于创建线程时间T2和销毁线程时间 ...