必威-必威-欢迎您

必威,必威官网企业自成立以来,以策略先行,经营致胜,管理为本的商,业推广理念,一步一个脚印发展成为同类企业中经营范围最广,在行业内颇具影响力的企业。

使用数据库实现的Web留言本必威,操作系统提供

2019-10-11 04:40 来源:未知

依照 HTML5 营造 Web 操作系统

2012/09/29 · HTML5, JavaScript · 1 评论 · HTML5, Javascript

来源:IBM Developerworks

简介: Web 操作系统有着守旧操作系统无法比拟的优势,如可以任何时间任何地方使用另外极端进行访谈,数据保存在服务器端,空间更加大,数据安全性越来越好,能够动用服务器端的 CPU、内部存储器等能源开展更为复杂的演算。不过当下的 Web 操作系统前端非常多基于 Flex、Silverlight、ActiveX 插件等技巧开采,存在着对移动器械的协理性差,终端安全性差,开拓难度大等老毛病。

HTML5 是下一代 web 语言的职业,具有包容性好,安全性高,成效充分,开采方便人民群众等优点,极度相符如 Web 操作系统一类的富客户端互连网选用的前端开垦。本文将展现如何选择 HTML5 提供的有余新技巧如:本地数据库、二十四线程开荒、摄像帮忙、离线编制程序等营造贰个宗旨的 Web 操作系统。

简介

守旧的操作系统有着一些难以战胜的老毛病,如仅能在地面终端访谈,或仅补助少数的长途访谈,限于本地终端的能源,总结技术虚弱,存款和储蓄空间有限,缺少有力的防火墙等一二种安全部制,安全性非常糟糕。鉴于上述劣点,Web 操作系统应际而生 – Web 操作系统是一种基于浏览器的虚拟的操作系统,客户通过浏览器能够在里面进展应用程序的操作,以至相关数据的蕴藏。Web 操作系统提供的宗旨服务有文本文书档案的创办与仓库储存,音频录制文件的播放与仓库储存,提供对时间消息的支撑等,越来越高端的劳动则带有即时通讯,邮件以至游戏等服务。Web 操作系统克制了古板操作系统的欠缺,在网络的援救下,它能够在任曾几何时刻,任啥地点点经由任何支持Web 的终极进行寻访,可以行使服务器端Infiniti的揣测及存款和储蓄能源,客商数量保存在劳动器端,安全性较高。

必威 1

相关技艺

日前塑造 Web 操作系统的前端本事主要有 Flex、Silverlight、ActiveX 插件等等,它们各有一对优短处。

Flex

Flex 是一个美丽的富客商端应用框架,潜心于页面突显,Adobe 职业维护,统一牢固,并且其脚本语言 ActionScript3 是面向对象的,极度相符程序员使用。缺点则是功耗高,占用带宽多,对运动应用的支持性差。

Silverlight

Silverlight 是由微软推出的用来跟 Flash 抗衡的 ENCOREIA(富互连网选择)技术方案,优点是具有硬件级的加速成效,但它近日仍不成熟,对非 Windows 系统的扶持性并非常不足好,且学习难度十分大。

ActiveX 插件

ActiveX 插件同样是微软生产的 EscortIA 施工方案,它是三个怒放的缓和方案,能够包容四种语言,可是它的破绽也是令人瞩指标,客户需求调解浏览器的平安品级并下载插件本事运行HavalIA 应用,相当的大地降落了安全性。

HTML5

为推进 web 规范化运动的上进,W3C 推出了下一代 HTML 的正统 – HTML5,为众多的商场所辅助,因而全数非凡的前景。它有以下特点:首先,为增长顾客体验,加强了 web 网页的展现质量;其次,为适应 OdysseyIA 应用的腾飞,追加了本土数据库等 web 应用的意义;再度,由于中度规范化以至无数浏览器商家的努力扶助,它的包容性和安全性极高;最终它是一种简单的语言,轻易为常见开荒者通晓。更为可贵的是,由于节俭和耗能低,在移动设备上 HTML5 将富有更加大的优势。因而更适合如 Web 操作系统一类的 智跑IA 应用的前端开拓。

系统简单介绍

本系统依照 HTML5 开垦,利用 HTML5 引进的二种新技艺如拖拽 API、录像标签、本地数据库、draw API、八线程开拓、离线编制程序等提供了八个基本的 Web 操作系统遭遇,包括了对桌面包车型大巴帮忙、应用程序的支撑,提供了多个轻巧易行的录像播放器和记事本以至一个挂钟,并对系统日志进行了记录,别的还提供了对离线状态的支撑。

桌面实现

系统对桌面包车型大巴支撑至关心注重要总结应用程序Logo的打开与拖拽,以致桌面包车型大巴上下文菜单等。

桌面拖拽

桌面包车型地铁布局由必然数量的 div 组成,它们依照顺序依次排列在矩形的桌面上,为应用程序Logo的开辟与拖拽提供了基本的支撑。

清单 1. 创建 div

XHTML

var iconHolder = document.createElement("div"); iconHolder.id = 'iconHolder' + i; iconHolder.className = "iconHolder"; mainDiv.appendChild(iconHolder);

1
2
3
4
var iconHolder = document.createElement("div");
iconHolder.id = 'iconHolder' + i;
iconHolder.className = "iconHolder";
mainDiv.appendChild(iconHolder);

HTML5 提供了对 drag 事件的支撑,大大简化了完成拖拽的难度。通过对 dragstart 事件的监听,将被拖拽的应用程序Logo所在的 div 记录下来,作为拖拽的源。

清单 2. 拖拽帮忙

XHTML

iconHolder.addEventListener("dragstart", function(ev) { var dt = ev.dataTransfer; dt.setData("text/plain", ev.currentTarget.id);// 记录被拖拽Logo的 id }, false); iconHolder.add伊芙ntListener("drop", function(ev) { var dt = ev.dataTransfer; var srcIconHolderId = dt.getData("text/plain"); var srcIconHolder = document.getElementById(srcIconHolderId); // 要是拖拽至回收站,则删掉被拖拽Logo,不然交换两Logo地点if(ev.currentTarget.firstChild && ev.currentTarget.firstChild.id == "recycleBin" && srcIconHolder.firstChild.id != "recycleBin"){ srcIconHolder.innerHTML = ""; }else if(ev.currentTarget.firstChild){ var temp = ev.currentTarget.firstChild; ev.currentTarget.appendChild(srcIconHolder.firstChild); srcIconHolder.appendChild(temp); }else{ ev.currentTarget.appendChild(srcIconHolder.firstChild); } }, false);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
iconHolder.addEventListener("dragstart", function(ev) {
var dt = ev.dataTransfer;
dt.setData("text/plain", ev.currentTarget.id);// 记录被拖拽图标的 id
}, false);
 
iconHolder.addEventListener("drop", function(ev) {
var dt = ev.dataTransfer;
var srcIconHolderId = dt.getData("text/plain");
var srcIconHolder = document.getElementById(srcIconHolderId);
 
// 如果拖拽至回收站,则删掉被拖拽图标,否则互换两图标位置
if(ev.currentTarget.firstChild && ev.currentTarget.firstChild.id == "recycleBin" &&
srcIconHolder.firstChild.id != "recycleBin"){
                srcIconHolder.innerHTML = "";
}else if(ev.currentTarget.firstChild){
        var temp =  ev.currentTarget.firstChild;
        ev.currentTarget.appendChild(srcIconHolder.firstChild);
        srcIconHolder.appendChild(temp);
}else{
       ev.currentTarget.appendChild(srcIconHolder.firstChild);
}
}, false);

透过对 drop 事件的监听,能够博得拖拽的源,以至拖拽的对象 div。若目的 div 为空,则将源 div 中的应用程序Logo转移至指标 div 中。若指标 div 中已盈盈应用程序Logo,则将四个Logo的职分交换。若回收站Logo处于指标 div 中,回收站将发挥作用并将源 div 中的应用程序Logo删除。图 1 展现了桌面拖拽的功效。

图 1. 桌面拖拽效果

必威 2前后相继展开

程序可以以三种办法打开,左键点击或通过上下文菜单张开。

经过监听 div 的 onclick 事件,获取要开采的应用程序 id,并选取 openApp 方法打开相应的应用程序可完结对左键点击的扶助。

清单 3. 左键点击

XHTML

iconHolder.onclick = function(ev){ if(ev.currentTarget.firstChild){ openApp(ev.currentTarget.firstChild.id); ev.stopPropagation(); } };

1
2
3
4
5
6
iconHolder.onclick =  function(ev){
if(ev.currentTarget.firstChild){
        openApp(ev.currentTarget.firstChild.id);
        ev.stopPropagation();
}
};

经过监听 div 的 oncontextmenu 事件,获取要展开的应用程序 id,并采用openAppContextMenu 方法展现相应应用程序的上下文菜单,可完成对右键上下文菜单的援救。

清单 4. 上下文菜单

XHTML

iconHolder.oncontextmenu = function(ev){ if(ev.currentTarget.firstChild){ openAppContextMenu(ev.currentTarget.firstChild.id, ev); ev.stopPropagation(); } return false; };

1
2
3
4
5
6
7
iconHolder.oncontextmenu =  function(ev){
if(ev.currentTarget.firstChild){
        openAppContextMenu(ev.currentTarget.firstChild.id, ev);
        ev.stopPropagation();
}
return false;
};

动用相应应用程序的 id,能够收获相应应用程序的本子,并实行,同一时候在系统日志中记录下相应的操作。

清单 5. 主次张开

XHTML

function openApp(appId){ var time = new Date().getTime(); var action = "open app"; var details = "open: " + appId; addHistory(time, action, details);// 记录系统日志 var appScript = getAppScript(appId);// 获取应用程序脚本 eval(appScript);// 试行应用程序 }

1
2
3
4
5
6
7
8
function openApp(appId){
    var time = new Date().getTime();
    var action = "open app";
    var details = "open: " + appId;
    addHistory(time, action, details);// 记录系统日志
    var appScript = getAppScript(appId);// 获取应用程序脚本
    eval(appScript);// 执行应用程序
}

清单 6. 开荒程序上下文菜单

XHTML

function openAppContextMenu(appId, ev){ var appContextMenu = document.getElementById("appContextMenu"); appContextMenu.style.display="block";// 令上下文菜单可以看到appContextMenu.style.pixelTop=ev.clientY;// 设置内外文菜单位置appContextMenu.style.pixelLeft=ev.clientX; appContextMenu.style.background = "#eee"; appContextMenu.style.color = "black"; appContextMenu.style.fontSize = "30"; appContextMenu.style.width = "200px"; appContextMenu.style.height = "220px"; appContextMenu.style.opacity = 0.5;// 令上下文菜单光滑度为 八分之四appContextMenu.innerHTML = ""; // 获取应用程序相应上下文菜单的内容 var apps = getApps(); for(var i=0; i<apps.length; i++){ if(apps[i].appId == appId){ for(var j=0; j<apps[i].contextMenu.length; j++){ appContextMenu.innerHTML += "<div class='appContextMenuItem' onclick="appContextMenu.style.display='none';" + apps[i].contextMenu[j].action + "" onmouseover='this.style.background="darkblue"' onmouseout='this.style.background="#eee"'>" +apps[i].contextMenu[j].name+"</div>"; } break; } } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function openAppContextMenu(appId, ev){
var appContextMenu = document.getElementById("appContextMenu");
appContextMenu.style.display="block";// 令上下文菜单可见
appContextMenu.style.pixelTop=ev.clientY;// 设置上下文菜单位置
appContextMenu.style.pixelLeft=ev.clientX;
appContextMenu.style.background = "#eee";
appContextMenu.style.color = "black";
appContextMenu.style.fontSize = "30";
appContextMenu.style.width = "200px";
appContextMenu.style.height = "220px";
appContextMenu.style.opacity = 0.5;// 令上下文菜单透明度为 50%
appContextMenu.innerHTML = "";
 
// 获取应用程序相应上下文菜单的内容
var apps = getApps();
for(var i=0; i<apps.length; i++){
                if(apps[i].appId == appId){
                        for(var j=0; j<apps[i].contextMenu.length; j++){
                        appContextMenu.innerHTML += "<div class='appContextMenuItem'
                        onclick="appContextMenu.style.display='none';" +
                        apps[i].contextMenu[j].action + ""
                        onmouseover='this.style.background="darkblue"'
                        onmouseout='this.style.background="#eee"'>"
                        +apps[i].contextMenu[j].name+"</div>";
                        }
                        break;
                 }  
}
}

应用程序的上下文菜单由名字为 appContextMenu 的 div 完成,将 oncontextmenu 事件中的 clientX 及 clientY 作为上下文菜单出现的岗位,并将其折射率设置为 0.5。利用相应应用程序的 id 获取上下文菜单对应的剧情,并将其填写至上下文菜单。

图 2 显示了应用程序上下文菜单展开时的作用。

图 2. 应用程序上下文菜单

必威 3上下文菜单

桌面上下文菜单的达成格局与应用程序上下文菜单的兑现格局为主类似,图 3 和图 4 分别是桌面以至职分栏的上下文菜单。

图 3. 桌面上下文菜单

必威 4

 图 4. 职分栏上下文菜单

必威 5摄像播放器

系统提供了二个简练的录制播放器,它扶助从系统外界拖拽录像文件实行播报。

切合网络媒体的向上,HTML5 提供了摄像标签 video 以便于进步对摄像的援助,大大简化了 web 播放器开荒的难度,开荒职员仅凭几行代码,就可以支付出贰个基本功能完善的录制播放器。

清单 7. 录制标签的创设

XHTML

var video = document.createElement('video'); video.id ='video'; video.src =''; video.width = 370; video.height = 260; video.controls = 'controls'; video.className = 'video'; appHolder.appendChild(video); addDragSupport(appHolder);

1
2
3
4
5
6
7
8
9
var video = document.createElement('video');
video.id ='video';
video.src ='';
video.width  = 370;
video.height = 260;
video.controls = 'controls';
video.className = 'video';
appHolder.appendChild(video);
addDragSupport(appHolder);

清单 7 中布局了三个 video 标签并将其增加到四个名为 appHolder 的 div 中。代码的最后一行为其增添了拖拽的支撑。

HTML5 不但支持浏览器内的拖拽,也扶持浏览器与本地系统里面的拖拽。清单 8 呈现了为三个 div 增多拖拽协理的历程。

清单 8. 增加拖拽辅助

JavaScript

function addDragSupport(dropbox){ document.addEventListener("dragenter", function(e){ }, false); document.addEventListener("dragleave", function(e){ }, false); dropbox.addEventListener("dragenter", function(e){ }, false); dropbox.addEventListener("dragleave", function(e){ }, false); dropbox.addEventListener("dragenter", function(e){ e.stopPropagation(); e.preventDefault(); }, false); dropbox.addEventListener("dragover", function(e){ e.stopPropagation(); e.preventDefault(); }, false); dropbox.addEventListener("drop", function(e){ handleFiles(e.dataTransfer.files, e.currentTarget, e); e.stopPropagation(); e.preventDefault(); }, false); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function addDragSupport(dropbox){
document.addEventListener("dragenter", function(e){
}, false);
document.addEventListener("dragleave", function(e){
}, false);
dropbox.addEventListener("dragenter", function(e){
}, false);
dropbox.addEventListener("dragleave", function(e){
}, false);
dropbox.addEventListener("dragenter", function(e){
e.stopPropagation();
e.preventDefault();
}, false);
dropbox.addEventListener("dragover", function(e){
e.stopPropagation();
e.preventDefault();
}, false);
dropbox.addEventListener("drop", function(e){
handleFiles(e.dataTransfer.files, e.currentTarget, e);
e.stopPropagation();
e.preventDefault();              
}, false);  
}

个中,handleFiles 函数表达了怎么对拖拽的文件进行拍卖。

清单 9. 拖拽管理

JavaScript

function handleFiles(files, dropbox, e) { if(files.length == 0){// 若文件不设有,则用相应文本替代 var dt = e.dataTransfer; var text = dt.getData("text/plain"); var p = document.createElement("p"); p.innerHTML += text; dropbox.appendChild(p); return; } for (var i = 0; i < files.length; i++) { var file = files[i]; var fileProcessor = dropbox.firstChild; fileProcessor.classList.add("obj"); fileProcessor.file = file; // 添Gavin件 var reader = new FileReader(); reader.onload = (// 读取文件内容 function(aFileProcessor) { return function(e) { aFileProcessor.src = e.target.result; }; } )(fileProcessor); reader.readAsDataU奔驰G级L(file); } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function handleFiles(files, dropbox, e) {
    if(files.length == 0){// 若文件不存在,则用相应文本代替
         var dt = e.dataTransfer;
         var text = dt.getData("text/plain");
         var p = document.createElement("p");
         p.innerHTML += text;
         dropbox.appendChild(p);
         return;
}
 
for (var i = 0; i < files.length; i++) {
         var file = files[i];
         var fileProcessor = dropbox.firstChild;
         fileProcessor.classList.add("obj");
         fileProcessor.file = file; // 添加文件
 
         var reader = new FileReader();
         reader.onload = (// 读取文件内容
         function(aFileProcessor) {
                 return function(e) {
                 aFileProcessor.src = e.target.result;
};
}
)(fileProcessor);
  reader.readAsDataURL(file);
}
}

handleFiles 函数首先推断文件是还是不是留存,若不设有,则以相应文字代替,若存在,则对

有着文件相继举行拍卖。向 fileprocessor( 这里是录制标签 ) 添Gavin书,然后选拔 File里德r 读取文件内容至 fileprocessor 实行拍卖。

图 5 展现了拖拽贰个录像文件 movie.ogg 到播放器的效果与利益。

图 5. 录像播放

必威 6

本土存款和储蓄

Web 操作系统常常将相当多数码存款和储蓄于劳动器端,那样做的好处可想而知,数据存款和储蓄空间更加大,安全性越来越好。然则这么做也会有不足之处,由于网络的安生乐业依旧较本地球磁性盘差,所以在脱离互联网的景况下,Web 操作系统不能得到相应的多寡财富,由此 Web 操作系统需求一定的走访本地存款和储蓄空间的力量,当然当地存款和储蓄空间仅是作为服务器端存款和储蓄的三个补充,它的空间有限,访谈也面前蒙受分明的限定。

长久以来,HTML 以 库克ie 作为访谈本地空间的措施,但是,这种办法具备非常多缺欠和不足,如存款和储蓄的数据格式过于简短,常常仅为键值对;存款和储蓄的半空中尺寸有限。为此,HTML5 提供了本地数据库以巩固地点存款和储蓄空间的拜候技能,它是贰个简化版的数据库,能够支持模拟的 SQL 乃至轻巧的事务管理等作用。

系统为永葆地点存款和储蓄,创造了多个名叫 MyData 的数据库。清单 10 展现了数据库创设的长河。

清单 10. 创立数据库

XHTML

var db; var openDatabase; if(openDatabase != undefined) db = openDatabase('MyData', '', 'My Database', 102400);

1
2
3
4
var db;
var openDatabase;
if(openDatabase != undefined)
     db = openDatabase('MyData', '', 'My Database', 102400);

里头 MyData 为数据库的称谓,省略的参数为数据库的版本,My Database 为呈现的名称,最终的数字为数据库预估长度(以字节为单位)。

系统日志将系统在某有的时候间的作为操作记录下来,本地数据库为其提供仓储支持。日志在数据库中蕴藏为表 History,富含 3 个字段,分别为时间,操作,及操作的详细音讯。清单 11 展现了系统是什么记录日志的。

清单 11. 日记记录

XHTML

var time = new Date().getTime(); var action = "open app"; var details = "open: " + appId; addHistory(time, action, details);// 向系统日志中加多一条记下 function addHistory(time, action, details){ if(openDatabase != undefined) db.transaction( function(tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS History(time INTEGER, action TEXT, details TEXT)',[]);// 创制日志记录表 tx.executeSql('INSERT INTO History VALUES(?, ?, ?)', [time, action, details], // 插入一条日志 function(tx, rs) { //alert("store: "+time+"-"+action+"-"+details); }, function(tx, error) { //alert(error.source + "::" + error.message); }); }); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var time = new Date().getTime();  
var action = "open app";
var details = "open: " + appId;
addHistory(time, action, details);// 向系统日志中添加一条记录
 
function addHistory(time, action, details){
if(openDatabase != undefined)
db.transaction(
function(tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS History(time INTEGER,
action TEXT, details TEXT)',[]);// 创建日志记录表  
tx.executeSql('INSERT INTO History VALUES(?, ?, ?)', [time,
action, details], // 插入一条日志
function(tx, rs) {  
//alert("store: "+time+"-"+action+"-"+details);  
              },  
function(tx, error) {
    //alert(error.source + "::" + error.message);  
});  
});  
}

清单的第一部分显得了何等调用日志记录,第二有的显得了日志记录的详实经过。在三个transaction 中,首先判别表 History 是或不是存在,若海市蜃楼,则开创它。第二部分进行一条 SQL 语句,向数据库中插入当前的日志。

透过搜寻表 History,大家得以查看系统日志,清单 12 展现了什么样从数据库中查询系统日志,并将其出示出来。

清单 12. 日记展现

XHTML

var historyTable = document.getElementById("historyTable"); // 定义表头 historyTable.innerHTML = ""; var th = document.createElement('thead'); th.style = "color:#CC3300"; var th1 = document.createElement('td'); th1.align = "center"; th1.width=300; th1.innerHTML = "Time"; var th2 = document.createElement('td'); th2.align = "center"; th2.width=100; th2.innerHTML = "Action"; var th3 = document.createElement('td'); th3.align = "center"; th3.width=150; th3.innerHTML = "Details"; th.appendChild(th1); th.appendChild(th2); th.appendChild(th3); historyTable.appendChild(th); if(openDatabase != undefined) db.transaction(function(tx) { tx.executeSql('SELECT * FROM History', [], function(tx, rs) { // 将日志逐一突显到表的各行中 for(var i = 0; i < rs.rows.length && i<15; i++) { var tr = document.createElement('tr'); var td1 = document.createElement('td'); td1.style.paddingLeft = "3px"; td1.style.paddingRight = "3px"; var t = new Date(); t.setTime(rs.rows.item(i).time); td1.innerHTML = t.toLocaleDateString()+ " "+t.toLocaleTimeString(); var td2 = document.createElement('td'); td2.style.paddingLeft = "3px"; td2.style.paddingRight = "3px"; td2.innerHTML = rs.rows.item(i).action; var td3 = document.createElement('td'); td3.style.paddingLeft = "3px"; td3.style.paddingRight = "3px"; td3.innerHTML = rs.rows.item(i).details; tr.appendChild(td1); tr.appendChild(td2); tr.appendChild(td3); historyTable.appendChild(tr); } }); });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
var historyTable = document.getElementById("historyTable");
 
// 定义表头
historyTable.innerHTML = "";
var th = document.createElement('thead');
th.style = "color:#CC3300";
var th1 = document.createElement('td');
th1.align = "center";
th1.width=300;
th1.innerHTML = "Time";
var th2 = document.createElement('td');
th2.align = "center";
th2.width=100;
th2.innerHTML = "Action";
var th3 = document.createElement('td');
th3.align = "center";
th3.width=150;
th3.innerHTML = "Details";
th.appendChild(th1);  
th.appendChild(th2);  
th.appendChild(th3);
historyTable.appendChild(th);
 
if(openDatabase != undefined)
db.transaction(function(tx) {    
tx.executeSql('SELECT * FROM History', [], function(tx, rs)
{  
      // 将日志逐条显示到表的各行中
for(var i = 0; i < rs.rows.length && i<15; i++) {                    
var tr = document.createElement('tr');
var td1 = document.createElement('td');
td1.style.paddingLeft = "3px";
td1.style.paddingRight = "3px";
 
var t = new Date();  
t.setTime(rs.rows.item(i).time);  
td1.innerHTML = t.toLocaleDateString()+
" "+t.toLocaleTimeString();
 
var td2 = document.createElement('td');  
td2.style.paddingLeft = "3px";
td2.style.paddingRight = "3px";
td2.innerHTML = rs.rows.item(i).action;
 
var td3 = document.createElement('td');
td3.style.paddingLeft = "3px";
td3.style.paddingRight = "3px";
td3.innerHTML = rs.rows.item(i).details;  
 
tr.appendChild(td1);  
tr.appendChild(td2);  
tr.appendChild(td3);
 
historyTable.appendChild(tr);                  
}  
});  
});

清单 12 中,首先得到用于显示的日志的 HTML 表格 historyTable,并设置其样式及表头。

接下来在八个 transaction( 事务 ) 中,实行一条 SQL 语句,查询系统日志,并将每条日志加多为 historyTable 中的一行以便展现。图 6 彰显了系统日志的效益。

图 6. 系统日志

必威 7

记事本

系统提供了二个简易的记事本,完结了文本文书档案的基本操作。文本文书档案满含题目和情节七个显式属性,以至二个名字为id 的隐式属性。与系统日志类似,本地数据库为文本数据的存款和储蓄提供了底层的援助。图 7 突显了记事本程序的分界面。

图 7. 记事本

必威 8

当编辑完文书档案的标题与内容后,点击左上角的保存按键,将实施 createFile 函数。清单 13 呈现了 createFile 函数的事无巨细经过。

清单 13. 创设文件

XHTML

function createFile(fileId, fileTitle, fileContent){ var idx = 1; var update = false;//false 表示新建,true 表示修改 if(openDatabase != undefined) db.transaction(function(tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS TextFiles(idx INTEGER, title TEXT, content TEXT)',[]);// 创造文本文书档案表 tx.executeSql('SELECT * FROM TextFiles', [], function(tx, rs){ for(var i = 0; i < rs.rows.length; i++) { // 若文书档案存在,则修改它 if(rs.rows.item(i).idx == fileId){ db.transaction(function(tx) { tx.executeSql('UPDATE TextFiles SET title=?, content=? WHERE idx='+fileId, [fileTitle, fileContent], function(tx, rs) { alert("update successfully"); }); }); return; } } // 若文书档案不设有,则新建贰个文书档案 if(rs.rows.length>0) idx = rs.rows.item(rs.rows.length-1).idx + 1; db.transaction(function(tx) { tx.executeSql('INSERT INTO TextFiles VALUES(?, ?, ?)', [idx, fileTitle, fileContent], function(tx, rs){ alert("save successfully: "+idx+"-"+fileTitle+ "-"+fileContent); createFileIcon(idx); }, function(tx, error) { alert(error.source + "::" + error.message); }); }); }); }); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function createFile(fileId, fileTitle, fileContent){
     var idx = 1;
     var update = false;//false 表示新建,true 表示修改
 
     if(openDatabase != undefined)
         db.transaction(function(tx) {
         tx.executeSql('CREATE TABLE IF NOT EXISTS TextFiles(idx INTEGER,
         title TEXT, content TEXT)',[]);// 创建文本文档表
         tx.executeSql('SELECT * FROM TextFiles', [], function(tx, rs){
             for(var i = 0; i < rs.rows.length; i++) {
                // 若文档存在,则修改它
                 if(rs.rows.item(i).idx == fileId){
                     db.transaction(function(tx) {    
                     tx.executeSql('UPDATE TextFiles
                     SET title=?, content=?
                     WHERE idx='+fileId,
                     [fileTitle, fileContent],
                     function(tx, rs) {  
                             alert("update successfully");
                     });  
                 });
                 return;
             }        
}    
// 若文档不存在,则新建一个文档        
if(rs.rows.length>0)
idx = rs.rows.item(rs.rows.length-1).idx + 1;
db.transaction(function(tx) {                        
tx.executeSql('INSERT INTO TextFiles VALUES(?, ?, ?)', [idx, fileTitle, fileContent],
               function(tx, rs){  
               alert("save successfully: "+idx+"-"+fileTitle+ "-"+fileContent);  
               createFileIcon(idx);  
},  
function(tx, error) {
                alert(error.source + "::" + error.message);  
                 });  
             });
         });
     });
}

清单 13 首先在一个 transaction 中,首先剖断用于存款和储蓄文本文书档案的表 TextFiles 是还是不是存在,若官样文章,则开创它。然后经过查询表 TextFiles 判别文本文书档案是还是不是留存,若存在,则当前操作为更新操作,程序将进行一条 SQL 语句,对当下文本文书档案进行翻新。若一纸空文,则取当前最大文书档案 id 并加 1 用作新文书档案的 id,并进行一条 SQL 语句,将文书档案消息,包罗文书档案id,以致标题和剧情插入到数据库中,并于插入操作结束后的回调方法中,利用 createFileIcon 方法在桌面上为新文书档案创制三个文书档案Logo。清单 14 呈现了 createFileIcon 方法的现实经过。

清单 14. 成立文书档案Logo

XHTML

function createFileIcon(fileId){ var iconHolder; for(var i=1;i<=120;i++){// 查询第多个为空的职位 iconHolder = document.getElementById('iconHolder' + if(!iconHolder.firstChild ){ var text = document.createElement('img'); text.src = "images/text.gif"; text.id = fileId; iconHolder.appendChild(text); text.onclick = function(ev){ if(ev.currentTarget){ openApp('notebook');// 展开记事本应用程序 var saveHolder = document.getElementById('saveHolder'); saveHolder.onclick = function(){ var title = document.getElementById('title'); var content = document.getElementById('content'); createFile(fileId, title.value, content.value);// 创设文本文档 }; var openedFileId = ev.currentTarget.id; if(openDatabase != undefined) db.transaction(function(tx) {// 查询数据库,显示文书档案内容 tx.executeSql('SELECT * FROM TextFiles', [], function(tx, rs){ for(var i = 0; i < rs.rows.length; i++) { if((rs.rows.item(i).idx+"") == (openedFileId+"")){ var title = document.getElementById('title'); var content = document.getElementById('content'); title.value = rs.rows.item(i).title; content.value = rs.rows.item(i).content;} } }); }); ev.stopPropagation(); } }; break; } }//for }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function createFileIcon(fileId){
     var iconHolder;
     for(var i=1;i<=120;i++){// 查询第一个为空的位置
         iconHolder = document.getElementById('iconHolder' + if(!iconHolder.firstChild ){
             var text = document.createElement('img');
             text.src = "images/text.gif";
             text.id = fileId;
             iconHolder.appendChild(text);
             text.onclick =  function(ev){  
                 if(ev.currentTarget){
                 openApp('notebook');// 打开记事本应用程序
                 var saveHolder = document.getElementById('saveHolder');
                 saveHolder.onclick  = function(){
                     var title = document.getElementById('title');
                     var content = document.getElementById('content');
                     createFile(fileId, title.value, content.value);// 创建文本文档
                 };
 
             var openedFileId = ev.currentTarget.id;
             if(openDatabase != undefined)
             db.transaction(function(tx) {// 查询数据库,显示文档内容
             tx.executeSql('SELECT * FROM TextFiles', [], function(tx, rs){
                 for(var i = 0; i < rs.rows.length; i++) {  
                 if((rs.rows.item(i).idx+"") == (openedFileId+"")){
                     var title = document.getElementById('title');
                     var content = document.getElementById('content');          
                     title.value = rs.rows.item(i).title;                  
                     content.value = rs.rows.item(i).content;}    
                              }
                });
});
   ev.stopPropagation();
}
};
break;
}    
}//for
}

清单 14 首先在桌面中寻觅一个空的 div,然后创设贰个文书档案Logo,并将其填充至 div。文书档案Logo有三个 id 属性对应文档id。最终为文书档案Logo增加点击事件管理函数,当点击文书档案Logo时,会首先张开记事本,然后依据文书档案Logo的 id 查询数据库,提取文书档案的标题和剧情实行体现。

图 8 呈现了创办后的文本文书档案,点击后的效果如图 7 所示。

图 8. 文本文书档案

必威 9时钟

系统提供了二个简易的机械原子钟用以显示当明日子,它由二个表盘以致分针和时针组成,能够随着岁月的变改动态地改动。现在的 web 应用使用 JavaScript 或 Flash 完毕此类效率,其复杂总来说之。依赖HTML5 的 draw API,能够轻便地画出所需的图形,非常的大的便利了此类应用的创设,别的,HTML5 还提供了昔日 JavaScript 无法支撑的二十八线程编制程序,大大升高了 web 应用的交互性和丰裕性。

石英表有多少个骨干的表面,它仅是一副轻便的图片,如图 9 所示。

图 9. 表盘

必威 10

在表面之上,建有一个 canvas( 画布 ),如清单 15 所示。

清单 15. 画布

JavaScript

<canvas id="canvas" width="128px" height="128px"></canvas>

1
<canvas id="canvas" width="128px" height="128px"></canvas>

接下去,清单 17 将在画布上模拟出石英钟以至分针,在这里前边,额外部必要要八个后台线程用以总括时间,它被定义在名称叫time.js 的单独脚本文件中,如清单 16 所示。

清单 16. 后台线程

XHTML

onmessage = function(event) { //var i = 1; setInterval(function() { //i++; postMessage(""); }, 60000); };

1
2
3
4
5
6
7
8
onmessage = function(event)
{
//var i = 1;
    setInterval(function() {
    //i++;
    postMessage("");
    }, 60000);
};

每过 60 分钟,后台线程将会上前台线程发送叁个空音信,以报告前台线程有 60 分钟已归西了。

清单 17. 前台线程的最初化

XHTML

var canvas = document.getElementById("canvas"); if (canvas == null) return false; var context = canvas.getContext('2d');// 那是一个二维的图像 context.lineWidth = 2; context.translate(64, 64);// 定义原点 // 起初化分针 context.beginPath(); context.moveTo(0,0);// 从原点起头 var date = new Date(); var mhx = 37*Math.cos((date.getMinutes()-15)*Math.PI/30); var mhy = 37*Math.sin((date.getMinutes()-15)*Math.PI/30); context.lineTo(mhx, mhy);// 至分针末端所在地方 context.closePath(); context.stroke(); // 最早化时针 context.beginPath(); context.moveTo(0,0);// 从原点开头 var date = new Date(); var hour = date.getHours(); if(hour>=12) hour = hour - 12; var minute = date.getMinutes(); var hhx = 27*Math.cos((hour-3)*Math.PI/6 + minute*Math.PI/360); var hhy = 27*Math.sin((hour-3)*Math.PI/6 + minute*Math.PI/360); context.lineTo(hhx, hhy);// 至时针末端所在地方 context.closePath(); context.stroke();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var canvas = document.getElementById("canvas");
if (canvas == null)  
return false;  
var context = canvas.getContext('2d');// 这是一个二维的图像
context.lineWidth = 2;
context.translate(64, 64);// 定义原点
 
// 初始化分针
context.beginPath();
context.moveTo(0,0);// 从原点开始
var date = new Date();
var mhx = 37*Math.cos((date.getMinutes()-15)*Math.PI/30);
var mhy = 37*Math.sin((date.getMinutes()-15)*Math.PI/30);
context.lineTo(mhx, mhy);// 至分针末端所在位置
context.closePath();
context.stroke();
 
// 初始化时针
context.beginPath();
context.moveTo(0,0);// 从原点开始
var date = new Date();
var hour = date.getHours();
if(hour>=12)
hour = hour - 12;
var minute = date.getMinutes();
var hhx = 27*Math.cos((hour-3)*Math.PI/6 + minute*Math.PI/360);
var hhy = 27*Math.sin((hour-3)*Math.PI/6 + minute*Math.PI/360);
context.lineTo(hhx, hhy);// 至时针末端所在位置
context.closePath();
context.stroke();

前台线程首先会赢得 canvas,并设置表盘核心为坐标原点。然后,获取当前时光,总括分针当前所应指向的坐标,然后从原点出发,画出分针。对于时针,若系统为 24 小时制,须要首先转化为 12 小时制,此后的拍卖临近于分针。

接下去,须求将前台与后台线程联系起来,利用 HTML5 提供的二十八线程编制程序方法,申明 Worker 对象作为后台线程的代理,并应用 onmessage 事件,对后台线程发出的新闻进行拍卖。

清单 18. 前台线程的 onmessage 事件

XHTML

var worker = new Worker("js/timer.js"); worker.onmessage = function(event){ context.clearRect(-64, -64, 128, 128);// 清空分针和时针 // 重画分针 context.beginPath(); context.moveTo(0,0);// 从原点领头 var date = new Date(); var mhx = 37*Math.cos((date.getMinutes()-15)*Math.PI/30); var mhy = 37*Math.sin((date.getMinutes()-15)*Math.PI/30); context.lineTo(mhx, mhy);// 至分针末端所在地方 context.closePath(); context.stroke(); // 重画时针 context.beginPath(); context.moveTo(0,0);// 从原点起头 var date = new Date(); var hour = date.getHours(); if(hour>=12) hour = hour - 12; var minute = date.getMinutes(); var hhx = 27*Math.cos((hour-3)*Math.PI/6 + minute*Math.PI/360); var hhy = 27*Math.sin((hour-3)*Math.PI/6 + minute*Math.PI/360); context.lineTo(hhx, hhy);// 至时针末端所在地方 context.closePath(); context.stroke(); }; worker.postMessage("");

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var worker = new Worker("js/timer.js");
 
worker.onmessage = function(event){
 
    context.clearRect(-64, -64, 128, 128);// 清空分针和时针
 
    // 重画分针
    context.beginPath();
    context.moveTo(0,0);// 从原点开始  
    var date = new Date();
    var mhx = 37*Math.cos((date.getMinutes()-15)*Math.PI/30);
    var mhy = 37*Math.sin((date.getMinutes()-15)*Math.PI/30);
    context.lineTo(mhx, mhy);// 至分针末端所在位置
    context.closePath();
    context.stroke();
 
        // 重画时针
    context.beginPath();
    context.moveTo(0,0);// 从原点开始  
    var date = new Date();
    var hour = date.getHours();
    if(hour>=12)
    hour = hour - 12;
    var minute = date.getMinutes();
    var hhx = 27*Math.cos((hour-3)*Math.PI/6 + minute*Math.PI/360);
    var hhy = 27*Math.sin((hour-3)*Math.PI/6 + minute*Math.PI/360);
    context.lineTo(hhx, hhy);// 至时针末端所在位置
    context.closePath();
    context.stroke();
    };
    worker.postMessage("");

每过 60 分钟,后台线程将会上前台线程发送三个空新闻,前台线程接收到新闻后,首先,清空 canvas,然后重新获得当前光阴,计算分针以致时针对应的坐标,同等对待新画出时针和分针,进而做到对分针以至时针的换代,最后,每过 1 分钟,表盘更新一次,进而模拟出动态时针的效果,如图 10 所示。

图 10. 时钟

必威 11离线扶植

纵然如此 Web 操作系统的亮点是能够利用网络随时随地实行访问。但是在不能访谈互联网的情状下,Web 操作系统便力所不及发挥成效。由此 Web 操作系统有须要在离线状态下,还可以对有的行使及其职能拓宽扶助。事实上,种种浏览器已提供了美妙绝伦的缓存机制以提供对离线应用的支撑,然后那一个缓存机制往往是前段时间性的,不可控的。HTML5 为开辟职员提供了化解此主题材料的另一种渠道,它提供了一种永远性的,自定义的缓存方法,使得 Web 操作系统能够在离线的情景下,依旧援助部分行使的机能。

HTML5 离线援救的主干是二个缓存清单,在那之中列出了须求缓存的文本,本系统中的缓存文件 index.manifest,如清单 19 所示。

清单 19. 缓存清单

XHTML

CACHE MANIFEST #version 1.10 CACHE: index.html js/app.js js/clock.js js/data.js js/database.js js/desktop.js js/history.js js/taskbar.js js/timer.js js/file.js js/utils.js css/index.css images/appHolder1.png images/background.jpg images/clock.png images/close.gif images/computer.gif images/history.png images/network.gif images/recycleBin.gif images/startIcon.png images/taskBar.png images/vidioplayer.gif images/notebook.gif images/text.gif images/save.gif movs/movie.ogg sounds/WindowsLogonSound.wav

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CACHE MANIFEST
#version 1.10
CACHE:
index.html
js/app.js
js/clock.js
js/data.js
js/database.js
js/desktop.js
js/history.js
js/taskbar.js
js/timer.js
js/file.js
js/utils.js
css/index.css
images/appHolder1.png
images/background.jpg
images/clock.png
images/close.gif
images/computer.gif
images/history.png
images/network.gif
images/recycleBin.gif
images/startIcon.png
images/taskBar.png
images/vidioplayer.gif
images/notebook.gif
images/text.gif
images/save.gif
movs/movie.ogg
sounds/WindowsLogonSound.wav

在这之中,CACHE MANIFEST 标示本文件为缓存文件,#version 1.10 标示了本文件的版本。

CACHE 之后所列项支出的则是开辟人士自定义的剧情,个中满含了颇有在离线状态下客商访谈应用程序所不可缺少的文书。

缓存清单定义甘休后,在 index.html 中插入这一个清单文件名,那样,当浏览器加载那些页面包车型大巴时候,会自动缓存清单文件中所罗列的文件。

清单 20. 应用缓存清单

XHTML

<html manifest="index.manifest">

1
<html manifest="index.manifest">

值得说的是,若要辅助离线缓存,除客户端浏览器的支撑以外,服务端的援助也是要求的,就本系统所运用的 tomcat 来讲,供给在其安顿文件 web.xml 中增多清单 21 所示的条约。

清单 21. 劳动器端缓存配置

XHTML

<mime-mapping> <extension>manifest</extension> <mime-type>text/cache-manifest</mime-type> </mime-mapping>

1
2
3
4
<mime-mapping>
<extension>manifest</extension>
<mime-type>text/cache-manifest</mime-type>
</mime-mapping>

提及底,禁止使用本地机械的网络,重新展开浏览器并访问 Web 操作系统所在的网站,系统中的大多数应用程序如故得以健康事业,如图 11 所示。

图 11. 离线系统

必威 12结束语

本文介绍了 Web 操作系统的基本知识,并与价值观的操作系统举办了比较,进而介绍了 HTML5 这种新本事为 Web 操作系统开采带来的平价,并与思想的 web 前端开荒技能进行了相比,最终经过创设贰当中坚的 Web 操作系统详细的表现了 Web 操作系统的基本格局和效果以至辅助其运行的 web 前端开荒手艺是哪些达成其实效的。从本文的座谈中得以看来,基于 HTML5 的 Web 操作系统是前景的一大趋势,必将渐渐步入大家的常常生活工作中去。

赞 2 收藏 1 评论

必威 13

                                    }
                                }
                            }
                        }
                    };

JS仿iGoogle自定义首页模块拖拽特效的点子

 那篇作品首要介绍了JS仿i谷歌自定义首页模块拖拽特效的艺术,实例分析了页面包车型地铁布局及拖拽的贯彻技巧,特别富有实用价值,必要的爱人能够参照下

 

 

正文实例陈说了JS仿i谷歌(Google)自定义首页模块拖拽特效的主意。分享给我们供我们参谋。具体贯彻格局如下:

 

代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ";
<html xmlns="" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JS仿iGoogle自定义首页模块拖拽效果</title>
<script type="text/javascript">
var Common = {
getEvent: function() {//ie/ff
if (document.all) {
return window.event;
}
func = getEvent.caller;
while (func != null) {
var arg0 = func.arguments[0];
if (arg0) {
if ((arg0.constructor == Event || arg0.constructor == MouseEvent) || (typeof (arg0) == "object" && arg0.preventDefault && arg0.stopPropagation)) {
return arg0;
}
}
func = func.caller;
}
return null;
},
getMousePos: function(ev) {
if (!ev) {
ev = this.getEvent();
}
if (ev.pageX || ev.pageY) {
return {
x: ev.pageX,
y: ev.pageY
};
}

 

if (document.documentElement && document.documentElement.scrollTop) {
return {
x: ev.clientX + document.documentElement.scrollLeft - document.documentElement.clientLeft,
y: ev.clientY + document.documentElement.scrollTop - document.documentElement.clientTop
};
}
else if (document.body) {
return {
x: ev.clientX + document.body.scrollLeft - document.body.clientLeft,
y: ev.clientY + document.body.scrollTop - document.body.clientTop
};
}
},
getElementPos: function(el) {
el = this.getItself(el);
var _x = 0, _y = 0;
do {
_x += el.offsetLeft;
_y += el.offsetTop;
} while (el = el.offsetParent);
return { x: _x, y: _y };
},
getItself: function(id) {
return "string" == typeof id ? document.getElementById(id) : id;
},
getViewportSize: { w: (window.innerWidth) ? window.innerWidth : (document.documentElement && document.documentElement.clientWidth) ? document.documentElement.clientWidth : (document.body?document.body.offsetWidth:0), h: (window.innerHeight) ? window.innerHeight : (document.documentElement && document.documentElement.clientHeight) ? document.documentElement.clientHeight : (document.body ? document.body.offsetHeight : 0) },
isIE: document.all ? true : false,
setOuterHtml: function(obj, html) {
var Objrange = document.createRange();
obj.innerHTML = html;
Objrange.selectNodeContents(obj);
var frag = Objrange.extractContents();
obj.parentNode.insertBefore(frag, obj);
obj.parentNode.removeChild(obj);
},
firstChild: function(parentObj, tagName) {
if (Common.isIE) {
return parentObj.firstChild;
}
else {
var arr = parentObj.getElementsByTagName(tagName);
return arr[0];
}
},
lastChild: function(parentObj, tagName) {
if (Common.isIE) {
return parentObj.lastChild;
}
else {
var arr = parentObj.getElementsByTagName(tagName);
return arr[arr.length - 1];
}
},
setCookie: function(name, value) {
document.cookie = name + "=" + value;
},
getCookie: function(name) {
var strCookie = document.cookie;
var arrCookie = strCookie.split("; ");
for (var i = 0; i < arrCookie.length; i++) {
var arr = arrCookie[i].split("=");
if (!arr[1]) {
return "";
}
if (arr[0] == name) {
return arr[1];
}
}
return "";
},
delCookie: function(name) {
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval = this.getCookie(name);
if (cval != null) document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
}
}
var Class = {
create: function() {
return function() { this.init.apply(this, arguments); }
}
}
var Drag = Class.create();
Drag.prototype = {
init: function(titleBar, dragDiv, Options) {
//设置点击是还是不是透明,暗中同意透明百分之三十三
titleBar = Common.getItself(titleBar);
dragDiv = Common.getItself(dragDiv);
this.dragArea = { maxLeft: -9999, maxRight: 9999, maxTop: -9999, maxBottom: 9999 };
if (Options) {
this.opacity = Options.opacity ? (isNaN(parseInt(Options.opacity)) ? 100 : parseInt(Options.opacity)) : 100;
if (Options.area) {
if (Options.area.left && !isNaN(parseInt(Options.area.left))) { this.dragArea.maxLeft = Options.area.left };
if (Options.area.right && !isNaN(parseInt(Options.area.right))) { this.dragArea.maxRight = Options.area.right };
if (Options.area.top && !isNaN(parseInt(Options.area.top))) { this.dragArea.maxTop = Options.area.top };
if (Options.area.bottom && !isNaN(parseInt(Options.area.bottom))) { this.dragArea.maxBottom = Options.area.bottom };
}
}
else {
this.opacity = 60;
}
this.originDragDiv = null;
this.tmpX = 0;
this.tmpY = 0;
this.moveable = false;
this.dragArray = [];

var dragObj = this;
var dragTbl = document.getElementById("dragTable");

titleBar.onmousedown = function(e) {
var ev = e || window.event || Common.getEvent();
//只同意通过鼠标左键举行拖拽,IE鼠标左键为1 FireFox为0
if (Common.isIE && ev.button == 1 || !Common.isIE && ev.button == 0) {
}
else {
return false;
}

//管理特别情况:在最上/下边MOVE时不相见现存DIV的状态下,又赶回开首拖拽的列最上/下方
var tmpColId;
for (c = 0; c < dragTbl.rows[0].cells.length; c++) {
for (k = 0; k < dragTbl.rows[0].cells[c].getElementsByTagName("DIV").length; k++) {
if (dragDiv.id == dragTbl.rows[0].cells[c].getElementsByTagName("DIV")[k].id) {
tmpColId = c;
break;
}
}
}
var tmpPosFirstChild = Common.getElementPos(Common.firstChild(dragTbl.rows[0].cells[tmpColId], "DIV"));
var tmpPosLastChild = Common.getElementPos(Common.lastChild(dragTbl.rows[0].cells[tmpColId], "DIV"));
var tmpObj = { colId: tmpColId, firstChildUp: tmpPosFirstChild.y, lastChildDown: tmpPosLastChild.y + Common.lastChild(dragTbl.rows[0].cells[tmpColId], "DIV").offsetHeight };

//保存当前可拖拽各容器的所在地点
dragObj.dragArray = dragObj.RegDragsPos();

//插入虚线框
var dashedElement = document.createElement("div");
dashedElement.style.cssText = dragDiv.style.cssText;
dashedElement.style.border = " dashed 2px #aaa ";
dashedElement.style.marginBottom = "6px";
dashedElement.style.width = dragDiv.offsetWidth - 2 * parseInt(dashedElement.style.borderWidth) + "px"; //减去boderWidth使虚线框大小保持与dragDiv一致
dashedElement.style.height = dragDiv.offsetHeight - 2 * parseInt(dashedElement.style.borderWidth) + "px"; //加上px 保证FF正确
dashedElement.style.position = "relative";
if (dragDiv.nextSibling) {
dragDiv.parentNode.insertBefore(dashedElement, dragDiv.nextSibling);
}
else {
dragDiv.parentNode.appendChild(dashedElement);
}
//拖动时成为absolute
dragDiv.style.width = dragDiv.offsetWidth + "px";
dragDiv.style.position = "absolute";

dragObj.moveable = true;
dragDiv.style.zIndex = dragObj.GetZindex() + 1;

var downPos = Common.getMousePos(ev);
dragObj.tmpX = downPos.x - dragDiv.offsetLeft;
dragObj.tmpY = downPos.y - dragDiv.offsetTop;

if (Common.isIE) {
dragDiv.setCapture();
} else {
window.captureEvents(Event.mousemove);
}

dragObj.SetOpacity(dragDiv, dragObj.opacity);

//FireFox 去除容器内拖拽图片难点
if (ev.preventDefault) {
ev.preventDefault();
ev.stopPropagation();
}

document.onmousemove = function(e) {
if (dragObj.moveable) {
var ev = e || window.event || Common.getEvent();
//IE 去除容器内拖拽图片难点
if (document.all) //IE
{
ev.returnValue = false;
}

var movePos = Common.getMousePos(ev);
dragDiv.style.left = Math.max(Math.min(movePos.x - dragObj.tmpX, dragObj.dragArea.maxRight), dragObj.dragArea.maxLeft) + "px";
dragDiv.style.top = Math.max(Math.min(movePos.y - dragObj.tmpY, dragObj.dragArea.maxBottom), dragObj.dragArea.maxTop) + "px";

var targetDiv = null;
for (var k = 0; k < dragObj.dragArray.length; k++) {
if (dragDiv == dragObj.dragArray[i]) {
continue;
}

if (movePos.x > dragObj.dragArray[k].PosLeft && movePos.x < dragObj.dragArray[k].PosLeft + dragObj.dragArray[k].PosWidth
&& movePos.y > dragObj.dragArray[k].PosTop && movePos.y < dragObj.dragArray[k].PosTop + dragObj.dragArray[k].PosHeight
) {
targetDiv = document.getElementById(dragObj.dragArray[k].DragId);
if (movePos.y < dragObj.dragArray[k].PosTop + dragObj.dragArray[k].PosHeight / 2) {
//往上移
dashedElement.style.width = targetDiv.offsetWidth - 2 * parseInt(dashedElement.style.borderWidth) + "px";
targetDiv.parentNode.insertBefore(dashedElement, targetDiv);
}
else {
//往下移
dashedElement.style.width = targetDiv.offsetWidth - 2 * parseInt(dashedElement.style.borderWidth) + "px";
if (targetDiv.nextSibling) {
targetDiv.parentNode.insertBefore(dashedElement, targetDiv.nextSibling);
}
else {
targetDiv.parentNode.appendChild(dashedElement);
}
}
}
}

for (j = 0; j < dragTbl.rows[0].cells.length; j++) {
var startLeft = Common.getElementPos(dragTbl.rows[0].cells[j]).x;
if (movePos.x > startLeft && movePos.x < startLeft + dragTbl.rows[0].cells[j].offsetWidth) {
///列无DIV
if (dragTbl.rows[0].cells[j].getElementsByTagName("div").length == 0) {
dashedElement.style.width = dragTbl.rows[0].cells[j].offsetWidth - 2 * parseInt(dashedElement.style.borderWidth) + "px";
dragTbl.rows[0].cells[j].appendChild(dashedElement);
}
else {
var posFirstChild = Common.getElementPos(Common.firstChild(dragTbl.rows[0].cells[j], "DIV"));
var posLastChild = Common.getElementPos(Common.lastChild(dragTbl.rows[0].cells[j], "DIV"));
//处理特别情状:在最上/下边MOVE时不遇到现成DIV的情状下,又重临最初拖拽的列最上/下方
var tmpUp, tmpDown;
if (tmpObj.colId == j) {
tmpUp = tmpObj.firstChildUp;
tmpDown = tmpObj.lastChildDown;
}
else {
tmpUp = posFirstChild.y;
tmpDown = posLastChild.y + Common.lastChild(dragTbl.rows[0].cells[j], "DIV").offsetHeight;
}

if (movePos.y < tmpUp) {///从最上边插入虚线框
dashedElement.style.width = Common.firstChild(dragTbl.rows[0].cells[j], "DIV").offsetWidth - 2 * parseInt(dashedElement.style.borderWidth) + "px";
dragTbl.rows[0].cells[j].insertBefore(dashedElement, Common.firstChild(dragTbl.rows[0].cells[j], "DIV"));
}
else if (movePos.y > tmpDown) {///从最下边插入虚线框
dashedElement.style.width = Common.lastChild(dragTbl.rows[0].cells[j], "DIV").offsetWidth - 2 * parseInt(dashedElement.style.borderWidth) + "px";
dragTbl.rows[0].cells[j].appendChild(dashedElement);
}

}
}
}
}
};

document.onmouseup = function() {
if (dragObj.moveable) {
if (Common.isIE) {
dragDiv.releaseCapture();
}
else {
window.releaseEvents(dragDiv.mousemove);
}
dragObj.SetOpacity(dragDiv, 100);
dragObj.moveable = false;
dragObj.tmpX = 0;
dragObj.tmpY = 0;

//必得写在这里IF内
dragDiv.style.left = "";
dragDiv.style.top = "";

dragDiv.style.width = "";
dragDiv.style.position = "";
dashedElement.parentNode.insertBefore(dragDiv, dashedElement);
dashedElement.parentNode.removeChild(dashedElement);
}

};

}
},
SetOpacity: function(dragDiv, n) {
if (Common.isIE) {
dragDiv.filters.alpha.opacity = n;
}
else {
dragDiv.style.opacity = n / 100;
}

},
GetZindex: function() {
var maxZindex = 0;
var divs = document.getElementsByTagName("div");
for (z = 0; z < divs.length; z++) {
maxZindex = Math.max(maxZindex, divs[z].style.zIndex);
}
return maxZindex;
},
RegDragsPos: function() {
var arrDragDivs = new Array();
var dragTbl = document.getElementById("dragTable");
var tmpDiv, tmpPos;
for (i = 0; i < dragTbl.getElementsByTagName("div").length; i++) {
tmpDiv = dragTbl.getElementsByTagName("div")[i];
if (tmpDiv.className == "dragDiv") {
tmpPos = Common.getElementPos(tmpDiv);
arrDragDivs.push({ DragId: tmpDiv.id, PosLeft: tmpPos.x, PosTop: tmpPos.y, PosWidth: tmpDiv.offsetWidth, PosHeight: tmpDiv.offsetHeight });
}
}
return arrDragDivs;
}
}

window.onload = function() {
var dragTbl = document.getElementById("dragTable");
if (Common.getCookie("configArr")) {
var configArr = eval("(" + Common.getCookie("configArr") + ")");
for (i = 0; i < dragTbl.rows[0].cells.length; i++) {
for (j = 0; j < configArr[i].length; j++) {
dragTbl.rows[0].cells[i].appendChild(document.getElementById(configArr[i][j]));
}
}
}
new Drag("titleBar1", "dragDiv1");
new Drag("titleBar2", "dragDiv2");
new Drag("titleBar3", "dragDiv3");
new Drag("titleBar4", "dragDiv4");
new Drag("titleBar5", "dragDiv5");
}

window.onunload = function() {
var dragTbl = document.getElementById("dragTable");
var configArr = "";
for (i = 0; i < dragTbl.rows[0].cells.length; i++) {
var tmpStr = "";
for (j = 0; j < dragTbl.rows[0].cells[i].getElementsByTagName("DIV").length; j++) {
tmpStr += (tmpStr == "" ? "" : ",") + "'" + dragTbl.rows[0].cells[i].getElementsByTagName("DIV")[j].id + "'";
}
configArr += (configArr == "" ? "" : ",") + "[" + tmpStr + "]";
}
//format like: [['dragDiv3','dragDiv5'],['dragDiv4','dragDiv1'],['dragDiv2']]
Common.setCookie("configArr", "[" + configArr + "]");
}
</script>
<style type="text/css">
.spanDiv{
position:relative;
width:5px;
height:5px;
}

.dragDiv,.nodragDiv{
position:relative;
filter:alpha(opacity=100);
opacity:1;
margin-bottom:6px;
background-color:#FFFFFF;
}
</style>
</head>
<body >
<script type="text/javascript">

</script>
<table id="dragTable" cellpadding="3" style=" border:solid 0px green;width:98%;">
<tr>
<td valign="top" style="width:30%">
<div class="dragDiv" id="dragDiv1" >
<table cellpadding="0" cellspacing="0" border="1" style="width:100%;border-collapse:collapse; border-color:Blue">
<tr id="titleBar1" style="height:22px; text-align:left; background-color:#547BC9;color:White; padding:3px;cursor:move;">
<th align="left" unselectable="on" >Title1</th>
</tr>
<tr style="height:130px;padding:3px;" align="left" valign="top" >
<td unselectable="on">这里的字比较长....小编来了....中国....中夏族民共和国...海外.,看一下有未有溢出></td>
</tr>
</table>
</div>
<div class="dragDiv" id="dragDiv2">
<table cellpadding="0" cellspacing="0" border="1" style="width:100%;border-collapse:collapse; border-color:Blue">
<tr id="titleBar2" style="height:22px; text-align:left; background-color:#547BC9;color:White; padding:3px;cursor:move;">
<th align="left" unselectable="on" >Title2</th>
</tr>
<tr style="height:130px;padding:3px;" align="left" valign="top" >
<td unselectable="on">Content2...</td>
</tr>
</table>
</div>
</td>
<td valign="top" style="width:50%">
<div class="dragDiv" id="dragDiv3">
<table cellpadding="0" cellspacing="0" border="1" style="width:100%;border-collapse:collapse; border-color:Blue">
<tr id="titleBar3" style="height:22px; text-align:left; background-color:#547BC9;color:White; padding:3px;cursor:move;">
<th align="left" unselectable="on" >Title3</th>
</tr>
<tr style="height:230px;padding:3px;" align="left" valign="top" >
<td unselectable="on">Content3...</td>
</tr>
</table>
</div>
</td>
<td valign="top" style="width:20%">
<div class="dragDiv" id="dragDiv4">
<table cellpadding="0" cellspacing="0" border="1" style="width:100%;border-collapse:collapse; border-color:Blue">
<tr id="titleBar4" style="height:22px; text-align:left; background-color:#547BC9;color:White; padding:3px;cursor:move;">
<th align="left" unselectable="on" >Title4</th>
</tr>
<tr style="height:130px;padding:3px;" align="left" valign="top" >
<td unselectable="on">Content4...</td>
</tr>
</table>
</div>
<div class="dragDiv" id="dragDiv5">
<table cellpadding="0" cellspacing="0" border="1" style="width:100%;border-collapse:collapse; border-color:Blue">
<tr id="titleBar5" style="height:22px; text-align:left; background-color:#547BC9;color:White; padding:3px;cursor:move;">
<th align="left" unselectable="on" >Title5</th>
</tr>
<tr style="height:130px;padding:3px;" align="left" valign="top" >
<td unselectable="on">Content5...</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</body>
</html>

<br><br><hr> 收罗于互连网,只为兴趣与学习沟通,不作商业用途。</font></p>

 

愿意本文所述对大家的javascript程序设计有着扶植。

那篇作品首要介绍了JS仿i谷歌自定义首页模块拖拽特效的艺术,实例解析了页面包车型地铁布局及拖拽的实...

【简单的留言本】用HTML新扩大的数据库实现,留言本新扩充

 使用数据库达成的WEB留言本

   

        var datatable = null;

        var db = openDatabase('Mydata','','My Database',102400);

        function  init() {

            datatable = document.getElementById("datatable");

            showAllData();

        }

        function removeAllData() {

            for(var i = datatable.childNodes.length-1;i>=0;i--){

                datatable.removeChild(datatable.childNodes[i]);

            }

            var tr = document.createElement('tr');

            var th1 = document.createElement('th');

            var th2 = document.createElement('th');

            var th3 = document.createElement('th');

            th1.innerHTML = "姓名";

            th2.innerHTML = "留言";

            th3.innerHTML = "时间";

            tr.appendChild(th1);

            tr.appendChild(th2);

            tr.appendChild(th3);

            datatable.appendChild(tr);

        }

        function showData(row) {

            var tr = document.createElement('tr');

            var td1 = document.createElement('td');

            td1.innerHTML = row.name;

            var td2 = document.createElement('td');

            td2.innerHTML= row.message;

            var td3 = document.createElement('td');

            var t = new Date();

            t.setTime(row.time);

            td3.innerHTML = t.toLocaleDateString()+""+t.toLocaleTimeString();

            tr.appendChild(td1);

            tr.appendChild(td2);

            tr.appendChild(td3);

            datatable.appendChild(tr);

        }

        function showAllData() {

            db.transaction(function (tx) {

                tx.executeSql('CREATE TABLE IF NOT EXISTS MsgData(name TEXT,message TEXT,time INTEGER)',[]);

                tx.executeSql('SELECT * FROM MsgData',[],function (tx,rs) {

                    removeAllData();

                    for(var i =0 ;i<rs.rows.length ;i ++){

                        showData(rs.rows.item(i));

                    }

                });

            });

        }

        

        function addData(name,message,time) {

            db.transaction(function (tx) {

                tx.executeSql('INSERT INTO MsgData VALUES(?,?,?)',[name,message,time],function (tx,rs) {

                    alert("成功保存数据!");

                },function (tx,rs) {

                    alert(error.source+"::" + error.message);

                });

            });

        }

        function saveData() {

            var name = document.getElementById('name').value;

            var memo = document.getElementById('memo').value;

            var time = new Date().getTime();

            //alert(time);

            addData(name,memo,time);

            showAllData();

        }

   

 

 

   

采纳数据库完成的Web留言本

   

 

       

 

           

姓名:

           

 

               

                   

               

           

       

       

 

           

留言:

           

 

               

                   

               

           

       

       

 

           

 

           

 

               

           必威 14

       

   

   

 

   

 

使用数据库达成的WEB留言本 var datatable = null; var db = openDatabase('Mydata','','My Database'...

                    //插入虚线框
                    var dashedElement = document.createElement("div");
                    dashedElement.style.cssText = dragDiv.style.cssText;
                    dashedElement.style.border = " dashed 2px #aaa ";
                    dashedElement.style.marginBottom = "6px";
                    dashedElement.style.width = dragDiv.offsetWidth - 2 * parseInt(dashedElement.style.borderWidth) + "px"; //减去boderWidth使虚线框大小保持与dragDiv一致
         dashedElement.style.height = dragDiv.offsetHeight - 2 * parseInt(dashedElement.style.borderWidth) + "px"; //加上px 保证FF正确                   
          dashedElement.style.position = "relative";
                    if (dragDiv.nextSibling) {
                        dragDiv.parentNode.insertBefore(dashedElement, dragDiv.nextSibling);
                    }
                    else {
                        dragDiv.parentNode.appendChild(dashedElement);
                    }
                    //拖动时成为absolute
                    dragDiv.style.width = dragDiv.offsetWidth + "px";
                    dragDiv.style.position = "absolute";

连带小说

连锁搜索:

明日看吗

找寻本领库

重回首页

  • iphone自定义怎么修改网络标记字符
  • 索爱Xshot通话背景设置格局
  • C#Winform使用增添方法自定义富文本框(RichTex
  • 贰个静态UITabelView的施工方案----CTStaticTableV
  • 快快驾驭Android多个常用自定义控件Toast Aler
  • Android动铁耳机线控详解,蓝牙( Bluetooth® )耳麦开关监听(仿

有关频道: HTML/CSS  HTML5  Javascript  jQuery  AJax教程  后边多少个代码  正则表明式  Flex教程  WEB前端教程  

                            var movePos = Common.getMousePos(ev);
                            dragDiv.style.left = Math.max(Math.min(movePos.x - dragObj.tmpX, dragObj.dragArea.maxRight), dragObj.dragArea.maxLeft) + "px";
                            dragDiv.style.top = Math.max(Math.min(movePos.y - dragObj.tmpY, dragObj.dragArea.maxBottom), dragObj.dragArea.maxTop) + "px";

帮客讨论

                    //处理非常情形:在最上/上边MOVE时不遇到现成DIV的动静下,又回到初始拖拽的列最上/下方
                    var tmpColId;
                    for (c = 0; c < dragTbl.rows[0].cells.length; c++) {
                        for (k = 0; k < dragTbl.rows[0].cells[c].getElementsByTagName("DIV").length; k++) {
                            if (dragDiv.id == dragTbl.rows[0].cells[c].getElementsByTagName("DIV")[k].id) {
                                tmpColId = c;
                                break;
                            }
                        }
                    }
                    var tmpPosFirstChild = Common.getElementPos(Common.firstChild(dragTbl.rows[0].cells[tmpColId], "DIV"));
                    var tmpPosLastChild = Common.getElementPos(Common.lastChild(dragTbl.rows[0].cells[tmpColId], "DIV"));
                    var tmpObj = { colId: tmpColId, firstChildUp: tmpPosFirstChild.y, lastChildDown: tmpPosLastChild.y + Common.lastChild(dragTbl.rows[0].cells[tmpColId], "DIV").offsetHeight };

复制代码 代码如下:

                                        if (movePos.y < tmpUp) {///从最上边插入虚线框
                                            dashedElement.style.width = Common.firstChild(dragTbl.rows[0].cells[j], "DIV").offsetWidth - 2 * parseInt(dashedElement.style.borderWidth) + "px";
                                            dragTbl.rows[0].cells[j].insertBefore(dashedElement, Common.firstChild(dragTbl.rows[0].cells[j], "DIV"));
                                        }
                                        else if (movePos.y > tmpDown) {///从最上边插入虚线框
                                            dashedElement.style.width = Common.lastChild(dragTbl.rows[0].cells[j], "DIV").offsetWidth - 2 * parseInt(dashedElement.style.borderWidth) + "px";
                                            dragTbl.rows[0].cells[j].appendChild(dashedElement);
                                        }

</script>  
    <table id="dragTable" cellpadding="3"  style=" border:solid 0px green;width:98%;">
        <tr>
            <td valign="top" style="width:30%">
                <div class="dragDiv" id="dragDiv1" >
                    <table cellpadding="0" cellspacing="0" border="1" style="width:100%;border-collapse:collapse; border-color:Blue">
                        <tr id="titleBar1"  style="height:22px; text-align:left; background-color:#547BC9;color:White; padding:3px;cursor:move;">
                            <th align="left" unselectable="on" >Title1</th>
                        </tr>
                        <tr style="height:130px;padding:3px;" align="left" valign="top" >
                            <td unselectable="on">这里的字相比较长....作者来了....中华夏族民共和国....中国...海外.,看一下有未有溢出></td>
                        </tr>
                    </table>
                </div>              
                <div class="dragDiv" id="dragDiv2">
                    <table cellpadding="0" cellspacing="0" border="1" style="width:100%;border-collapse:collapse; border-color:Blue">
                        <tr id="titleBar2" style="height:22px; text-align:left; background-color:#547BC9;color:White; padding:3px;cursor:move;">
                            <th align="left" unselectable="on" >Title2</th>
                        </tr>
                        <tr style="height:130px;padding:3px;" align="left" valign="top" >
                            <td unselectable="on">Content2...</td>
                        </tr>
                    </table>
                </div>
            </td>
            <td valign="top" style="width:50%">
                <div class="dragDiv" id="dragDiv3">
                    <table cellpadding="0" cellspacing="0" border="1" style="width:100%;border-collapse:collapse; border-color:Blue">
                        <tr id="titleBar3" style="height:22px; text-align:left; background-color:#547BC9;color:White; padding:3px;cursor:move;">
                            <th align="left" unselectable="on" >Title3</th>
                        </tr>
                        <tr style="height:230px;padding:3px;" align="left" valign="top" >
                            <td unselectable="on">Content3...</td>
                        </tr>
                    </table>
                </div>               
            </td>
            <td valign="top" style="width:20%">
                <div class="dragDiv" id="dragDiv4">
                    <table cellpadding="0" cellspacing="0" border="1" style="width:100%;border-collapse:collapse; border-color:Blue">
                        <tr id="titleBar4" style="height:22px; text-align:left; background-color:#547BC9;color:White; padding:3px;cursor:move;">
                            <th align="left" unselectable="on" >Title4</th>
                        </tr>
                        <tr style="height:130px;padding:3px;" align="left" valign="top" >
                            <td unselectable="on">Content4...</td>
                        </tr>
                    </table>
                </div>
                <div class="dragDiv" id="dragDiv5">
                    <table cellpadding="0" cellspacing="0" border="1" style="width:100%;border-collapse:collapse; border-color:Blue">
                        <tr id="titleBar5" style="height:22px; text-align:left; background-color:#547BC9;color:White; padding:3px;cursor:move;">
                            <th align="left" unselectable="on" >Title5</th>
                        </tr>
                        <tr style="height:130px;padding:3px;" align="left" valign="top" >
                            <td unselectable="on">Content5...</td>
                        </tr>
                    </table>
                </div>
            </td>
        </tr>   
    </table>
</body>
</html>

        window.onunload = function() {
            var dragTbl = document.getElementById("dragTable");
            var configArr = "";
            for (i = 0; i < dragTbl.rows[0].cells.length; i++) {
                var tmpStr = "";
                for (j = 0; j < dragTbl.rows[0].cells[i].getElementsByTagName("DIV").length; j++) {
                    tmpStr += (tmpStr == "" ? "" : ",") + "'" + dragTbl.rows[0].cells[i].getElementsByTagName("DIV")[j].id + "'";
                }
                configArr += (configArr == "" ? "" : ",") + "[" + tmpStr + "]";
            }
            //format like: [['dragDiv3','dragDiv5'],['dragDiv4','dragDiv1'],['dragDiv2']]
            Common.setCookie("configArr", "[" + configArr + "]");           
        }
    </script>
    <style type="text/css">
    .spanDiv{
    position:relative;
    width:5px;
    height:5px;
    }

可望本文所述对大家的javascript程序设计有所扶助。

TAG标签:
版权声明:本文由必威发布于必威-前端,转载请注明出处:使用数据库实现的Web留言本必威,操作系统提供