dtree 网页树状菜单及传递对象集合到js内,动态生成节点


Posted in Javascript onApril 14, 2012

在winform端,树状菜单是非常有用的,实现这个是非常便捷的,所以我想到在页面放入一个树状菜单的。我选择了dtree这个工具,网络上还有很多方法实现页面树状菜单的,不过我觉得这个比较好用的,而且配置比较简单,运用上上手很快。dtree是纯js的,所以不用导入jar包,并且配置只要在js内配置就好了。而且现在网络上有很多高手修改后的改良版,加了checkbox,更加方便。在开发过程中,最难的就是数据的交互的,因为dtree是纯js的,所以不存在和后台交互的方法,我的办法是先通过后台交互,将数据传递到页面,然后再传递到js内。后台传递到页面的数据我拼接成一个字符串,然后在js内切割,将数据整合成数组。
后台数据处理代码:

Codepublic String GetLinkManByDID(){ 
try { 
directories = this.directoryService.GetAllDirecoty(); 
selectlinkMans = this.linkManService.GetAllLinkMans(); 
String direStringstring = ""; 
String linkString = ""; 
for (int i = 0; i < directories.size(); i++) { 
if (i<directories.size()-1) { 
direStringstring+=directories.get(i).getID()+"-"+directories.get(i).getDirectoryName()+"+"; 
} 
else { 
direStringstring+=directories.get(i).getID()+"-"+directories.get(i).getDirectoryName(); 
} 
} 
for (int i = 0; i < selectlinkMans.size(); i++) { 
if (i<selectlinkMans.size()-1) { 
linkString+=selectlinkMans.get(i).getDirectory().getID()+"-"+selectlinkMans.get(i).getName()+"-"+selectlinkMans.get(i).getPhoneNum()+"+"; 
} 
else { 
linkString+=selectlinkMans.get(i).getDirectory().getID()+"-"+selectlinkMans.get(i).getName()+"-"+selectlinkMans.get(i).getPhoneNum(); 
} 
} 
ActionContext.getContext().getSession().put("directories", direStringstring); 
ActionContext.getContext().getSession().put("allLinkMans", linkString); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
return SUCCESS; 
}

我是用s2sh款家的,所以数据存放到session中方式是
ActionContext.getContext().getSession().put(key, value)
然后页面得到数据:
<script type="text/javascript"> 
var linkmans= []; 
var dires = []; 
//linkmans = "${directories}".replace('[','').replace(']','').split(','); 
linkmans="${allLinkMans}".split(','); 
dires = "${directories}".split(','); 
treeload(linkmans[0],dires[0]); 
</script>

treeload 是我自己编写的一个js文件内的方法。
js:
Codefunction treeload(linkmans , dires){ 
var linklist= String2linklist(linkmans); 
var direslist = String2direlist(dires); 
d = new dTree('d','./'); 
d.config.checkbox=true;//显示checkbox 
d.config.objValueId='phoneNums'; 
d.icon.root='images/hr/home.png', 
d.icon.folder='images/hr/group.gif', 
d.icon.folderOpen='images/hr/group.gif', 
d.icon.node='images/hr/nan.gif', 
d.add(0,-1,'联系人',null); 
var int = 0; 
var direids = new Array(); 
var direpid= new Array(); 
for ( int; int < direslist.length; int++) { 
d.add(int+1,0,direslist[int].name,false); 
direids.push(direslist[int].id); 
direpid.push(int+1); 
} 
d.add(int+1,0,'全部联系人',false); 
direpid.push(int+1); 
for ( var int2 = 0; int2 < linklist.length; int2++) { 
for ( var int3 = 0; int3 < direpid.length-1; int3++) { 
if(linklist[int2].did==direids[int3]) 
{ 
int++; 
d.add(int+1,direpid[int3],linklist[int2].name,false,linklist[int2].phone); 
} 
} 
} 
for ( var int4 = 0; int4 < linklist.length; int4++) { 
int++; 
d.add(int+1,direpid[direpid.length-1],linklist[int4].name,false,linklist[int4].phone); 
} document.write(d); 
} 
function String2linklist(linkmans){ 
var linkarray = new Array(); 
var a = linkmans.split('+'); 
// alert(a[0]); 
for ( var int = 0; int < a.length; int++) { 
var b = a[int].split('-'); 
// alert(b[2]); 
linkarray.push(new linkman(b[0],b[1],b[2])); 
} 
return linkarray; 
} 
function String2direlist(dires){ 
var direlist = new Array(); 
var a = dires.split('+'); 
for ( var int = 0; int < a.length; int++) { 
var b = a[int].split('-'); 
// alert(b[1]); 
direlist.push(new dire(b[0],b[1])); 
} 
return direlist; 
} 
function linkman(Did,name,phone){ 
this.did = Did; 
this.name = name ; 
this.phone=phone; 
} 
function dire(id ,name){ 
this.id= id; 
this.name = name; 
}

最后,效果图

dtree 网页树状菜单及传递对象集合到js内,动态生成节点                               dtree 网页树状菜单及传递对象集合到js内,动态生成节点

我改写的dtree 的js:
// Node object 
function Node(id, pid, name, checked, value, icon ,url, title, target, iconOpen, open) { 
this.id = id; 
this.pid = pid; 
this.name = name; 
//是否在该节点添加复选框并设置选中状态,true:选中,false:不选中,null:不添加 
this.checked = checked==null?null:(checked || false); this.value = value;//增加value属性,选中复选框,输入框内得到的就是这个value值 
this.url = url; 
this.title = title; 
this.target = target; 
this.icon = icon; 
this.iconOpen = iconOpen; 
this._io = open || false; 
this._is = false; 
this._ls = false; 
this._hc = false; 
this._ai = 0; 
this._p; 
}; 
// Tree object 
function dTree(objName, path) { 
//路径 
this.path = path ||''; 
//加载css文件 
this.loadCssFile(this.path+'dtree.css'); 
this.config = { 
target : null, 
folderLinks : true, 
useSelection : true, 
useCookies : true, 
useLines : true, 
useIcons : true, 
useStatusText : false, 
closeSameLevel : false, 
inOrder : false, 
//是否显示复选框,true显示,false不显示 
checkbox:false, 
objValueId:'' 
} 
this.icon = { 
root : this.path + 'images/img/base.gif', 
folder : this.path + 'images/img/folder.gif', 
folderOpen : this.path + 'images/img/folderopen.gif', 
node : this.path + 'images/img/page.gif', 
empty : this.path + 'images/img/empty.gif', 
line : this.path + 'images/img/line.gif', 
join : this.path + 'images/img/join.gif', 
joinBottom : this.path + 'images/img/joinbottom.gif', 
plus : this.path + 'images/img/plus.gif', 
plusBottom : this.path + 'images/img/plusbottom.gif', 
minus : this.path + 'images/img/minus.gif', 
minusBottom : this.path + 'images/img/minusbottom.gif', 
nlPlus : this.path + 'images/img/nolines_plus.gif', 
nlMinus : this.path + 'images/img/nolines_minus.gif' 
}; 
this.obj = objName; 
this.aNodes = []; 
this.aIndent = []; 
this.root = new Node(-1); 
this.selectedNode = null; 
this.selectedFound = false; 
this.completed = false; 
}; 
//设置选中节点 
dTree.prototype.checkedNodes=function(){ 
if(this.config.objValueId==''){ 
return; 
} 
var val=document.getElementById(this.config.objValueId).value; 
if(val==''){ 
return; 
} 
val=val.split(','); 
var o=null; 
for(var i=0;i<val.length;i++){ 
o=document.getElementById('cbx_'+this.obj+val[i]); 
if(o){ 
o.checked=true; 
} 
} 
}; 
//实现输入框内自动输入选中项的value值 
dTree.prototype.update=function(){ 
if(this.config.objValueId==''){ 
return; 
} 
var cbx=null,v=[]; 
// v.push(aa); 
var ns=this.aNodes; 
for(var i=0;i<ns.length;i++){ 
cbx=document.getElementById('cbx_'+this.obj+ns[i].id); 
if(cbx){ 
if(cbx.checked){ 
if(ns[i].pid!='0'){ 
v.push(cbx.value);//原先是得到节点的id的,换成value,可以实现选中联系人,得到号码。 
} 
} 
} 
} 
document.getElementById(this.config.objValueId).value=v.join(); 
}; 
//加载css文件 
dTree.prototype.loadCssFile=function (file) { 
try{ 
var head=document.getElementsByTagName("head")[0]; 
var links=head.getElementsByTagName('link'); 
var i=0; 
for(var i=0;i<links.length;i++){ 
if(links[i].getAttribute('href').toLowerCase().indexOf(file.toLowerCase())>-1){ 
return; 
} 
} 
var f = document.createElement("link"); 
f.setAttribute("rel", "stylesheet"); 
f.setAttribute("type", "text/css"); 
f.setAttribute("href", file); 
head.appendChild(f); 
}catch(ex){ 
alert('加载css文件出错:'+ex.message); 
} 
}; 
// Adds a new node to the node array 
dTree.prototype.add = function(id, pid, name, checked, value,icon,url, title, target,iconOpen, open) { 
this.aNodes[this.aNodes.length] = new Node(id, pid, name, checked, value,icon,url, title, target, iconOpen, open); 
}; 
// Open/close all nodes 
dTree.prototype.openAll = function() { 
this.oAll(true); 
}; 
dTree.prototype.closeAll = function() { 
this.oAll(false); 
}; 
// Outputs the tree to the page 
dTree.prototype.toString = function() { 
var str = '<div class="dtree" id="dTree_'+this.obj+'">\n'; 
if (document.getElementById) { 
if (this.config.useCookies) this.selectedNode = this.getSelected(); 
str += this.addNode(this.root); 
} else str += 'Browser not supported.'; 
str += '</div>'; 
if (!this.selectedFound) this.selectedNode = null; 
this.completed = true; 
return str; 
}; 
// Creates the tree structure 
dTree.prototype.addNode = function(pNode) { 
var str = ''; 
var n=0; 
if (this.config.inOrder) n = pNode._ai; 
for (n; n<this.aNodes.length; n++) { 
if (this.aNodes[n].pid == pNode.id) { 
var cn = this.aNodes[n]; 
cn._p = pNode; 
cn._ai = n; 
this.setCS(cn); 
if (!cn.target && this.config.target) cn.target = this.config.target; 
if (cn._hc && !cn._io && this.config.useCookies) cn._io = this.isOpen(cn.id); 
if (!this.config.folderLinks && cn._hc) cn.url = null; 
if (this.config.useSelection && cn.id == this.selectedNode && !this.selectedFound) { 
cn._is = true; 
this.selectedNode = n; 
this.selectedFound = true; 
} 
str += this.node(cn, n); 
if (cn._ls) break; 
} 
} 
return str; 
}; 
// Creates the node icon, url and text 
dTree.prototype.node = function(node, nodeId) { 
var str = '<div class="dTreeNode">' + this.indent(node, nodeId); 
if (this.config.useIcons) { 
if (!node.icon) node.icon = (this.root.id == node.pid) ? this.icon.root : ((node.pid==0) ? this.icon.folder : this.icon.node); 
//node.pid==0 这个条件是我自己改的,如果群组内无人的话,还是用群组的icon,而不是联系人的icon,大家可以自己试试的 
if (!node.iconOpen) node.iconOpen = (node._hc) ? this.icon.folderOpen : this.icon.node; 
if (this.root.id == node.pid) { 
node.icon = this.icon.root; 
node.iconOpen = this.icon.root; 
} 
str += '<img id="i' + this.obj + nodeId + '" src="' + ((node._io) ? node.iconOpen : node.icon) + '" alt="" />'; 
} 
/***添加checkbox显示***/ 
if(this.config.checkbox&&node.checked!=null){ 
str += '<input '+ (node.checked?'checked=\"checked\"':'') +' onclick=\"javascript: ' + this.obj + (node._hc &&node.pid != this.root.id?'.o(' + nodeId + ')':'.update()')+';\" type=\"checkbox\" value=\"'+node.value+'\" name=\"cbx_'+this.obj+'\" id=\"cbx_'+ this.obj + nodeId+'\" title=\"'+node.name+'\"\/>'; 
} 
if (node.url) { 
str += '<a id="s' + this.obj + nodeId + '" class="' + ((this.config.useSelection) ? ((node._is ? 'nodeSel' : 'node')) : 'node') + '" href="' + node.url + '"'; 
if (node.title) str += ' title="' + node.title + '"'; 
if (node.target) str += ' target="' + node.target + '"'; 
if (this.config.useStatusText) str += ' onmouseover="window.status=\'' + node.name + '\';return true;" onmouseout="window.status=\'\';return true;" '; 
if (this.config.useSelection && ((node._hc && this.config.folderLinks) || !node._hc)) 
str += ' onclick="javascript: ' + this.obj + '.s(' + nodeId + ');"'; 
str += '>'; 
} 
else if ((!this.config.folderLinks || !node.url) && node._hc && node.pid != this.root.id) 
str += '<a href="javascript: ' + this.obj + '.o(' + nodeId + ');" class="node">'; 
str += node.name; 
if (node.url || ((!this.config.folderLinks || !node.url) && node._hc)) str += '</a>'; 
str += '</div>'; 
if (node._hc) { 
str += '<div id="d' + this.obj + nodeId + '" class="clip" style="display:' + ((this.root.id == node.pid || node._io) ? 'block' : 'none') + ';">'; 
str += this.addNode(node); 
str += '</div>'; 
} 
this.aIndent.pop(); 
return str; 
}; 
// Adds the empty and line icons 
dTree.prototype.indent = function(node, nodeId) { 
var str = ''; 
if (this.root.id != node.pid) { 
for (var n=0; n<this.aIndent.length; n++) 
str += '<img src="' + ( (this.aIndent[n] == 1 && this.config.useLines) ? this.icon.line : this.icon.empty ) + '" alt="" />'; 
(node._ls) ? this.aIndent.push(0) : this.aIndent.push(1); 
if (node._hc) { 
str += '<a href="javascript: ' + this.obj + '.o(' + nodeId + ');"><img id="j' + this.obj + nodeId + '" src="'; 
if (!this.config.useLines) str += (node._io) ? this.icon.nlMinus : this.icon.nlPlus; 
else str += ( (node._io) ? ((node._ls && this.config.useLines) ? this.icon.minusBottom : this.icon.minus) : ((node._ls && this.config.useLines) ? this.icon.plusBottom : this.icon.plus ) ); 
str += '" alt="" /></a>'; 
} else str += '<img src="' + ( (this.config.useLines) ? ((node._ls) ? this.icon.joinBottom : this.icon.join ) : this.icon.empty) + '" alt="" />'; 
} 
return str; 
}; 
// Checks if a node has any children and if it is the last sibling 
dTree.prototype.setCS = function(node) { 
var lastId; 
for (var n=0; n<this.aNodes.length; n++) { 
if (this.aNodes[n].pid == node.id) node._hc = true; 
if (this.aNodes[n].pid == node.pid) lastId = this.aNodes[n].id; 
} 
if (lastId==node.id) node._ls = true; 
}; 
// Returns the selected node 
dTree.prototype.getSelected = function() { 
var sn = this.getCookie('cs' + this.obj); 
return (sn) ? sn : null; 
}; 
// Highlights the selected node 
dTree.prototype.s = function(id) { 
if (!this.config.useSelection) return; 
var cn = this.aNodes[id]; 
if (cn._hc && !this.config.folderLinks) return; 
if (this.selectedNode != id) { 
if (this.selectedNode || this.selectedNode==0) { 
eOld = document.getElementById("s" + this.obj + this.selectedNode); 
eOld.className = "node"; 
} 
eNew = document.getElementById("s" + this.obj + id); 
eNew.className = "nodeSel"; 
this.selectedNode = id; 
if (this.config.useCookies) this.setCookie('cs' + this.obj, cn.id); 
} 
}; 
// Toggle Open or close 
dTree.prototype.o = function(id) { 
var cn = this.aNodes[id]; 
this.nodeStatus(!cn._io, id, cn._ls); 
cn._io = !cn._io; 
if (this.config.closeSameLevel) this.closeLevel(cn); 
if (this.config.useCookies) this.updateCookie(); 
//更新选中值if(this.config.objValueId!='') 
this.update(); 
}; 
// Open or close all nodes 
dTree.prototype.oAll = function(status) { 
for (var n=0; n<this.aNodes.length; n++) { 
if (this.aNodes[n]._hc && this.aNodes[n].pid != this.root.id) { 
this.nodeStatus(status, n, this.aNodes[n]._ls) 
this.aNodes[n]._io = status; 
} 
} 
if (this.config.useCookies) this.updateCookie(); 
}; 
// Opens the tree to a specific node 
dTree.prototype.openTo = function(nId, bSelect, bFirst) { 
if (!bFirst) { 
for (var n=0; n<this.aNodes.length; n++) { 
if (this.aNodes[n].id == nId) { 
nId=n; 
break; 
} 
} 
} 
var cn=this.aNodes[nId]; 
if (cn.pid==this.root.id || !cn._p) return; 
cn._io = true; 
cn._is = bSelect; 
if (this.completed && cn._hc) this.nodeStatus(true, cn._ai, cn._ls); 
if (this.completed && bSelect) this.s(cn._ai); 
else if (bSelect) this._sn=cn._ai; 
this.openTo(cn._p._ai, false, true); 
}; 
// Closes all nodes on the same level as certain node 
dTree.prototype.closeLevel = function(node) { 
for (var n=0; n<this.aNodes.length; n++) { 
if (this.aNodes[n].pid == node.pid && this.aNodes[n].id != node.id && this.aNodes[n]._hc) { 
this.nodeStatus(false, n, this.aNodes[n]._ls); 
this.aNodes[n]._io = false; 
this.closeAllChildren(this.aNodes[n]); 
} 
} 
} 
// Closes all children of a node 
dTree.prototype.closeAllChildren = function(node) { 
for (var n=0; n<this.aNodes.length; n++) { 
if (this.aNodes[n].pid == node.id && this.aNodes[n]._hc) { 
if (this.aNodes[n]._io) this.nodeStatus(false, n, this.aNodes[n]._ls); 
this.aNodes[n]._io = false; 
this.closeAllChildren(this.aNodes[n]); 
} 
} 
} 
// Change the status of a node(open or closed) 
dTree.prototype.nodeStatus = function(status, id, bottom) { 
try{ 
eDiv = document.getElementById('d' + this.obj + id); 
eJoin = document.getElementById('j' + this.obj + id); 
//****选择 
if(this.config.checkbox){ 
cbx = document.getElementById('cbx_' + this.obj + id); 
cbx.checked=status; 
cbxChild= eDiv.getElementsByTagName('input'); 
for(var i=0 ;i<cbxChild.length;i++){ 
cbxChild[i].checked=status; 
} 
} 
//****选择 
if (this.config.useIcons) { 
eIcon = document.getElementById('i' + this.obj + id); 
eIcon.src = (status) ? this.aNodes[id].iconOpen : this.aNodes[id].icon; 
} 
eJoin.src = (this.config.useLines)? 
((status)?((bottom)?this.icon.minusBottom:this.icon.minus):((bottom)?this.icon.plusBottom:this.icon.plus)): 
((status)?this.icon.nlMinus:this.icon.nlPlus); 
eDiv.style.display = (status) ? 'block': 'none'; 
}catch(ex){ 
} 
}; 
// [Cookie] Clears a cookie 
dTree.prototype.clearCookie = function() { 
var now = new Date(); 
var yesterday = new Date(now.getTime() - 1000 * 60 * 60 * 24); 
this.setCookie('co'+this.obj, 'cookieValue', yesterday); 
this.setCookie('cs'+this.obj, 'cookieValue', yesterday); 
}; 
// [Cookie] Sets value in a cookie 
dTree.prototype.setCookie = function(cookieName, cookieValue, expires, path, domain, secure) { 
document.cookie = 
escape(cookieName) + '=' + escape(cookieValue) 
+ (expires ? '; expires=' + expires.toGMTString() : '') 
+ (path ? '; path=' + path : '') 
+ (domain ? '; domain=' + domain : '') 
+ (secure ? '; secure' : ''); 
}; 
// [Cookie] Gets a value from a cookie 
dTree.prototype.getCookie = function(cookieName) { 
var cookieValue = ''; 
var posName = document.cookie.indexOf(escape(cookieName) + '='); 
if (posName != -1) { 
var posValue = posName + (escape(cookieName) + '=').length; 
var endPos = document.cookie.indexOf(';', posValue); 
if (endPos != -1) cookieValue = unescape(document.cookie.substring(posValue, endPos)); 
else cookieValue = unescape(document.cookie.substring(posValue)); 
} 
return (cookieValue); 
}; 
// [Cookie] Returns ids of open nodes as a string 
dTree.prototype.updateCookie = function() { 
var str = ''; 
for (var n=0; n<this.aNodes.length; n++) { 
if (this.aNodes[n]._io && this.aNodes[n].pid != this.root.id) { 
if (str) str += '.'; 
str += this.aNodes[n].value; 
} 
} 
this.setCookie('co' + this.obj, str); 
}; 
// [Cookie] Checks if a node id is in a cookie 
dTree.prototype.isOpen = function(id) { 
var aOpen = this.getCookie('co' + this.obj).split('.'); 
for (var n=0; n<aOpen.length; n++) 
if (aOpen[n] == id) return true; 
return false; 
}; 
// If Push and pop is not implemented by the browser 
if (!Array.prototype.push) { 
Array.prototype.push = function array_push() { 
for(var i=0;i<arguments.length;i++) 
this[this.length]=arguments[i]; 
return this.length; 
} 
}; 
if (!Array.prototype.pop) { 
Array.prototype.pop = function array_pop() { 
lastElement = this[this.length-1]; 
this.length = Math.max(this.length-1,0); 
return lastElement; 
} 
};

大家可以借鉴一下,自己弄个小工程试试,dtree还是不错的。
Javascript 相关文章推荐
javascript Xml增删改查(IE下)操作实现代码
Jan 30 Javascript
Javascript解决常见浏览器兼容问题的12种方法
Jan 04 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
Aug 16 Javascript
jquery子元素过滤选择器使用示例
Jun 24 Javascript
Node.js和PHP根据ip获取地理位置的方法
Mar 14 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
Oct 01 Javascript
Bootstrap媒体对象的实现
May 01 Javascript
浅谈es6 javascript的map数据结构
Dec 14 Javascript
React中嵌套组件与被嵌套组件的通信过程
Jul 11 Javascript
JavaScript之实现一个简单的Vue示例
Jan 17 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
Jul 25 Javascript
Vue3不支持Filters过滤器的问题
Sep 24 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
Apr 14 #Javascript
深入理解JavaScript系列(16) 闭包(Closures)
Apr 12 #Javascript
深入理解JavaScript系列(15) 函数(Functions)
Apr 12 #Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
Apr 12 #Javascript
jQuery UI Dialog 创建友好的弹出对话框实现代码
Apr 12 #Javascript
window.parent与window.openner区别介绍
Apr 12 #Javascript
JavaScript单元测试ABC
Apr 12 #Javascript
You might like
PHP函数utf8转gb2312编码
2006/12/21 PHP
如何判断php数组的维度
2013/06/10 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
PHP依赖注入原理与用法分析
2018/08/21 PHP
JavaScript面向对象编程
2008/03/02 Javascript
jquery $(this).attr $(this).val方法使用介绍
2013/10/08 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
openlayers实现地图弹窗
2020/09/25 Javascript
使用Python的Flask框架来搭建第一个Web应用程序
2016/06/04 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
python @propert装饰器使用方法原理解析
2019/12/25 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
介绍一下JMS编程步骤
2015/09/22 面试题
英语专业学生个人求职信
2014/01/28 职场文书
《守株待兔》教学反思
2014/03/01 职场文书
项目采购员岗位职责
2014/04/15 职场文书
保护环境演讲稿
2014/05/10 职场文书
校运动会广播稿(100篇)
2014/09/12 职场文书
库房管理员岗位职责
2015/02/12 职场文书
汶川大地震感悟
2015/08/10 职场文书
redis通过6379端口无法连接服务器(redis-server.exe闪退)
2021/05/08 Redis
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP