数据专栏

智能大数据搬运工,你想要的我们都有

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

HexUzHoNG 写道
哈哈,hax
偶用ajax设计模式换你的css蝉意花园看看咋样
或用j2ee development without ejb
发现自己不太会选书,这2本感觉都比较的抽象,理论的东西多些。
现在还看不太懂。:( 呵呵,可以啊,等我看完禅意花园吧(估计国庆节前可以看完)。
编程百科
2020-08-27 13:49:15
相关推荐: 关于翻译《CSS - The Missing Manual》术语表的讨论与建议 AlertBox 弹出层(信息提示框)效果 花瓣网方砖布局 图片内容无限加载 用户体验才是王道 《精通CSS》读书笔记(二) 《精通CSS》读书笔记2 《精通CSS》读书笔记(三) 《精通CSS》读书笔记(七) 《精通CSS》读书笔记(一)
推荐群组: Hadoop
更多相关推荐
CSS 续上篇 。第2章 box model译作“框模型”,我是始作俑者(大约在2003年,在opendl.com的w3c翻译讨论区中提出)。绝大多数是译作“盒模型”。当然据说之前就有人译为“框模型”,但是至少本书的译者估计或多或少受到了我的影响。因为 刘江说译者认为“盒”有3D的意思 ,而这是我在opendl论坛提出的论点。当然不能排除译者与当时的我正好有相同想法的可能。不过我后来觉得“框模型”也有点问题。在Zen of CSS Design(也已购买,等待读完本书后继续)的译者的论坛上,我 留言 到:
引用
“方框模型”或“框模型”很久以前提过,只是因为感到“盒模型”不够好(有三维意思),但是“方框模型”也未必见得就好。不知有什么更好的译名。……为什么“框模型”更贴切? 虽然我也是最早将其列为候选的(之一),但是我还真没有觉得“框模型”就更贴切也。。。“框模型”的主要问题是强调了框,加上border(边框),就有点乱了。“盒模型”的主要问题就是盒子是3d的。。。 不过好玩的是,Zen的译者认为“框模型”比“盒模型”好,但是实际上用了“盒模型”。 要问我现在我觉得怎么翻译box model好?我也说不上。 首先把box译作“框”是ok的,例如TextBox文本框,radiobox单选框,checkbox复选框,MsgBox消息框。但是“框模型”,容易与“边框”混淆,而且给人感觉重点在框(边界)上。 “盒模型”主要是有三维空间的感觉,但是“盒”有容器的意味,可以表达 “方块套方块”的境界 。其实有时候我想,是不是大白话的“方块模型”才是最好的? 关于IE/Win的box问题,本章给出的建议是“回避”,等待到第9章。但是这里没有说明,回避其实是有坏处的,因为将padding和margin加到父元素或子元素,很有可能会引入额外的无意义标签,或者破坏样式本身的自明性。 记录IE的bug:相对定位元素内若向右下进行绝对定位,需要设定相对定位元素的高宽。 在IE中模拟fixed定位,本书举了Jonathan Snook的网站作为例子,遗憾的是,他的网站已经改过版了,找不到fixed了。我原来以为首页上方的黑边是fixed的,但是一看,原来是border而已。 IE对于fixed定位有个很大的错误,我不是说不支持fixed就不对,但是既然其接受fixed作为合法参数,就不应把其当成static来处理,至少应当作absolute处理,这样可以graceful degradation。 模拟fixed的一个办法是使用脚本改变元素的绝对定位坐标,但是通常会导致抖动。实际上有两个小技巧可以模拟出不抖动的fixed。一个是使用css expression配合background-attachment:fixed。另一个(偶自行发现的)方法是使用ie的standard mode,然后html元素overflow:hidden,而body元素overflow:auto,这样body上绝对定位的元素在外层没有定位元素的情况下,会始终相对于html元素定位,从而达到和fixed定位一样的效果。这一方法是我在试图解决standard mode下scrollbar抢夺焦点的Bug(IE7似乎仍有这个bug)时偶然发现的。 关于containing block如何包围float元素(似乎有很多人以为这是FF的bug),需要额外的空元素来clear。为了避免引入无意义的标签,使用::after是个好方法,类似的,也许也可以用:last-child伪类,不过这两种方法无法用在IE上。但是IE可以用Holly hack,实际上就是让containing block获得hasLayout。 待 续 ...
编程百科
2020-08-27 13:49:03
又见这个介绍帖能不能上点实在点的东西? 比如web应用? 至于源码,看个人喜好吧
编程百科
2020-08-27 13:48:27
相关推荐: 在Extjs中使用MVC时对象选择的问题 用Ext4.0 MVC模式搭建一个应用程序框架 吐血的Ext4 JavaScript凌厉开发:ExtJS3详解与实践 ExtJS 4 MVC架构讲解 – ExtJS4中文教程 Extjs4.1MVC详解 Extjs MVC开发模式详解 ExtJS4 MVC开发教程:搭建开发环境
推荐群组: EXT
更多相关推荐
JavaScript EXT
关于一个ext4MVC的例子,代码中有相关注释;
详细见附件(是一个myEclipse项目)
 
本人在使用中的感受:
如果我们这样分层了,有利于组件重用,软件开发和维护,但学习成本很高,要新人接受需要一段时间,在开发中要按照一定规范.
建议不要随便使用这样分层!
 
每一层的介绍:
1,model和store其实就是管数据的,
2,view层,纯界面,极少逻辑代码,逻辑代码都写到controller中,这样好管理.
3,controller,建议逻辑代码都写到这里,这样好管理.
 
关于文件夹名称:
注意文件夹起名controller/model/store/view文件夹名称一定的,
这样每个相应的类名也可以根据这个来取,如:"keel.view.goods.GoodsListView"
keel是整个应用程序的命名空间,view就是view文件夹,goods.GoodsListView就是view文件夹下的goods文件夹的
GoodsListView.js文件;
这样程序就可以用动态加载功能了;
 
controller介绍:
其实我们很大一部分工作就在controller了,例子代码如下:
 
/* 商品控制层, 所有逻辑代码都在这里写 */ Ext.define('keel.controller.GoodsCtrl', { extend: 'Ext.app.Controller', stores: ['GoodsStore'],//声明该控制层要用到的store models: ['GoodsModel'],//声明该控制层要用到的model views: ['goods.GoodsListView','goods.GoodsWinView'],//声明该控制层要用到的view refs: [//相当于一个映射,这样就可以在控制层方便的通过geter取得相应的对象了 { ref: 'goodslistview', selector: 'goodslistview' }, { ref: 'goodswinview', selector: 'goodswinview' } ], init: function() { this.control({//这里的this相当于这个控制层 'viewport > goodslistview': { afterrender: function(gp){//侦听goodslistview渲染 gp.down('button[action=testBtn1]').on('click',function(){ //侦听goodslistview工具条上action=testBtn1的按钮单击事件 this.showWin(); },this); gp.down('button[action=testBtn2]').on('click',function(){ //侦听goodslistview工具条上action=testBtn2的按钮单击事件 alert(this.getGoodslistview().title) },this); } }, 'goodswinview button[action=ok]': { //侦听goodswinview中action=ok的按钮单击事件 click: function(){ this.getGoodswinview().setTitle(Ext.util.Format.date(new Date(),'Y-m-d H:i:s')); } } }); }, showWin : function(){ Ext.create('keel.view.goods.GoodsWinView').show(); } });  
 
编程百科
2020-08-27 13:48:16
文件:ext-2.3.0/source/core/Ext.js
 
概述:Ext.js主要负责创建Ext全局对象,构建其命名空间,定义extend类继承方法,探测浏览器信息和对Javascript原生库进行扩展。
 
分析:
 
一、创建Ext全局对象 // 创建Ext全局对象,大多数JS库为了避免和其他JS库命名冲突,都会把自己创建的类或函数封装到一个全局变量中去, // 这样就相当于创造了自己的命名空间,可以算是一个单例模式。例如,jQuery就是全部都封装到$变量中去。 Ext = {version: '2.3.0'};
 
二、设置全局undefined变量 // 兼容旧浏览器,早期的浏览器实现中,undefined并不是全局变量。就是说,你要判断一个变量是否是没定义, // 你需要这样写if (typeof a == 'undefined'),不可以写成if (a == undefined)。所以,上面的代码就可以理解了。 // 右面的window["undefined"],因为window对象没有undefined属性,所以其值为undefined, // 把undefined赋值给window的undefined属性上,就相当于把undefined设置成了全局变量, // 这样以后你再判断一个变量是否是未定义的时候,就不需要使用typeof,直接判断就可以了。 window["undefined"] = window["undefined"];
 
三、定义apply方法属性复制函数 // apply方法,把对象c中的属性复制到对象o中,支持默认属性defaults设置。这个方法属于对象属性的一个浅拷贝函数。 Ext.apply = function(o, c, defaults){ if(defaults){ // 如果默认值defaults存在,那么先把defaults上得属性复制给对象o Ext.apply(o, defaults); } if(o && c && typeof c == 'object'){ for(var p in c){ o[p] = c[p]; } } return o; };
 
四、扩展Ext对象 (function(){ // idSeed,用来生成自增长的id值。 var idSeed = 0; // ua,浏览器的用户代理,主要用来识别浏览器的型号、版本、内核和操作系统等。 var ua = navigator.userAgent.toLowerCase(), check = function(r){ return r.test(ua); }, // isStrict,表示当前浏览器是否是标准模式。 // 如果正确的设置了网页的doctype,则compatMode为CSS1Compat,否则为BackCompat isStrict = document.compatMode == "CSS1Compat", // isOpera,表示是否是opera浏览器。 isOpera = check(/opera/), // isChrome,表示是否是谷歌浏览器。 isChrome = check(/chrome/), // isWebKit,表示当前浏览器是否使用WebKit引擎。 // WebKit是浏览器内核,Safari和Chrome使用WebKit引擎。 isWebKit = check(/webkit/), // isSafari,表示是否是苹果浏览器,下面代码是对其版本识别。 isSafari = !isChrome && check(/safari/), isSafari2 = isSafari && check(/applewebkit\/4/), // unique to Safari 2 isSafari3 = isSafari && check(/version\/3/), isSafari4 = isSafari && check(/version\/4/), // isIE,表示是否是IE浏览器,下面代码是对其版本识别。 isIE = !isOpera && check(/msie/), isIE7 = isIE && check(/msie 7/), isIE8 = isIE && check(/msie 8/), isIE6 = isIE && !isIE7 && !isIE8, // isGecko,表示当前浏览器是否使用Gecko引擎。 // Gecko是浏览器内核,Firefox使用Gecko引擎。 isGecko = !isWebKit && check(/gecko/), isGecko2 = isGecko && check(/rv:1\.8/), isGecko3 = isGecko && check(/rv:1\.9/), // isBorderBox,表示浏览器是否是IE的盒模式。 // 众所周知,IE的盒模式和W3C的盒模式不一致。当IE浏览器在怪异模式下,就会导致错误的盒模式。 isBorderBox = isIE && !isStrict, // isWindows,表示是否是windows操作系统。 isWindows = check(/windows|win32/), // isMac,表示是否是苹果操作系统。 isMac = check(/macintosh|mac os x/), // isAir,AIR(Adobe Integrated Runtime),是adobe开发的一个平台吧,不太了解,没用过。 isAir = check(/adobeair/), // isLinux,表示是否是Liunx操作系统。 isLinux = check(/linux/), // isSecure,表示是否是https连接。 isSecure = /^https/i.test(window.location.protocol); // 缓存一下CSS的背景图像,防止图像闪烁,应该是IE6的一个bug。 if(isIE6){ try{ document.execCommand("BackgroundImageCache", false, true); }catch(e){} } // 扩展Ext对象,有一些属性,这个文件中没有使用,现在先不解释其作用,后面遇到了再讲。 Ext.apply(Ext, { // isStrict,表示是否是标准模式。 isStrict : isStrict, // isSecure,表示是否是https连接。 isSecure : isSecure, // isReady,表示Dom文档树是否加载完成 isReady : false, // enableGarbageCollector和enableListenerCollection这两个变量在Element中使用了,解析到Element时再解释其含义。 enableGarbageCollector : true, enableListenerCollection:false, // SSL_SECURE_URL,这个值在构造隐藏的iframe时,用来设置src属性的,只是当是https连接的时候才用。 SSL_SECURE_URL : "javascript:false", // BLANK_IMAGE_URL,1像素透明图片地址 BLANK_IMAGE_URL : "http:/"+"/extjs.com/s.gif", // emptyFn,空函数 emptyFn : function(){}, // applyIf,把对象c的属性复制到对象o上,只复制o没有的属性 applyIf : function(o, c){ if(o && c){ for(var p in c){ if(typeof o[p] == "undefined"){ o[p] = c[p]; } } } return o; }, // addBehaviors函数可以一次给多个Ext.Element添加不同的事件响应函数 addBehaviors : function(o){ // 判断Dom树是否已经加装成功 if(!Ext.isReady){ // 如果Dom树没有加载好,那么等到加载好了,再执行此函数 Ext.onReady(function(){ Ext.addBehaviors(o); }); return; } // cache,简单缓存一下选择过的CSS Selector。 var cache = {}; // 遍历对象o,b的格式应该是selector@eventName for(var b in o){ // parts[0]=selector,parts[1]=eventName var parts = b.split('@'); if(parts[1]){ // 如果事件名称存在,s为selector var s = parts[0]; // 判断一下cache缓存中是否已经查询过该selector if(!cache[s]){ // 如果没有查询过,那么用select方法查询一下 cache[s] = Ext.select(s); } // 调用Element的on方法来注册事件函数 cache[s].on(parts[1], o[b]); } } // 释放cache变量,防止内存泄露 cache = null; }, // 取得el的id属性。el可以是Ext.Element或者是Dom元素。 // 如果el不存在,那么生成一个自增长的id,并返回这个id。 // 如果el存在,但是没有id属性,那么生成一个自增长的id,并赋值给el的id属性,最后返回id值。 // 如果el存在,并且也有id属性,那么直接返回el的id值。 // prefix表示生成自增长的id的前缀,默认值为ext-gen id : function(el, prefix){ prefix = prefix || "ext-gen"; el = Ext.getDom(el); var id = prefix + (++idSeed); return el ? (el.id ? el.id : (el.id = id)) : id; }, // 类继承函数,基于javascript的prototype,模仿面相对象的继承特性。 // 整个ExtJS框架的继承机制就是这个函数实现的。 extend : function(){ // override函数,用来覆盖prototype上的属性的(私有对象,仅下面的return function内部可以使用) var io = function(o){ for(var m in o){ this[m] = o[m]; } }; // Object的构造函数(私有对象,仅下面的return function内部可以使用) var oc = Object.prototype.constructor; return function(sb, sp, overrides){ // sb表示subclass,sp表示superclass,overrides是默认值为对象型 // 如果sp是对象,表示没有传sb变量进来,所以重新设置一下参数 if(typeof sp == 'object'){ overrides = sp; sp = sb; // 如果overrides中提供了构造函数,那么就用提供的, // 否则用下面这个匿名函数,匿名函数会调用父类的构造函数 sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);}; } // F是一个临时的类,其prototype指向superclass的prototype, // 同时也把subclass的prototype指向了F对象, // 这样可以避免在类继承的时候,调用superclass的构造函数 var F = function(){}, sbp, spp = sp.prototype; F.prototype = spp; sbp = sb.prototype = new F(); sbp.constructor=sb; sb.superclass=spp; if(spp.constructor == oc){ spp.constructor=sp; } // 覆盖函数 sb.override = function(o){ Ext.override(sb, o); }; sbp.override = io; // 设置默认值 Ext.override(sb, overrides); // 继承函数,这样写方便,可以直接从别的类继承新类 sb.extend = function(o){Ext.extend(sb, o);}; return sb; }; }(), // 覆盖函数,直接把属性复制到origclass的prototype上 override : function(origclass, overrides){ if(overrides){ var p = origclass.prototype; for(var method in overrides){ p[method] = overrides[method]; } // 下面是处理IE浏览器在枚举对象的属性时, // 原生的方法toString枚举不出来,即使是自定义的toString也不行 if(Ext.isIE && overrides.toString != origclass.toString){ p.toString = overrides.toString; } } }, // 生成命名空间。javascript语言没有命名空间这么一说,所以只好用对象的属性来实现。 namespace : function(){ var a=arguments, o=null, i, j, d, rt; for (i=0; i五、创建Ext所用的命名空间 Ext.ns("Ext", "Ext.util", "Ext.grid", "Ext.dd", "Ext.tree", "Ext.data", "Ext.form", "Ext.menu", "Ext.state", "Ext.lib", "Ext.layout", "Ext.app", "Ext.ux");
 
六、扩展原生Function Ext.apply(Function.prototype, { // 创建回调函数,这个有点太简单了,并且this指向了window,不可以自定义。功能不是很强 createCallback : function(/*args...*/){ var args = arguments; var method = this; return function() { return method.apply(window, args); }; }, // 创建委托(注:Delegate在C#里是叫委托的,其实就是c语音里的函数指针,js中叫匿名函数) // createDelegate比createCallback高级了一点可以设置this指针,同时也可以设置传入的参数 createDelegate : function(obj, args, appendArgs){ var method = this; return function() { var callArgs = args || arguments; if(appendArgs === true){ callArgs = Array.prototype.slice.call(arguments, 0); callArgs = callArgs.concat(args); }else if(typeof appendArgs == "number"){ callArgs = Array.prototype.slice.call(arguments, 0); // copy arguments first var applyArgs = [appendArgs, 0].concat(args); // create method call params Array.prototype.splice.apply(callArgs, applyArgs); // splice them in } return method.apply(obj || window, callArgs); }; }, // defer是createDelegate的延迟版,可以延迟执行 defer : function(millis, obj, args, appendArgs){ var fn = this.createDelegate(obj, args, appendArgs); if(millis){ return setTimeout(fn, millis); } fn(); return 0; }, // 这个函数可以在你执行完原函数以后,执行一下自定义的函数。 createSequence : function(fcn, scope){ if(typeof fcn != "function"){ return this; } var method = this; return function() { var retval = method.apply(this || window, arguments); fcn.apply(scope || this || window, arguments); return retval; }; }, // 这个就是完全的函数代理了,和Spring的AOP是一个概念。 createInterceptor : function(fcn, scope){ if(typeof fcn != "function"){ return this; } var method = this; return function() { fcn.target = this; fcn.method = method; if(fcn.apply(scope || this || window, arguments) === false){ return; } return method.apply(this || window, arguments); }; } });  
七、扩展原生String Ext.applyIf(String, { // 转义单引号和反斜杠 escape : function(string) { return string.replace(/('|\\)/g, "\\$1"); }, // 这个函数是对数组进行空格补位 leftPad : function (val, size, ch) { var result = new String(val); if(!ch) { ch = " "; } while (result.length < size) { result = ch + result; } return result.toString(); }, // 这个是格式化字符串,很多语言都有的功能 format : function(format){ var args = Array.prototype.slice.call(arguments, 1); return format.replace(/\{(\d+)\}/g, function(m, i){ return args[i]; }); } }); // 切换值函数 String.prototype.toggle = function(value, other){ return this == value ? other : value; }; // 去空格函数 String.prototype.trim = function(){ var re = /^\s+|\s+$/g; return function(){ return this.replace(re, ""); }; }();  
八、扩展原生Number Ext.applyIf(Number.prototype, { // 对当前数值取一个范围 constrain : function(min, max){ return Math.min(Math.max(this, min), max); } });  
九、扩展原生Array Ext.applyIf(Array.prototype, { indexOf : function(o){ for (var i = 0, len = this.length; i < len; i++){ if(this[i] == o) return i; } return -1; }, remove : function(o){ var index = this.indexOf(o); if(index != -1){ this.splice(index, 1); } return this; } });  
十、扩展原生Date // 返回一个时间差 Date.prototype.getElapsed = function(date) { return Math.abs((date || new Date()).getTime()-this.getTime()); };  
 
编程百科
2020-08-27 13:48:04
相关推荐: 利用多叉树实现Ext JS中的无限级树形菜单(一种构建多级有序树形结构JSON的方法) 多叉树结合JavaScript树形控件实现无限级树形菜单(一种构建多级有序树形结构JSON(或XML)数据源的方法) 多叉树及其应用:多叉树结合JavaScript树形控件实现无限级树形结构(一种构建多级有序树形结构JSON(或XML)数据源的方法) 无限极二叉树,数据结构,经典算法 多叉树结合JavaScript树形控件实现无限级树形菜单(一种构建多级有序树形结构JSON(或XML)数据源的方法) 利用多叉树实现Ext JS中的无限级树形菜单(一种构建多级有序树形结构JSON的方法)...
推荐群组: EXT
更多相关推荐
EXT 多叉树 无限级树形菜单 多级树形结构JSON
利用多叉树实现Ext JS中的无限级树形菜单 (一种构建多级有序树形结构JSON的方法)                                                  
 
 
一、问题研究的背景和意义
目前在Web应用程序开发领域,Ext JS框架已经逐渐被广泛使用,它是富客户端开发中出类拔萃的框架之一。在Ext的UI控件中,树形控件无疑是最为常用的控件之一,它用来实现树形结构的菜单。TreeNode用来实现静态的树形菜单,AsyncTreeNode用来实现动态的异步加载树形菜单,后者最为常用,它通过接收服务器端返回来的JSON格式的数据,动态生成树形菜单节点。动态生成树有两种思路:一种是一次性生成全部树节点,另一种是逐级加载树节点( 利用 AJAX ,每次点击节点时查询下一级节点 )。对于大数据量的菜单节点来说,逐级加载是比较合适的选择,但是对于小数据量的菜单来说,一次性生成全部节点应该是最为合理的方案。在实际应用开发中,一般不会遇到特别大数据量的场景,所以一次性生成全部菜单节点是我们重点研究的技术点,本文就是介绍基于Ext JS的应用系统中如何将数据库中的无限级层次数据一次性在界面中生成全部菜单节点(例如在界面中以树形方式一次性展示出银行所有分支机构的信息),同时对每一个层次的菜单节点按照某一属性和规则排序,展示出有序的菜单树。
 
解决 Ext JS 无限级树形菜单的问题,可以拓展出更多的应用场景,例如树形结构表格TreeGrid,一次性生成树形表格,对树形表格进行完整分页,对表格列进行全排序 ;或者可以利用本文的思路扩展出其他的更复杂的应用场景。
 
先看两个图例,有个直观上的认识:
图一,银行分支机构树形结构菜单
 
图二,树形结构表格
 
 
二、详细设计方案
让我们先看一段代码片段:
文件一,branchTree.html (Ext树形控件页面)
  Ext.onReady( function(){ var tree = new Ext.tree.TreePanel({ height: 300, width: 400, animate:true, enableDD:true, containerScroll: true, rootVisible: false, frame: true, // getBranch.do请求服务器返回多级树形结构的JSON字符串 loader: new Ext.tree.TreeLoader({dataUrl:'getBranch.do'}), root : new Ext.tree.AsyncTreeNode({id:'0',text:'根结点'}) }); tree.expandAll(); } );
 
 
文件二,branchTreeJSON.jsp (接收getBranch.do请求,返回无限级JSON字符串)
  <% // 读取银行分支机构的层次数据 List result = DataAccess.getBankInfoList(); // 将层次数据转换为多叉树对象(本文下面会详细介绍该数据结构的实现方法) Node root = ExtTreeHelper.createExtTree(result); %> [ <%=root.toString()%> ]
 
 
以上两个程序文件是一次性生成无限级树形菜单所必须的,其中最为关键的部分就是如何生成一个无限级的JSON字符串,返回给客户端的Ext树形控件。对于银行分支机构来说,需要返回类似如下的JSON串:
  { id: '100000', text: '廊坊银行总行', children: [ { id: '110000', text: '廊坊分行', children: [ { id: '113000', text: '廊坊银行开发区支行', leaf: true }, { id: '112000', text: '廊坊银行解放道支行', children: [ { id: '112200', text: '廊坊银行三大街支行', leaf: true }, { id: '112100', text: '廊坊银行广阳道支行', leaf: true } ] }, { id: '111000', text: '廊坊银行金光道支行', leaf: true } ] } ] }
 
 
同时还可能需要对树中每一个层次的节点按照某一属性(比如分支机构编号)进行排序,以展示出有序的树形菜单。
 
现在可以把问题概括为:
1、 把 数据库中的 层次数据转换成JSON格式的字符串
2、 对树中每一个层次的节点按照某一属性(比如分支机构编号)进行排序
 
下面介绍解决问题的思路:
在数据结构这门课中,我们都学过树 ,无限级树形菜单就可以抽象成一种多叉树结构,即每个节点下包含多个子节点的树形结构,首先就需要把数据库中的层次数据转换成多叉树结构的对象树,也就是构造出一棵多叉树。
有了数据结构,还要实现相应的算法,我们需要实现两种算法:
1、兄弟节点横向排序算法,对隶属于同一个父节点下面的所有直接子节点按照某一节点属性和规则进行排序,保持兄弟节点横向有序;
2、先序遍历算法,递归打印出无限级JSON字符串。
 
概括起来分为三步:
1、 构造无序的多叉树结构
2、 实现兄弟节点横向排序方法
3、 实现先序遍历方法,打印出JSON字符串
 
如图所示:
 
 
 
 
 
三、源代码实现(Java语言版)
实现这样一颗树,需要设计三个类:树类(MultipleTree.java)、节点类(Node.java)、孩子列表类(Children.java);为了方便演示,还需要构造一些假的层次数据,因此还需要建一个构造假数据的类(VirtualDataGenerator.java),以下代码拷贝出来之后可直接运行测试:
  package test; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Collections; /** * 多叉树类 */ public class MultipleTree { public static void main(String[] args) { // 读取层次数据结果集列表 List dataList = VirtualDataGenerator.getVirtualResult(); // 节点列表(散列表,用于临时存储节点对象) HashMap nodeList = new HashMap(); // 根节点 Node root = null; // 根据结果集构造节点列表(存入散列表) for (Iterator it = dataList.iterator(); it.hasNext();) { Map dataRecord = (Map) it.next(); Node node = new Node(); node.id = (String) dataRecord.get("id"); node.text = (String) dataRecord.get("text"); node.parentId = (String) dataRecord.get("parentId"); nodeList.put(node.id, node); } // 构造无序的多叉树 Set entrySet = nodeList.entrySet(); for (Iterator it = entrySet.iterator(); it.hasNext();) { Node node = (Node) ((Map.Entry) it.next()).getValue(); if (node.parentId == null || node.parentId.equals("")) { root = node; } else { ((Node) nodeList.get(node.parentId)).addChild(node); } } // 输出无序的树形菜单的JSON字符串 System.out.println(root.toString()); // 对多叉树进行横向排序 root.sortChildren(); // 输出有序的树形菜单的JSON字符串 System.out.println(root.toString()); // 程序输出结果如下(无序的树形菜单)(格式化后的结果): // { // id : '100000', // text : '廊坊银行总行', // children : [ // { // id : '110000', // text : '廊坊分行', // children : [ // { // id : '113000', // text : '廊坊银行开发区支行', // leaf : true // }, // { // id : '111000', // text : '廊坊银行金光道支行', // leaf : true // }, // { // id : '112000', // text : '廊坊银行解放道支行', // children : [ // { // id : '112200', // text : '廊坊银行三大街支行', // leaf : true // }, // { // id : '112100', // text : '廊坊银行广阳道支行', // leaf : true // } // ] // } // ] // } // ] // } // 程序输出结果如下(有序的树形菜单)(格式化后的结果): // { // id : '100000', // text : '廊坊银行总行', // children : [ // { // id : '110000', // text : '廊坊分行', // children : [ // { // id : '111000', // text : '廊坊银行金光道支行', // leaf : true // }, // { // id : '112000', // text : '廊坊银行解放道支行', // children : [ // { // id : '112100', // text : '廊坊银行广阳道支行', // leaf : true // }, // { // id : '112200', // text : '廊坊银行三大街支行', // leaf : true // } // ] // }, // { // id : '113000', // text : '廊坊银行开发区支行', // leaf : true // } // ] // } // ] // } } } /** * 节点类 */ class Node { /** * 节点编号 */ public String id; /** * 节点内容 */ public String text; /** * 父节点编号 */ public String parentId; /** * 孩子节点列表 */ private Children children = new Children(); // 先序遍历,拼接JSON字符串 public String toString() { String result = "{" + "id : '" + id + "'" + ", text : '" + text + "'"; if (children != null && children.getSize() != 0) { result += ", children : " + children.toString(); } else { result += ", leaf : true"; } return result + "}"; } // 兄弟节点横向排序 public void sortChildren() { if (children != null && children.getSize() != 0) { children.sortChildren(); } } // 添加孩子节点 public void addChild(Node node) { this.children.addChild(node); } } /** * 孩子列表类 */ class Children { private List list = new ArrayList(); public int getSize() { return list.size(); } public void addChild(Node node) { list.add(node); } // 拼接孩子节点的JSON字符串 public String toString() { String result = "["; for (Iterator it = list.iterator(); it.hasNext();) { result += ((Node) it.next()).toString(); result += ","; } result = result.substring(0, result.length() - 1); result += "]"; return result; } // 孩子节点排序 public void sortChildren() { // 对本层节点进行排序 // 可根据不同的排序属性,传入不同的比较器,这里传入ID比较器 Collections.sort(list, new NodeIDComparator()); // 对每个节点的下一层节点进行排序 for (Iterator it = list.iterator(); it.hasNext();) { ((Node) it.next()).sortChildren(); } } } /** * 节点比较器 */ class NodeIDComparator implements Comparator { // 按照节点编号比较 public int compare(Object o1, Object o2) { int j1 = Integer.parseInt(((Node)o1).id); int j2 = Integer.parseInt(((Node)o2).id); return (j1 < j2 ? -1 : (j1 == j2 ? 0 : 1)); } } /** * 构造虚拟的层次数据 */ class VirtualDataGenerator { // 构造无序的结果集列表,实际应用中,该数据应该从数据库中查询获得; public static List getVirtualResult() { List dataList = new ArrayList(); HashMap dataRecord1 = new HashMap(); dataRecord1.put("id", "112000"); dataRecord1.put("text", "廊坊银行解放道支行"); dataRecord1.put("parentId", "110000"); HashMap dataRecord2 = new HashMap(); dataRecord2.put("id", "112200"); dataRecord2.put("text", "廊坊银行三大街支行"); dataRecord2.put("parentId", "112000"); HashMap dataRecord3 = new HashMap(); dataRecord3.put("id", "112100"); dataRecord3.put("text", "廊坊银行广阳道支行"); dataRecord3.put("parentId", "112000"); HashMap dataRecord4 = new HashMap(); dataRecord4.put("id", "113000"); dataRecord4.put("text", "廊坊银行开发区支行"); dataRecord4.put("parentId", "110000"); HashMap dataRecord5 = new HashMap(); dataRecord5.put("id", "100000"); dataRecord5.put("text", "廊坊银行总行"); dataRecord5.put("parentId", ""); HashMap dataRecord6 = new HashMap(); dataRecord6.put("id", "110000"); dataRecord6.put("text", "廊坊分行"); dataRecord6.put("parentId", "100000"); HashMap dataRecord7 = new HashMap(); dataRecord7.put("id", "111000"); dataRecord7.put("text", "廊坊银行金光道支行"); dataRecord7.put("parentId", "110000"); dataList.add(dataRecord1); dataList.add(dataRecord2); dataList.add(dataRecord3); dataList.add(dataRecord4); dataList.add(dataRecord5); dataList.add(dataRecord6); dataList.add(dataRecord7); return dataList; } }
 
 
好了,通过上面的代码,就可以实现多叉树的兄弟节点横向排序和先序遍历了,实现了将层次数据转换为有序无限级JSON字符串的目的。
 
在实际的项目中,可以把上面的有效代码融入其中,或者在此基础上进行一些扩展:
1、 实现对指定层次的排序(例如只排序第一层的节点,或者只排序某一父节点下的所有子节点)
2、 遍历输出树形结构时可以加入判断条件过滤掉某些节点
3、 实现节点的删除功能
4、 在节点类中增加一个父节点的引用,就可以计算出某一节点所处的级别
5、 在不支持层次查询的数据库应用系统中使用该算法实现相同的效果
 
四、思考与总结
这篇文章的重点是如何构造有序的无限级的树形结构JSON字符串,一次性生成树形菜单,而不是利用AJAX的方式,反复向服务器端发送请求,一级接一级的加载树节点。
 
既然可以构造无限级的 JSON 字符串,那么也可以根据这个思路构造无限级的 XML 字符串,或者构造具有层次结构的 UL – LI 组合(用 UL - LI 来展示树形结构),或者构造具有层次结构的 TABLE (用 TABLE 来展示树形结构)。 如下所示:
 
(1)XML层次结构
 
 
(2) UL - LI 层次结构
 
  • 廊坊银行总行
    • 廊坊分行
      • 廊坊银行开发区支行
      • 廊坊银行解放道支行
        • 廊坊银行三大街支行
        • 廊坊银行广阳道支行
      • 廊坊银行金光道支行

 
 
(3)TABLE层次结构
 
廊坊银行总行
廊坊分行
廊坊银行开发区支行
廊坊银行解放道支行
廊坊银行三大街支行
廊坊银行广阳道支行
廊坊银行金光道支行

 
 
另外对 TreeGrid 树形表格也有一定的价值:
   1、   一次性构造树形表格,实现数据分级展示
   2、   通过更换比较器,实现对不同表格列的全排序 ( 全排序指的是对所有页的数据进行排序,而不是只对当前页的数据排序 )
   3、   实现对树形表格的完整分页(每次分页时,只取固定数目的第一层节点,之后调用 toString 方法,展示出完 整条数的分级数据)



五、参考书籍
   1、Mark Allen Weiss,数据结构与算法分析(Java语言描述)
   2、Bruce Eckel,Thinking In Java Third Edition
   3、David Flanagan,JavaScript: The Definitive Guide, 5th Edition
   4、OCA Oracle Database 11g SQL Fundamentals I Exam Guide
 
 
六、联系方式
multipletree@163.com
 
 *
注:在另一篇文章《 多叉树结合JavaScript树形控件实现无限级树形菜单(一种构建多级有序树形结构JSON(或XML)数据源的方法) 》中,对代码进行了优化,去掉了Children类,
链接见:  http://www.iteye.com/topic/1122125  
 
 
 
 
编程百科
2020-08-27 13:47:51
相关推荐: javascript 父窗口(父页面)— 子窗口 (子页面)互相调用的方法 jquery-easyui中创建Window窗口 花瓣网方砖布局 图片内容无限加载 用户体验才是王道 打开新窗口并关闭当前的窗口的实现办法 打开新窗口的js代码 html css Div+Css控制网页排版小记. HTML5和CSS3新特性一览
推荐群组: EXT
更多相关推荐
PHP
利用CSS控制链接在新窗口中打开很简单,只需要定义一句CSS即可: .openInBlankWindow a:active {test:expression(target="_blank");}  
然后在某个容器(比如div/span)中使用:  
 
但是这样使用有个问题,就是这个CSS只在IE中有效,至少在Firefox/Opera中是无效的,其它的浏览器没有测试。不知大家是否有什么好办法,在不修改原来html的情况下,是链接在新窗口中打开。
编程百科
2020-08-27 13:47:44
表面上看起来和原型设计非常的相似,原型设计的目的是进行产品规划,面对的工程师和项目实施成员,甚至是boss,是产品经理一个很重要的工作。但是面向界面设计的目的是为了摸清用户的需求,用户不会去看更多的解释和文档。所以就会遇见上边的兄弟说的ui设计很大的难度,但是从项目整个风险来说降低了。
编程百科
2020-08-27 13:47:37
相关推荐: 区块(Block)数据绑定技术 方便使用 CMSPAD Console 对JavaScript脚本进行跟踪调试 ruby+flex实现天气预报 RIA编程-神奇的FLEX实战 CMSPAD支持Flex了! 把PHP应用和Flex结合起来! Flex 支持 chrome浏览器debug flex的使用实例
推荐群组: flex
更多相关推荐
PHP
1.3.2版开始,CMSPAD正式支持Flex,也就是说Flex程序可以远程调用CMSPAD的Portlet模块。下面咱们看看它是怎么做的:
 
这是后台的Portlet代码,Flex调用函数以 flex 开头,有一个参数($params)用于传递远程Flex变量: "world"); } } ?>
 
首先,如果你是使用Flex Builder,需要先将CMSPAD包内的 kernel/lib/cmspad.swc 库导入到项目中,然后就可以通过使用 com.cmspad.Request 类来调用远程Portlet。 看看进行远程调用的Flex代码:
 
这样运行这个Flex应用程序并点击那个按钮就会看到:
 
 
此刻,用户就可以使用Flex很容易地调用CMSPAD的Portlet了。
 
CMSPAD项目地址: http://code.google.com/p/cmspad
编程百科
2020-08-27 13:47:21
相关推荐: 翻译:Appendix A:Introduction to Ruby 今天完成了一个较实用的android Gallery Demo 网络读取图片,定时切换,正反无限循环,图片满屏,遮罩标题文字,切换圆点显示,多线程控制 精通 JavaScript中的正则表达式 关于浏览器对于html的input标签中name的命名特殊字符处理(GET)与script+js跨域实现 深入剖析PHP输入流 php://input PHP+JavaScript+HTML变量之间赋值及传递 PHP输入流php://input 深入剖析PHP输入流 php://input与POST/GET的区别
推荐群组: EXT
更多相关推荐
PHP 当input 中的name值有"."这个符号时. 在PHP的传递中会把这个小圆点替换成"_"下划线.. 今天做项目时偶然把name的值放了小圆点测试出来的.
编程百科
2020-08-27 13:47:03
相关推荐: 关于REST一些最新的业界动态 Two extractors couldn't work together 求求你们,千万别再说自己是REST了 webservice入门到精通(备java基础,xml,javaee框架) XML从入门到精通(备java基础,javaee框架webservice必经之路) android基础知识10:webservice 02:REST C#/.Net企业级系统架构设计实战精讲教程 WebService之基于REST机制的实现实例(Java版)
推荐群组: HTML5
更多相关推荐
PHP REST是什么 REST是英文Representational State Transfer的缩写,中文翻译:表述性状态转移。 他是由Roy Thomas Fielding博士在他的论文 《Architectural Styles and the Design of Network-based Software Architectures》中提出的一个术语。
REST本身只是为分布式超媒体系统设计的一种架构风格,而不是标准.
Restful Web Service面向资源,不是面向动作(Action) REST风格Web Service报文格式 什么,你一点都不懂我说什么?那么先看看 Rest基本概念 有效的XML格式都可以说是Rest风格的报文。如YAHOO提供的Restful Web Service的一个例子 : http://api.search.yahoo.com/WebSearchService/V1/webSearch?query=%5C%22XML%20Query%5C%22&appid=YahooDemo 下面是访问后返回结果片断 W3C XML Query (XQuery) Language that allows for flexible query facilities to extract data from real and virtual documents on the Web. http://www.w3.org/XML/Query http://uk.wrs.yahoo.com/_ylt=A0Je5Vx_EWpHwV0AkC7dmMwF;_ylu=X3oDMTB2cXVjNTM5BGNvbG8DdwRsA1dTMQRwb3MDMQRzZWMDc3IEdnRpZAM-/SIG=11fuf4pkj/EXP=1198220031/**http%3A//www.w3.org/XML/Query www.w3.org/XML/Query 1198051200 text/html http://uk.wrs.yahoo.com/_ylt=A0Je5Vx_EWpHwV0AkS7dmMwF;_ylu=X3oDMTBwOHA5a2tvBGNvbG8DdwRwb3MDMQRzZWMDc3IEdnRpZAM-/SIG=16gufb4vc/EXP=1198220031/**http% 3A//66.218.69.11/search/cache%3Fei=UTF-8%26query=%255C%2522XML%2BQuery%255C%2522%26appid=YahooDemo%26u=www.w3.org/XML/Query%26w=%2522xml%2Bquery%2522%26d=DYOEo7XiP-1e%26icp=1%26.intl=us 58502 XQuery 1.0: An XML Query Language Don Chamberlin (XML Query WG), IBM Almaden Research Center, via http://www. ... has been developed by the W3C XML Query Working Group, which is part of the ... http://www.w3.org/TR/xquery/ http://uk.wrs.yahoo.com/_ylt=A0Je5Vx_EWpHwV0Aky7dmMwF;_ylu=X3oDMTB2ZjQ4dDExBGNvbG8DdwRsA1dTMQRwb3MDMgRzZWMDc3IEdnRpZAM-/SIG=11g15fbj0/EXP=1198220031/**http%3A//www.w3.org/TR/xquery/ www.w3.org/TR/xquery/ 1169193600 text/html http://uk.wrs.yahoo.com/_ylt=A0Je5Vx_EWpHwV0AlC7dmMwF;_ylu=X3oDMTBwZG5hOWwzBGNvbG8DdwRwb3MDMgRzZWMDc3IEdnRpZAM-/SIG=16hn3aelo/EXP=1198220031 /**http%3A//66.218.69.11/search/cache%3Fei=UTF-8%26query=%255C%2522XML%2BQuery%255C%2522%26appid=YahooDemo%26u=www.w3.org/TR/xquery/%26w=%2522xml%2Bquery%2522%26d=YBKWrbXiP9TA%26icp=1%26.intl=us 525624 .... 下面是我使用CakePhp(一个PHP框架)在本机构建了一个rest服务, 当访问http://localhost/hostel/rest/countries/listing 时,得到下面的XML 830 United States 831 Canada .... 再次强调:Restful Web Service是一种风格,XML是任意的。不过最近好像出了WADL规范应用于Rest,好像WSDL规范SOAP一样,有空可以研究一下。 访问Restful Web Service(客户端代码) 再次确认,你理解了Restful?---风格,是一种风格,所以: Restful webservice客户端像解析一般的xml一样,获得Restful Web Service返回的XML流,用DOM/SAX/SimpleXML解析它均可。 这里使用php的SimpleXML API操纵前面提到Yahoo服务。 SimpleXML 扩展适合于操纵不很复杂或者嵌套不太深并且没有混合内容的 XML 文档。SimpleXML 比 DOM 更容易编码,就像名称所暗示的那样。如果处理的文档结构已知,就更加直观。libXML2 架构的互操作性大大增强了 DOM 和 SimpleXML 的灵活性,能够随意在 DOM 和 SimpleXML 之间交换导入格式。 下面的代码使用 SimpleXML 扩展解析查询结果。 attributes() as $name=>$attr) { $res[$name]=$attr; } //Use one of those "informational" elements to display the total //number of results for the query. echo "

The query returns ".$res["totalResultsAvailable"]." total results The first 10 are as follows:

"; //Unlike with DOM, where we loaded the entire document into the result object, // with SimpleXML, we get back an object in thefirst place, // so we can just use the number of results returned to loop through the Result members. for($i=0; $i<$res['totalResultsReturned']; $i++) { //The object represents each piece of data as a member variable //rather than an array element, so the syntax is a little bit //different from the DOM version. $thisResult = $xml->Result[$i]; echo "". $thisResult->Title.": "; echo $thisResult->Summary; echo "

"; } ?> 输出结果类似如下HTML效果: 写一个自己的Restful Web Service 别嫌我啰嗦,再一次地,前面说过:Restful Web Service是任意的有效的XML。所以使用php/jsp等服务器端技术,不需要任何框架都可以生成你想要得XML流。如此说来:这个Restful Web Service例子也没什么好写的喽 CakePHP是一个基于PHP的web框架,提供了更好的输出Restful风格的Web Service的能力。Y有兴趣请看官方Cakephp文档
编程百科
2020-08-27 13:46:52
相关推荐: 基于AJAX的应用程序架构汇总 交流我的Flex心得 RIAMeeting第三次活动记录 weborb .net 配置 flex学习笔记02 - WebORB 使用Flash Builder Data Plugin集成Flex与.NET(WebORB) Flex入门指南—PHP开发者 第3部 AJAX框架汇总
推荐群组: flex
更多相关推荐
PHP weborb为PHP提供了一套灵活的远程执行。用weborb , PHP开发者能整合Flex客户端应用程序与部署在PHP中的对象应用。 此外, weborb为PHP可以作为一个FLASH Remoting的网关,从而支持FLASH客户端应用。本指南提供了一个概述建立一个Flex客户利用Flex Builder的2.0和与之连接的同一个PHP应用。 结果该漫游是一个Flex应用沟通的一个PHP对象暴露透过weborb对于PHP 。 起步-weborb安装 确保下列软件安装在下载weborb对于PHP : PHP5 or Zend Platform with PHP5 support或把php5的Zend平台,把php5支持 Any web server supporting PHP5 or later任何网络服务器支持把php5或更高版本 Flex Builder 创造了一个空的Flex应用。 下面的步骤将指导,通过建立一个Flex应用和连接,它与一个PHP对象。 配置-Flex Builder weborb对PHP产品分布载成品Flex应用演示flex能够weborb连接和远程调用。拷贝和粘贴的内容,该example.mxml文件位于 \Examples\SampleApp\ \实例\ sampleapp \ 进入mxml创建的文件Flex Builder。该守则在应用连接到一个PHP对象,并检索出一些基本的计算机的信息当物体正在运行。 配置-weborb Flex 应用需要申报的暴露班为"目的地" 。 目的地必须被配置在远程- config.xml文件位于\ \Weborb\WEB-INF\flex文件夹。应用在这个例子中使用了" infoservice "目标之定义为: InfoService Flex Builder中读取配置文件,在编译的时候。 重要提醒:当您编译项目在挠性建设者,一定要查找的目录挠性建设者地方编译客户端应用。这是非常重要的地方,一本weborb.php到同一个目录下。 weborb.php必须包含下列PHP代码: processRequest(); ?> 非常重要 :第一线, 必须经过剪辑后,以该点至weborb目录,从产品分布。举例来说,看看weborb.php坐落于 / 控制台文件夹 运行Flex应用 :当你运行该应用程序在Flex建设者时,它会打开一个浏览器和负荷应用: http://localhost/Examples/SampleFlexToPHPProject.html http://localhost/examples/sampleflextophpproject.html 应用连接到后端服务后,启动或当用户点击"发送请求"按钮: 代码审查 Flex应用宣布一项远程对象使用RemoteObject API: remoteObject = new RemoteObject(); remoteObject.destination = "InfoServiceDestination"; remoteObject.getComputerInfo.addEventListener("result", onResult); remoteObject.addEventListener("fault", onFault); 通知目的地的名称相匹配的目的地输入远程- config.xml文件。 当用户点击'获得计算机信息'按钮时,下面的函数执行一个远程方法调用: private function getInfo():void { invokeButton.enabled = false; currentUserText.text = ""; processIdText.text = ""; osText.text = ""; phpVersionText.text = ""; remoteObject.getComputerInfo(); } 当调用响应的情况下,灵活调用响应处理器在标签。 响应处理器在举例中,填充的文本字段与现有的数据,在返回的对象: private function onResult(event:ResultEvent):void { var computerInfo:Object = event.result; currentUserText.text = computerInfo.currentUser; processIdText.text = computerInfo.phpProcessId; osText.text = computerInfo.operatingSystem; phpVersionText.text = computerInfo.phpVersion; invokeButton.enabled = true; } 源代码服务器端的对象是如下: class InfoService { public function getComputerInfo() { $compInfo = new ComputerInfo(); $compInfo->currentUser = get_current_user(); $compInfo->phpProcessId = getmypid(); $compInfo->operatingSystem = php_uname( 'a' ); $compInfo->phpVersion = phpversion(); return $compInfo; } } class ComputerInfo { public $currentUser; public $phpProcessId; public $operatingSystem; public $phpVersion; }
编程百科
2020-08-27 13:46:44
相关推荐: Java为什么不能动态部署,为什么没有PHP/RoR简单 PHP框架的繁荣是正确的发展方向吗? JavaEye网站的RoR性能优化经验谈 LAMP部署-CentOS、Apache、MySQL、PHP配置优化 PHP+Laravel实战博客项目 微信网页授权开发-微信公众号开发10-微信开发php php程序内存优化之数组操作优化 PHP性能优化
推荐群组: D语言
更多相关推荐
PHP 首先我们了解一下我们的php程序是怎样执行的,首先他被编译为中间代码,然后中间代码被送入执行引擎执行,然后销毁。每个请求的中间代码在执行完之后被销毁,这样的好处在于他完全隔离了不同的请求,使内存使用率降低。但是这样的缺点也显而易见,因为他需要再重复请求一个界面的时候对一个代码连续编译两次,编译的中间代码没有一点复用性。我们拿ZPS来说事,看他能提供什么优化功能: 一, 自动优化 ,也就是我们的zend optimizer提供的功能,他可以对中间代码进行优化,这些优化是语言方面的,将效率低的转化为效率高的,但他的优化目标只限定在中间代码,因此不会影响你编写的源代码。这个能提高20%左右的性能。 二, 代码编译缓存 ,就是使中间代码更有复用性。因为他会把中间代码进行缓存,下次使用的时候就不需要编译了,这个有50%到300%的性能提升。 三, 动态内容缓存 ,也就是把php代码执行完之后生成的内容进行缓存,这个适用于幂等的请求,而且请求不会对服务器端的数据造成修改,而只是get数据内容。这个提升效果最大,但对于个性化的界面不太适合,您可以选择使用部分缓存的方式,但明显提高了复杂度。 四, 内容压缩 :他主要是提高HTTP的传输效率,使传输量减少90%左右,但他也有牺牲,就是增加了两端(c/s)的计算量。但ZPS使用对压缩文件也进行缓存的方式来减少压缩所带来的性能影响。 另外就是细节方面的性能考虑: 1.对于require和include: 不是说使用上apc就一劳永逸了。 Include_once(),require_once()比include,require要慢,因此可以考虑将require_once()换成require(). 另外包含一个文件会增加许多内存使用,因此对于大的包含文件你应该考虑如何切割成多个小文件,因为opcode缓存只能优化加载时间,而不会减少内存使用大小。 2.少用define ,在类中使用const变量来代替,因为据说后者可以被opcode缓存,而前者不能。 3.使用C语言。很多人认为“你应该到达不到这种优化需求吧”,但是确实我在写一个推荐系统的时候遇到这个需求,如何在php中使用c来优化性能这个问题留给以后吧,等我研究明白了再贴。 4.使用面向过程代替面向对象。具体原因不知道为什么。另外 http://www.iteye.com/topic/143440 这篇文章中提到的”php的最佳实践就是数组编程”也很有新意,大部分也是基于性能的考虑。 另外一些小的优化技巧,我这里就不说了,看下面链接。 40条优化PHP代码的小提示: http://www.huomo.cn/archives/40_tips_for_optimizing_your_php_code.html php效率优化 http://cnhawkwing.iteye.com/blog/69100
编程百科
2020-08-27 13:46:24
相关推荐: JavaSE6.0 Web Service学习笔记 使用CXF生成的WSDL,如何才能带ws-security5 实战WebService I: XML-PRC篇(基于php) 实战WebService II: SOAP篇(基于php) 主题:实战WebService II: SOAP篇(基于php)
推荐群组: WebServices
更多相关推荐
PHP 概述(SOAP和XML-PRC比较) 在Web服务发展的初期,XML格式化消息的第一个主要用途是,应用于XML-RPC协议,其中RPC代表远程过程调用。在XML远程过程调用 (XML-RPC)中,客户端发送一条特定消息,该消息中必须包括名称、运行服务的程序以及输入参数。   XML-RPC只能使用有限的数据类型种类和一些简单的数据结构。人们认为这个协议还不够强大,于是就出现了SOAP——其最初的定义是简单对象访问协议。之后,大家逐渐意识到SOAP其实并不简单,而且也不需要必须使用面向对象语言,所以,现在人们只是沿用SOAP这个名称而已。   XML-RPC只有简单的数据类型集,取而代之,SOAP是通过利用XML Schema的不断发展来定义数据类型的。同时,SOAP也能够利用XML 命名空间,这是XML-RPC所不需要的。如此一来,SOAP消息的开头部分就可以是任何类型的XML命名空间声明,其代价是在系统之间增加了更多的复杂性和不兼容性。   随着计算机行业的觉醒,人们发现了基于XML的Web服务的商业潜力,于是,各家公司开始不断地发掘想法、观点、论据以及标准化尝试。W3C曾经设法以“Web服务活动”的名义来组织成果展,其中也包括实际做出SOAP的XML协议工作组(XML Protocol Working Group)。与Web服务有关的标准化成果(从某种程度上说与SOAP相关或者依赖于SOAP)的数量已经倍增了到了令人惊讶的程度。   最初,SOAP是作为XML-RPC的扩展而发展起来的,它主要强调的是,通过从WSDL文件中所获得的方法和变量名来进行远程过程调用。现在,通过不断进步,人们发现了更多的使用SOAP的方式,而不仅仅是采用“文件”方式——基本上是使用一个SOAP信封来传送XML格式化文件。无论如何,要掌握SOAP,了解WSDL所扮演的角色是最根本的。 SOAP数据包结构解析 SOAP的消息被称为一个SOAP Envelope,包括SOAP Header和SOAP Body。其中,SOAP Header可以方便的插入各种其它消息来扩充Web Service的功能,比如Security(采用证书访问Web Service),SOAP Body则是具体的消息正文,也就是Marshall后的信息。 SOAP调用的时候,也就是向一个URL(比如 http://api.google.com/search/beta2 )发送HTTP Post报文(根据SOAP规范,HTTP Get报文也可被支持),调用方法的名字在HTTP Request Header SOAP-Action中给出,接下来就是SOAP Envelope了。服务端接到请求,执行计算,将返回结果Marshall成XML,用HTTP返回给客户端。 以下[是移动MISC接入]Wap1.6业务订购数据包样例 MISC1.6的业务订购关系同步的请求包 00110100037392 1.5.0 SyncOrderRelationReq 0 0011 400 0 2 00116000000286 2 00116000000286 SP 1 1 919102 0000000064 2 MISC1.6的业务订购关系同步的响应包: 00110100037392 1.5.0 SyncOrderRelationResp 0 实战SOAPI 现在做SOAP开发一般有三种方式选择 * PEAR自带的soap扩展, * PHP自带的SOAP扩展, * NuSOAP(纯PHP,似乎已经过时) 注:还有WSO2.org(关于WSO2.org可以考虑尝试一下) PHP 5 中新增了内置的 SOAP 扩展,我们称之为 ext/soap。它是作为 PHP 的一部分提供的,因此不需要下载、安装和管理单独的包。这是第一个用 C 而不是 PHP 为 PHP 编写的 SOAP 实现,因此作者声称它的速度要快得多。 因为新的扩展是 PHP 的完整组成部分之一,相关文档包含在 PHP 手册的 Function Reference 部分(php_soap.dll)。 SOAP 参考是以一个重要的免责声明开始的: 警告:该扩展是试验性的(EXPERIMENTAL)。本扩展的行为,包括关于本扩展的函数名和其他内容,在以后的 PHP 版本中随时可能改变,不另行通知。使用该扩展的风险自负。 警告看起来有点让人担心,但实际上这个扩展似乎得到了很好的支持。和任何新代码一样,该扩展也存在缺陷,但是报告的问题通常很快就能得到修正。在 PHP 站点上可以看到缺陷列表。我们估计,在将来的 PHP 版本中,该扩展将从试验性功能转为主流功能 一个访问.NET WEB服务的客户端例子 '12209'); $out=$objSoapClient->ValidateZip($param); $data=$out->ValidateZipResult; echo $data; ?> 运行后输出 在实验的过程当中,使用了一个抓包工具Wireshark来分析报文。Wireshark很不错,在Filter处设置ip.addr == 208.109.78.12(208.109.78.12 是 www.webservicemart.com 的IP),然后启动监控,可以分析上述调用过程中HTTP包是什么样的。 实战SOAPII 用PHP建立SOAP服务 建立soap_server.php(虚拟路径为:http://172.16.0.24/php/soap/soap_server.php) SOAP_1_2)); $server->setClass("math"); $server->handle(); ?> 注意几点:
math类是即将公开的webservice. 注$server→setClass,不是$server→addClass 用PHP客户端访问刚建立SOAP服务 div(8, 2); // will cause a Soap Fault if divide by zero print "The answer is: $result"; } catch(SoapFault $e) { print "Sorry an error was caught executing your request: {$e->getMessage()}"; } ?> 本质上,http://localhost/php/soap/soap_server.php?WSDL就是要访问到注释行所指的wsdl描述文件,所以这个WSDL文件必须事先生成。而对于其他语言如Java则可以动态生成。我目前的学习发现对于php自带的SOAP扩展要求这个WSDL文件必须事先生成好。 可以用ZendStudio生成静态的WSDL文件,此时用到math类的phpdoc作为生成WSDL的元数据。 用ZendStudio生成wsdl文件时,必须正确说明web服务目标地址,片断如下: ... .... 特别注意:我发现调用php webserver的方法和调用.net web服务的方法不一样。 调用.net service方法必须传入命名参数;而调用php web服务方法,一定不能传入命名参数,只能按顺序传入,为什么?这一点尤其要注意
编程百科
2020-08-27 13:46:15
相关推荐: RoR部署方案深度剖析 在lighttpd上安装rails后不能启动了.. 在Ubuntu下安装和配置Rails 3详解 (LightTPD + FastCGI) 追溯fastcgi之历史 PHP及mysql数据库常考面试题集锦 PHP+Apache+MySQL配置过程 PHP 面试总结(持续更新) --小丑 PHP7正式版测试,性能惊艳!
推荐群组: Jetty学习交流
更多相关推荐
PHP 在研究fastcgi的时候,我感觉有必要研究下fastcgi的历史。这样能够对fastcgi把握得更好一些。我想知道,fastcgi只是一个规范,open market提供了这个规范,他对这个规范的支持只是一些书面文件吗?有没有对这个规范进行完全实现?fastcgi是不是他提供的?在提供这个 fastcgi外,还提供了哪些对其他语言的支持?比如c/c++,是吗?他只是提供了一些库,就算对这些语言进行支持了,对吧?但是对于服务器和一些新兴的脚本,他没有提供支持,还需要那些服务器开发者自己编写fastcgi模块以支持fastcgi规范,比如apache和lighttpd的 mod_fastcgi模块,同时php支持者也必须自己开发fastcgi支持程序:php-cgi。是这样的吗?希望跟人探讨,对于这个的理解,能够让我明白fastcgi是如何一步一步开发并进入实用的,进而对fastcgi的基本原理有个全局的把握。
编程百科
2020-08-27 13:45:59
相关推荐: RoR部署方案深度剖析 JavaEye网站的RoR性能优化经验谈 linux上配置lighttpd+PHP+FastCGI实现web与应用分开 Lighttpd 配置fastcgi fastcgi + lighttpd的问题(附文章) lighttpd+fastcgi模块分析 Apache Nginx lighttpd HAProx Litespeed 缓冲原理解析fastcgi性能 Apache、nginx 、lighttpd
推荐群组: Python
更多相关推荐
PHP fastcgi specification:http://docs.google.com/Doc?id=dgf68zg4_224ch7p47dt fastcgi简介: http://docs.google.com/Doc?id=dgf68zg4_226ffwfbvcn lighttpd提供了多服务器之间实行负载均衡的功能,这个和单个服务器的负载均衡相比,优点在哪里? 听说在fastcgi的1.3.14版本之后,adaptive process spawning功能就被取消了?为什么?是因为不稳定吗?lighttpd里面是不是有自带的process management,他能代替它实现相同的功能? fastcgi中的各个role的执行先后顺序是什么? 在filter role的解释中:“The FastCGI application filters the requested Web server file before sending it to the client.”,好像filter是在responder完成之后才执行的,比如对于.php的filter,在responder要将那些php文件发送到客户端之前由这个filter截获进行处理,客户端才能得到动态的页面。是这样的吗? 配置过lighttpd服务器的请问一下,在server的配置中的mode和fastcgi规范里说的role有什么不同?
编程百科
2020-08-27 13:45:44
相关推荐: 与阳光相拥 不会后悔现在的选择! 于北京之我的收获之旅 如果你也23岁(2) 带有Node,React和Redux 1的Retrogames库:服务器API和React前端 转载 ----MAVEN相关学习 Android - 收藏集(全了) 一个程序员的多年珍藏--收藏
推荐群组: IT80后
更多相关推荐
CSS HTML5 岁月,匆匆。白了父辈的发梢,在这岁月失去中,我庆幸来到了这,兄弟连PHP培训学校!每次老爸出门回到家里,总要先问我一句:“我看起来很老么?怎么总有人喊我老人家?”每当这个时候我都笑着说不老,但心中总有种想掉泪的感觉。老爸很早就退了休,但是还是常年在外地打工,只是到过年的时候才回家一次。上学的时候,总是缠着爸爸轻摇着他的手臂,多想他多陪陪我。年少不太懂事的我总是劝他不要出去打工,就说年纪都这么大了,又有退休工资拿,还独自一个人跑外面风吹日晒的图个什么?每当这个时候他总是微笑着摸着我的头,说为了给你攒学费呀。直到后来离开了象牙塔,工作了步入了社会。他还在外面闯,自认懂事了的我拿着同样的问题问他,他还是在回答,为了给你攒买房子的钱呀。但是在笑时,那圈起的皱纹,高起的颧骨刺得我的心都痛!于是也不再劝说,只是在那一刻在发誓,我要努力!努力的让赚钱的速度超过父母衰老的速度!用自己的双手去拼到自己的那一片天空!让父母不再操心,让他们过上他们应该拥有的幸福生活。 这时一个声音自心田响起!我努力的方向在哪里,又该如何去努力呢?我开始不断地问自己。所以在大学的四年中,学习了很多的方向,证书拿了不老少!毕业了,却发现自己陷入了迷茫。什么都只会那么一点,都没有学精,你有能力办到的别人也办的到甚至办的更好,而别人能办到的而你却不一定能办得到。就像名言说的那样机会只给有准备的人,而我一次次被更有准备的人挡在机会的门外。在经历了很多,也思考了很对之后,才明白需要为自己找准一个方向,然后朝着这个方向不断的走下去,哪怕一头撞到南墙也要把南墙撞到。就像那句网络名言,自己选的路跪着,也得走完!在网上看到,兄弟连的变态严管,让你破茧成蝶的广告语!顿时,身子都麻木了,这不就是我想要的吗?于是,我就背着行囊来到了北京,独自一人来到了LAMP兄弟连,在这里开启了为期五个月的php学习。我的那些朋友知道后,就有人问我你一个女生,咋就能对自己这么狠。更提醒我,你应该找个好人家直接嫁了就行了,瞎折腾啥,有瘾啊?这让我也陷入了思考。直到后来李明老师的一句话才让我明白这些问题都是那么的微不足道!我就是要选择自己所爱的,爱自己所选择的! 弹指一瞬间如白驹过隙,我来兄弟连已有一个多月了,这样的一个大家庭氛围里,我不断的朝着好的方向改变着,改掉了很多不好的习惯。以前的自己,懒懒散散,有目标却不去实施,喜欢拖延,有解决不了的问题会搁置,早睡晚起,每天都不知道干了些什么就过去了。现在的自己,每天都会给自己制定学习任务,然后把任务一个个去完成,有了问题,自己解决不了的找老师找同学也要把它解决掉,每天早起晚睡,很清楚的知道自己每天都干了些什么,完成到什么样的一个程度,还有哪些急需解决的问题,还有哪些没有干完的,就像晓光老师学习要形成加速度!以前的自己,周围充斥着抱怨充斥着一些不好的情绪。而现在,在我的周围没有抱怨,只有埋头努力学习,没有负面情绪,全部都是正能量。你失落时,鼓励你,帮助你;你懈怠时,激励你,鞭策你;你得意忘形时,告诫你,提醒你。我相信,四个月后,因为有这些兄弟姐妹们,有这样的师资团队,有这样的一个兄弟连,我能努力地成长成一个更好的让自己满意自己,因为越努力,才会越幸运。 最后用我相信这首歌的歌词作为结束,我相信自己,我相信明天,我相信伸手就能够到天! 兄弟会高洛峰免费收徒:http://www.hdb.com/manage/post_info 免费领取LAMP兄弟连原创PHP视频教程光盘/《细说PHP》精要版,详情咨询官网客服: http://www.lampbrother.net 【兄弟连IT教育】学PHP、Linux、HTML5、UI、Android等视频教程(课件+笔记+视频)! 网盘教程下载:http://pan.baidu.com/s/1mg8ANMg
编程百科
2020-08-27 13:45:28
相关推荐: 最初的梦想 最初的梦想 来兄弟连的点滴—兄弟连IT教育 如果你也23岁(2) IT行业都有哪些职位,初学者(0基础,新人)该如何选择,才能够快速进入这个行业?... IT行业都有哪些职位?工作内容及升职路线 IT行业都有哪些职位 2014年Windows平台软件推荐:神器小工具(骨灰级
推荐群组: 老八婆的八卦堡
更多相关推荐
CSS HTML5 5月09号晚6点,刚跟宿舍的小伙伴打完篮球,穿着湿透了的衣服走在去教室的路上,微风轻轻掠过满是汗水的脸,此时此刻我的心情是那么的平静和舒畅。停下来想想过去,回忆起这两个多月兄弟连生活,渐渐的能感觉的到自己的改变,有种莫名的感动。在我决定来兄弟连之前 ,其实我很犹豫,不知道自己能不能学得会 ,不知道自己有没有勇气走完这段路,不知道还能不能扮演好一个学员的角色,太多的不知道,太多的不确定,太多的不自信。 许多人浪费了整整一生的时间,去等待适合他们心愿的机会 ,不去勇敢的做选择而是去等待和寻找,我不想做这样的人 ,我要紧紧抓住青春的尾巴,做自己想做的事。人们总是害怕改变 ,是因为改变会有陌生而新的开始往往就是陌生的。如果你想拥有从未拥有过的东西,那么你必须去做你从未做过的事情。我明白其中的含义所以来到了兄弟连这个大家庭 ,我为我自己感到高兴,因为我去做了。从现在开始勇敢的把自己交给未知的来。 2014年2月27号,北京终于告别连续十几天的雾霾。记得那天阳光是特别的灿烂,空气也是那么的清新,这天也是我来兄弟连的第一天,心情就像天气一样这么明媚。这就是我新的路程的起点,我对自己说给自己一个承诺,给自己一个坚持,让自己坚定的走下去。 来兄弟连我再也没有像以前在11点之前睡觉,跟以前相比睡眠时间也不充足,而且开始的时候学习节奏就很快,每天要接受新知识的同时还要掌握旧的知识,可能是因为没有完全适应或者从未接触过这方面的知识,所以再学习的过程中有点力不从心,有时候会心灰意冷,学习的脚步也越来越沉重。但是李明老师说过一句话,没有人在走下坡路的时候觉得累,只有处在上坡路的时候才觉得步伐的沉重,只要坚持下去就会到达人生的另一个高度。我觉得这句话说的真的太棒了!每当我抱怨自己为什么会这么笨的时候都会很2的用这句话来安慰自己鼓励自己……现在看来这种阿Q精神效果还不错,至少我没有痛苦的去渡过每一天,反而感觉到一种特别的充实和愉悦,我好像体会到什么样的感觉是才是痛苦并快乐着。 已经渡过两个多月的学习生活,我想我已经完全的融入这个充满正能量的lamp80,在这样的环境中学习某种程度上说是一种享受。同时结识了许多的可爱的小伙伴 ,在学习和生活中我们相互帮助和关心,每当我遇到问题的时候都会去请教一个人,他都会不厌其烦的为我决解问题,也许只有这里才能找得到这种无条件的帮助,才能体会到最纯真的友谊,我觉得这才是我最应该珍惜的。我特别的感谢他(其实就是我的组长),也感谢这个能够给我动力的班级。 在以后的学习的过程中还会遇到各种问题,但是我已经做好准备去解决去克服,我知道往往成功更容易光顾磨难和艰辛,只有经过泥泞的道路才会留下脚印。所以这段5个月的马拉松每一天都是一种坚持与磨练,我不去想我离目标有多远,我只要做好每一天,一步一步的走下去…… 最后我想说的是我很爱这个班级,很爱我们组!希望我们都能用一种愉的心态去面对今后的学习和生活,让我们肩并肩为心中目标一起加油吧! 兄弟会高洛峰免费收徒:http://www.hdb.com/manage/post_info 免费领取LAMP兄弟连原创PHP视频教程光盘/《细说PHP》精要版,详情咨询官网客服: http://www.lampbrother.net 【兄弟连IT教育】学PHP、Linux、HTML5、UI、Android等视频教程(课件+笔记+视频)! 网盘教程下载:http://pan.baidu.com/s/1mg8ANMg
编程百科
2020-08-27 13:45:20
相关推荐: 高洛峰收徒第三期!你值得拥有-兄弟连IT教育 兄弟连IT教育与LUPA签约 开创PHP培训新纪元 兄弟会开创新教育模式,打造高端IT人才培养基地 HTML5+CSS3+JavaScript学习笔记 你需要了解的 Chrome 45 的改变-兄弟连IT教育 Html5、CSS、JavaScript小知识---ios 前端必看的8个HTML+CSS技巧 《Web前端设计与开发》学习笔记(HTML+CSS+JavaScript+HTML5+jQuery)
推荐群组: 电脑DIY
更多相关推荐
JavaScript CSS HTML5 兄弟连IT教育:• 9年培养了近2万名程序员 • 收获了包括竞争对手在内良好口碑 • 成为地球上最大的PHP培训机构 • 对教育有了较为深刻的理解 现在还能干点啥NB的事情呐?——高洛峰收徒第三期! 师徒制 加入【高老师收徒】要拜师,师傅手把手带你。 直到出徒并掌握真正的本领。 没有任何代沟,有困难直接向师傅开口。 你在未来的工作中遇到困难,师傅都会协助你解决。 纯免费 学习不收费,学完也不收费。 真正的一分钱不要,就是这么任性。但也不是谁想来就来的,需通 过严格的测试,才会成为兄弟会的一员。 收徒资格 • 相关工作在一年以上,有一定的技术基础,通过技术测试。 • 精力充沛、脑子清晰、对未来有着强烈渴望。 • 肯吃苦、人品好、服从安排。 • 年龄在20到35岁之间,男女不限,一定要身体健康。 • 学历不限自我管理严格、自学能力强、有灵气。 培养体系 第一阶段:强化技术功底 第二阶段:主攻一个学科 第三阶段:讲师项目OR外包项目 高洛峰收徒第三季 一个免费的高端技术培养基地已经诞生! 只为等你的加入! 兄弟会高洛峰免费收徒:http://www.hdb.com/manage/post_info 免费领取LAMP兄弟连原创PHP视频教程光盘/《细说PHP》精要版,详情咨询官网客服: http://www.lampbrother.net 【兄弟连IT教育】学PHP、Linux、HTML5、UI、Android等视频教程(课件+笔记+视频)! 网盘教程下载:http://pan.baidu.com/s/1mg8ANMg
编程百科
2020-08-27 13:45:06
相关推荐: bootstrap模态弹出框 Bootstrap 教程 介绍一个jQuery的Dialog插件 Bootstrap速成实战 Bootstrap开发框架视频教程 Bootstrap 导入插件 HTML5开发基础培训(包含jquery、css、javascript、bootstrap)
推荐群组: Groovy on Grails
更多相关推荐
JavaScript CSS HTML5 u=2721599714,2937226223&fm=21&gp=0导入JavaScript插件 Bootstrap除了包含丰富的Web组件之外,如前面介绍的下拉菜单、按钮组、导航、分页等。他还包括一些JavaScript的插件。 Bootstrap的JavaScript插件可以单独导入到页面中,也可以一次性导入到页面中。因为在Bootstrap中的JavaScript插件都是依赖于jQuery库,所以不论是单独导入还一次性导入之前必须先导入jQuery库。 一次性导入: Bootstrap提供了一个单一的文件,这个文件包含了Bootstrap的所有JavaScript插件,即bootstrap.js(压缩版本:bootstrap.min.js)。 具体使用如下(或见右侧代码编辑器28-29行): 特别声明:jQuery版本库也可以加载你本地的jQuery版本。 单独导入: 为方便单独导入特效文件,Bootstrap V3.2中提供了12种JavaScript插件,他们分别是: ☑ 动画过渡(Transitions):对应的插件文件“transition.js” ☑ 模态弹窗(Modal):对应的插件文件“modal.js” ☑ 下拉菜单(Dropdown):对应的插件文件“dropdown.js” ☑ 滚动侦测(Scrollspy):对应的插件文件“scrollspy.js” ☑ 选项卡(Tab):对应的插件文件“tab.js” ☑ 提示框(Tooltips):对应的插件文件“tooltop.js” ☑ 弹出框(Popover):对应的插件文件“popover.js” ☑ 警告框(Alert):对应的插件文件“alert.js” ☑ 按钮(Buttons):对应的插件文件“button.js” ☑ 折叠/手风琴(Collapse):对应的插件文件“collapse.js” ☑ 图片轮播Carousel:对应的插件文件“carousel.js” ☑ 自动定位浮标Affix:对应的插件文件“affix.js” 上述单独插件的下载可到github去下载(https://github.com/twbs/bootstrap)。 动画过渡(Transitions) 这一小节我们先来讲“动画过渡(Transitions)”这个插件的使用,源文件:transition.js Bootstrap框架默认给各个组件提供了基本动画的过渡效果,如果要使用,有两种方法: ☑ 调用统一编译的bootstrap.js; ☑ 调用单一的过渡动画的JavaScript插件文件transition.js(右侧第29行引入Bootstrap上对外公布的transition.js的地址)。 transition.js文件为Bootstrap具有过渡动画效果的组件提供了动画过渡效果。不过需要注意的是,这些过渡动画都是采用CSS3来实现的,所以IE6-8浏览器是不具备这些过渡动画效果。 默认情况之下,Bootstrap框架中以下组件使用了过渡动画效果: ☑ 模态弹出窗(Modal)的滑动和渐变效果; ☑ 选项卡(Tab)的渐变效果; ☑ 警告框(Alert)的渐变效果; ☑ 图片轮播(Carousel)的滑动效果。 “模态弹出窗(Modal)的滑动和渐变效果”源代码例子。 导入JavaScript插件
编程百科
2020-08-27 13:44:55
相关推荐: [转载]13个在线web2.0风格生成器 10个顶级的CSS3代码生成器-兄弟连IT教育 你应当了解的几个CSS3新技术 基于HTML5、JavaScript和CSS3的网页开发应用技术的网页 (近万字)一篇文章带你了解HTML5和CSS3开发基础与应用-适合前端面试必备 响应式Web设计:HTML5和CSS3实战(读书笔记) HTML5 + CSS3面试题整理 快速上手Vue(适合懂基础html、css和js的人)
推荐群组: 代码生成器
更多相关推荐
JavaScript CSS HTML5 屏幕快照 2015-11-25 上午8.27.56HTML5和CSS3是一入门就能用的最好的语言,最简单同时也最好的的方式就是直接开始做!那么生成器就在自动生成代码时扮演者重要角色,它们非常适用于那些要做很多重复性工作的开发人员和设计人员,生成器可以帮他们解决这些繁琐的工作。在本文中,我们精心挑选了一些经验丰富开发人员和设计人员常用HTML5、CSS3代码生成器。 HTML5代码生成器 网上有五六种可以生成优质代码的HTML5生成器,其中的真谛是HTML5样板文件,我们不要自以为然的把样板文件当成是生成器,虽说这样,大多数开发者还是把它当作是他们第一个网站的模板。回到主题,要找到一个好的HTML5生成器并不是那么容易的事,因为网上有成千上万的网站提供各种各样的代码生成器。正因为如此,我们经常会被搞的稀里糊涂。不过,我们还是设法找到了一些比较好的生成器在本文中分享给大家。 Shikiryu HTML5生成器 Shikiryu HTML5生成器可以让你为应用程序添加一个中介器,而且很多人都喜欢这么用。你可以在模板里面增加特性和修改布局。事实上,这个是非常实用的。开发人员更钟爱这个生成器,因为相比其他的生成器,这个语义性更强,更易懂。 Initializr生成器 如果你要新建一个以HTML5样板文件为基础的项目,这将是你要开始你项目的好工具。它可以生成一个简洁的可自定义的模板。当你从各式各样的框架和类库中选择或是自定义模板时,模板就会以压缩文件的格式下载下来,然后你就可以拿这些代码来设计你的网站了。 Quackit HTML5生成器 Quackit 不仅可以给你提供一系列的代码,还允许你输入你的所有信息。这对初学者非常有帮助。所以,如果一开始你学的是CSS和HTML,你就可以用这个生成器来简化你的工作任务了。这些生成器可以说是非常棒的,因为它们专注于圆角边框,阴影,颜色渐变以及和html5模板的设计。 Modernizr生成器 Modernizr是一个开源的脚本类库,它可以帮助你建立HTML5和CSS3来使你的网站更强大。这样你就可以创建一些很好的,而且可以完美运行你代码的网站,不管用户用的是什么样的浏览器或是什么样的设备,都能优雅的展现。 CSS 代码生成器 CSS3 Maker 你可以很容易在网上找到这个生成器。一旦你开始用这个生成器,我相信你一定会完全依赖它的。有了它,你可以做很多动画、自定义字体、文本滚动、盒子模型阴影、圆角边框、文字阴影、过渡、渐变等等方面的效果。 me 个人而言,我是很喜欢这个生成器, CSS3.me是由设计师Eric Hoffman设计出来的。它使用起来很简便,是一个轻量级的、个性化而又功能强大的生成器。你可以用它来设置透明度、下拉阴影,改变和设置圆角边框,增加渐变效果等等。 CSS3-Tricks 按钮生成器 这是一个很经典古老的按钮生成器,它是非常线性的,而且没有图形界面。你可以在你的项目中用它来生成没有任何效果的按钮。 图片边框和圆角边框生成器 1.圆角边框生成器(Border-Radius) 这是个非常好的、轻量级的工具,主要拿来设置边角的圆角边框。一旦完成了边角设置,就可以在浏览器上检查你想要包含的前缀,这些都是已经完成了的。是个界面很简洁友好的生成器。 2.图片边框生成器(Border-Image) 假如你要画一个箭头或是一个三角形时,想让生成器把它平铺到你的网站边框或者是元素边框。这是最好用的图片边框生成器,当它要复制图片去找到最合适的边框样式时候。也就是说,届时,你就可以操作设置它的大小、偏移量,可以平铺这张图片等等。开发者经常喜欢拿它来设置背景。 CSS3渐变效果生成器 Color Zilla Gradient 生成器 此编辑器绑定了非常多的特性,用起来也非常容易。你可以单单稍微移动一下画笔就可以观察到他们的变化。它也可以在浏览器上直接使用,非常适合在网页上开发的开发人员和设计人员。 @fontface 生成器 这个生成器可以让你上传网页上的字体或是系统里面的字体。然后生成一个可以拿来用的输出文件。这个生成器给字体属性生成了一个CSS文件,然后字体就可以显示在HTML文件里了。这是一个非常好的检查字体工具,尤其是你没有足够的时间去创建一个使用许多重复性字体的完整的网站时候。 CSS3下拉阴影生成器 Webestools 阴影生成器 如果你想要对下拉阴影效果有更深、更具体的运用,这个生成器是我最强烈推荐的。因为它自带调节栏,外部阴影,内部阴影的设置,还可以设置阴影的颜色,偏移量和很多你意想不到的炫酷效果。 HTML5与CSS3相互协调使用,可以轻松提供给你最好的编码技术。你可能经常要找可以减少你工作量的工具,这样你就可以把更多精力放在主要工作上,就不用花那么多精力在一下繁琐的小事上,像按钮或盒模型的样式。网上有大把你可以用的工具,以上列出的只是最常用的代码生成器。不过,这些工具好不好,就看你对它标准是怎样的了。希望本文对你有意想不到的帮助!
编程百科
2020-08-27 13:44:44
相关推荐: Bootstrap导入JavaScript插件 介绍一个jQuery的Dialog插件 坑爹呀!flex4中的css写法 bootstrap精讲 Bootstrap 模态弹出框(Modals) Bootstrap导入JavaScript插件 Bootstrap基础-模态弹出框 Bootstrap弹出模态框的运用
推荐群组: wicket
更多相关推荐
JavaScript CSS HTML5 这一小节我们先来讲解一个“模态弹出框”,插件的源文件:modal.js。右侧代码编辑器(30行)就是单独引入 bootstrap 中发布出的“modal.js”文件。 样式代码: ☑ LESS版本:modals.less ☑ Sass版本:_modals.scss ☑ 编译后的Bootstrap:对应bootstrap.css文件第5375行~第5496行 在 Bootstrap 框架中把模态弹出框统一称为 Modal。这种弹出框效果在大多数 Web 网站的交互中都可见。比如点击一个按钮弹出一个框,弹出的框可能是一段文件描述,也可能带有按钮操作,也有可能弹出的是一张图片。如下图所示: mii 模态弹出框--结构分析 Bootstrap框架中的模态弹出框,分别运用了“modal”、“modal-dialog”和“modal-content”样式,而弹出窗真正的内容都放置在“modal-content”中,其主要又包括三个部分: ☑ 弹出框头部,一般使用“modal-header”表示,主要包括标题和关闭按钮 ☑ 弹出框主体,一般使用“modal-body”表示,弹出框的主要内容 ☑ 弹出框脚部,一般使用“modal-footer”表示,主要放置操作按钮 模态弹出窗的结构如下: 弹出窗的主体样式实现: 但是对于一个模态弹出窗而言,modal-content才是样式的关键。其主要设置了弹出窗的边框、边距、背景色和阴影等样式。 /*bootstrap.css文件第5412行~第5423行*/ .modal-content { position: relative; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #999; border: 1px solid rgba(0, 0, 0, .2); border-radius: 6px; outline: 0; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); box-shadow: 0 3px 9px rgba(0, 0, 0, .5); } 除此之外,modal-content中的modal-header、modal-body和modal-footer三个部分样式设置: /*bootstrap.css文件第5441行~第5461行*/ .modal-header { min-height: 16.42857143px; padding: 15px; border-bottom: 1px solid #e5e5e5; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.42857143; } .modal-body { position: relative; padding: 15px; } .modal-footer { padding: 15px; text-align: right; border-top: 1px solid #e5e5e5; } 这三个部分主要控制一些间距的样式。而modal-footer都是用来放置按钮,所以底部还对包含的按钮做了一定的样式处理。 /*bootstrap.css文件第5462行~第5471行*/ .modal-footer .btn + .btn { margin-bottom: 0; margin-left: 5px; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } 模态弹出框--实现原理解析(一) 实现原理解析: bootstrap中的“模态弹出框”有以下几个特点: 1、模态弹出窗是固定在浏览器中的。 2、单击右侧全屏按钮,在全屏状态下,模态弹出窗宽度是自适应的,而且modal-dialog水平居中。 3、当浏览器视窗大于768px时,模态弹出窗的宽度为600px。 固定在浏览器(源代码)实现: /*bootstrap.css文件第5379行~第5389行*/ .modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; display: none; overflow: hidden; -webkit-overflow-scrolling: touch; outline: 0; } 水平居中(源代码)实现: /*bootstrap.css文件第5407行~第5411行*/ .modal-dialog { position: relative; width: auto; margin: 10px; } 当浏览器视窗大于768px时,模态弹出窗的宽度为600px(源代码)实现: /*bootstrap.css文件第5479行~第5491行*/ @media (min-width: 768px) { .modal-dialog { width: 600px; margin: 30px auto; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); box-shadow: 0 5px 15px rgba(0, 0, 0, .5); } .modal-sm { width: 300px; } } 模态弹出框--实现原理解析(二) 蒙板样式实现: 大家或许注意到了,在做模态弹出窗时,底部常常会有一个透明的黑色蒙层效果: 在Bootstrap框架中为模态弹出窗也添加了一个这样的蒙层样式“modal-backdrop”,只不过他默认情况下是全屏黑色的: /*bootstrap.css文件第5424行~第5432行*/ .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000; } 同样,给其添加了一个过渡动画,从fade到in,把opacity值从0变成了0.5。上图展示的就是in状态下的效果: /*bootstrap.css文件第5433行~第5440行*/ .modal-backdrop.fade { filter: alpha(opacity=0); opacity: 0; } .modal-backdrop.in { filter: alpha(opacity=50); opacity: .5; } 两种尺寸选择: 除此之外,Bootstrap框架还为模态弹出窗提供了不同尺寸,一个是大尺寸样式“modal-lg”,另一个是小尺寸样式“modal-sm”。其结构上稍做调整:
对于这两种尺寸的模态弹出窗,Bootstrap在媒体查询中做过处理:代码同上见bootstrap.css 模态弹出框--触发模态弹出窗2种方法 众所周知,模态弹出窗在页面加载完成时,是被隐藏在页面中的,只有通过一定的动作(事件)才能触发模态弹出窗的显示。在Bootstrap框架中实现方法有2种,接下来分别来介绍这2种触发模态弹出窗的使用方法。 声明式触发方法: 方法一:模态弹出窗声明,只需要自定义两个必要的属性:data-toggle和data-target(bootstrap中声明式触发方法一般依赖于这些自定义的data-xxx 属性。比如data-toggle="" 或者 data-dismiss="")。例如: 注意以下事项: 1、data-toggle必须设置为modal(toggle中文翻译过来就是触发器); 2、data-target可以设置为CSS的选择符,也可以设置为模态弹出窗的ID值,一般情况设置为模态弹出窗的ID值,因为ID值是唯一的值。 方法二:触发模态弹出窗也可以是一个链接元素,那么可以使用链接元素自带的href属性替代data-target属性,如: 点击我会弹出模态弹出窗 不过建议还是使用统一使用data-target的方式来触发。 模态弹出框--为弹出框增加过度动画效果 为模态弹出框增加过度动画效果: 可通过给“.modal”增加类名“fade”为模态弹出框增加一个过渡动画效果。 源代码实现: /*bootstrap.css文件第5390行~第5402行*/ .modal.fade .modal-dialog { -webkit-transition: -webkit-transform .3s ease-out; -o-transition: -o-transform .3s ease-out; transition: transform .3s ease-out; -webkit-transform: translate3d(0, -25%, 0); -o-transform: translate3d(0, -25%, 0); transform: translate3d(0, -25%, 0); } .modal.in .modal-dialog { -webkit-transform: translate3d(0, 0, 0); -o-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } 模态弹出框--模态弹出窗的使用(data-参数说明) 除了通过data-toggle和data-target来控制模态弹出窗之外,Bootstrap框架针对模态弹出框还提供了其他自定义data-属性,来控制模态弹出窗。比如说:是否有灰色背景modal-backdrop,是否可以按ESC键关闭模态弹出窗。有关于Modal弹出窗自定义属性相关说明如下所示: ssssm avaScript触发方法 除了使用自定义属性触发模态弹出框之外,还可以通过JavaScript方法来触发模态弹出窗。通过给一个元素一个事件,来触发。比如说给一个按钮一个单击事件,然后触发模态弹出窗。如下面的一个简单示例: JavaScript触发的弹出窗代码: $(function(){ $(".btn").click(function(){ $("#mymodal").modal(); }); }); 比如你不想让用户按ESC键关闭模态弹出窗,你就可以这样做: $(function(){ $(".btn").click(function(){ $("#mymodal").modal({ keyboard:false }); }); }); 事件调用方法也非常简单: $('#myModal').on('hidden.bs.modal', function (e) { // 处理代码... })
编程百科
2020-08-27 13:44:33
主题:放言再出重拳整治游戏推送 且看FB如何平衡用户体验与游戏营销
相关推荐: Java游戏现状 【福利】快速开发工具汇总 拥抱HTML5技术大赛报道之HTML5页面手机游戏三年内超越原生应用 HTML5和CSS3 html+css入门 HTML&CSS;实战教程 HTML5 + CSS3 从 0 到 1 实战详解视频教程 HTML5+CSS3速成实战课程【7天学会,上手实战没问题】视频教程
推荐群组: HTML5
更多相关推荐
JavaScript CSS HTML5 据国外媒体Business Insider消息,FaceBook将再出重拳整治平台上游戏滥用分享推送功能影响用户体验的问题。游戏推送影响用户体验的反馈中被提及最多的游戏 据称,FaceBook CEO扎克伯格在访问印度理工学院德里分校期间,收到的最多的反馈就是:推送功能影响了玩家的游戏体验。对此扎克伯格回应:“有一些游戏会让玩家向从没玩过游戏的好友发送邀请,这个设置有些过时了,但我们以前没将关闭这一功能作为紧急的工作。不过,如果玩家们最在意这件事,我们一定会优先处理这个问题,并且尽快解决。” 对于这个问题,FaceBook的发言人也称:“我们一直在设法提升人们在FaceBook上的游戏体验。我们现在正在测试新的游戏推送方式,只将游戏推送给相关的用户。” 利用社交平台进行游戏的推送从而达成病毒式传播效应,一直是很多手机游戏采用的推广方式。这种营销手段对于运营商而言是获取用户的推广方式,对于热衷游戏的玩家来说也是发掘新游戏的一个途径。因此中外概莫能外,在中国大陆,虽然用户用不了FaceBook,但是在微博和微信等社交平台上也是一种常见的游戏推广方式。 但是,用社交网络和朋友一起享受游戏的玩家固然很多,对游戏不“感冒”(或者对某些特定游戏不“感冒”的)的用户数量也不在少数。仅就手机网络部分而言,据数据调研公司艾媒咨询的调查数据显示,2014-2015年度移动APP受欢迎程度如下: 从统计数据可以看出,社交类APP的受欢迎程度最高,达64.1%;而手机游戏的受欢迎度排在第5,为38%。报告同时指出截止2015年第二季度,中国手机网民达到6.57亿人,据此可以推算出在中国大陆的手机网民中喜爱社交类APP的大约有4.2亿,而喜爱手机游戏的用户则大约接近2.5亿。在这2.5亿手机游戏爱好者中,我们假设其中同时也是社交类APP的粉丝也占64%的比例,那么就表明有1.6亿社交APP用户同时也是游戏玩家,而另外还有2.6亿社交APP用户是非游戏用户。在手机游戏运营商眼里,这2.6亿用户是一个待开发的庞大的潜在用户群,因而他们也就成了手机病毒式营销的主要骚扰对象。 显然,一刀切地禁止利用社交平台向好友推送游戏并不是合理的解决方法。毕竟对于平台来说,游戏运营商也是互利共赢的商业伙伴。因此,即使是FaceBook也仅仅是表示“正在测试新的游戏推送方式,只将游戏推送给相关的用户”,而不是把此功能彻底禁止。 要想解决好这个问题,实现社交平台、游戏运营商、用户的三赢,并不是一个简单的问题。首先,为了避免因过分打扰用户而适得其反,游戏运营商应当对此推广手段适当改进,要明白古人所谓“过犹不及”的道理。比如在技术条件许可的前提下可以增加分享者对于对象的限制,实现定向分享,从而减小这一分享行为对于其他不相关用户的打扰。 其次,社交平台则应该更多地考虑普通用户的体验,给予他们对于不希望接受到的信息进行灵活设置屏蔽功能的权限。例如“屏蔽所有游戏推送”、对特定好友开启“屏蔽其推送”等等。同时,作为社交平台生态系统中掌握主动权的运营方,对于利用平台推送功能不顾用户体验进行恶意营销推广的游戏运营商则应予以坚决的惩处,毕竟用户体验在很大程度上决定用户的留存率。在这方面,FaceBook将会如何改进其游戏推送功能,值得国内的社交平台和游戏运营商的共同关注。 本文由9秒原创首发,转载请注明出处。
编程百科
2020-08-27 13:44:14
主题:HTML5 崛起:不再高冷,不再小众
相关推荐: 《html5+css3技术应用》(连载) Flash已死,HTML5当立 拥抱HTML5技术大赛报道之HTML5页面手机游戏三年内超越原生应用 常用的CSS框架 Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】 JavaScript学习笔记 第三记 移动端h5开发相关内容总结(四) 在线小说网站的设计与实现(附源码)
推荐群组: HTML5
更多相关推荐
JavaScript CSS jQuery HTML5 本文作者 史凯尔·辛格(Shikhir Singh)目前就职于 Sencha,担任开发者合作高级经理。今天是万维网联盟(W3C)宣布 HTML5 完成标准制定一周年纪念日,也是互联网和网络程序开发历史上的重要里程碑。过去一年以来,HTML5 得到了迅速普及,越来越多的公司也开始在 HTML5 上为我们开发跨平台网络程序。前不久,亚马逊、Facebook、谷歌和 YouTube 通通从 Adobe Flash 转移到了 HTML5。它们为什么这么做?为什么选择现在? 几年来,数百万的开发者们开始转向 HTML5,以期创造出更符合商业需求、在不同平台和不同屏幕上有着更无缝、更完善的用户体验的网络应用。而到了 2015 年,随着越来越多的公司选择“移动优先”策略,HTML5 也因此引领潮流,开始为众多网络体验丰富的企业级软件保驾护航。 HTML5 的威力逐渐明朗起来。在 2012 年,互联网行业颇具影响力的 Facebook CEO 马克·扎克伯格(Mark Zuckerberg)曾对 HTML5大加批评;但只过了 3 年,他就改变了看法,开始将 HTML5 技术整合进 Facebook 的新鲜事订阅当中。 目前,有三股潮流趋势推动着行业向在线应用和 HTML5 转变: 一、技术创新,最终是顺时而行 业界向 HTML5 的转变,不仅仅是因为这门编程语言本身的连贯表现和功能创新,还要归功于运行网络应用的浏览器的大幅度改进。仅仅几年,浏览器的运行和响应速度就有了显著提升。曾经的浏览器王者——微软 Internet Explorer(IE)风光不再,以谷歌 Chrome 浏览器为代表的后起之秀开始为我们提供一种更快、更高效的浏览体验。随着 Flash 的式微,HTML5 凭借丰富的多媒体兼容性赢得了众多开发者的青睐——只需要借助浏览器的基础功能,用户就能运行网络应用,从此不再需要下载和安装特定插件。 在这个技术创新的十字路口,HTML5 不仅赢得了开发者青睐,还成为众多企业的迫切需求,它的未来之路让我充满希冀和期待。 二、商业公司需要它 商业公司常常面临着巨大压力:它们需要将其复杂先进的网络端和移动端应用推广给顾客;但与此同时,顾客希望这些应用能够兼容多项设备,包括桌面电脑、平板电脑和智能手机。而且不仅是客户对此期望渐升,行业趋势也开始向该方向转变。为了适应行业需求,企业开始关注那些能满足消费者跨平台需求的技术,以期在现在和未来掌握主动。 HTML5 “一次开发,多处兼容”的特性,使得企业能以最小的开发成本,设计、创造和管理更加先进也更加复杂的应用,并且横跨多种平台和设备。 三、开发者离不开它 即使当前的数字开发环境变得越来越复杂和先进,开发团队仍面临着提升应用运行速度的难题。调研机构 StrategyAnalytics 在最近的一次调查中,询问了移动应用开发者的使用偏好和他们对于应用开发的态度。研究者发现,上述难题也是开发者选择 HTML5 的主要原因。此外他们还发现,在所有开发原生和网络应用的技术中,20% 的受访者认为 HTML5 将迎来强劲增长,还有 63% 的企业应用是通过 HTML5 开发而来。 对于开发者而言,HTML5 的关键吸引力在于其开放的标准支持,这有助于他们为碎片化的移动设备、不同的屏幕尺寸、差异化的平台和操作系统开发应用。开发者们可以使用 HTML5 创建和呈现不依赖于操作系统或设备的富内容,这不失是原生应用的不错替代。 如果可以选择,开发者们都更倾向于选择支持跨平台特性的编程语言——这样既能保证不同尺寸屏幕上的用户体验质量,也能够让他们在不同雇主和不同发开需求前保证自己的竞争力。开发网络应用潮流,将促使更多的 JavaScript 程序员转向使用 HTML5。 HTML5:展望 2016 作为与开发团队一起于前线打拼多年的人,我被 HTML5 和它对移动应用革命性的影响力所深深打动。在这个技术创新的十字路口,HTML5 不仅赢得了开发者青睐,还成为众多企业的迫切需求,它的未来之路让我充满希冀和期待。 明年,我相信 HTML5 将会更加普及。因为越来越多的企业开始放弃使用 Internet Explorer,在工作中转而使用 Chrome 和 Firefox——后两者对 HTML 5 都有着更好支持。并且随着 Windows 10 的采用率增长,其搭载的 Microsoft Edge 浏览器也将为企业用户更好地享受 HTML5 带去便利。
编程百科
2020-08-27 13:44:04
主题:使用wilddog服务生成数据并且查询(内附代码)
相关推荐: 朦胧的背景(含代码) 变形金刚的能量方块(含代码) 按钮开门效果(含代码) 使用wilddog服务生成数据并且查询(内附代码) 使用reveal.js和wilddog实现移动端控制web端PPT展示 前端发展史 借助HBuilder快速开发APP入门 项目中Android与Js交互
推荐群组: EXT
更多相关推荐
JavaScript CSS jQuery HTML5
今天我们来介绍如何 使用wilddog服务生成数据并且查询
使用国内的Baas服务wilddog(野狗)实现后台数据管理和生成
 
HTML部分:
写道






 
CSS部分:
 
写道
 
/*CSS源代码*/
body{
background:#fff;
color: green;
}
 
JS部分:
这个部分代码有点多,试了几次,格局都是乱的,强迫症表示忍不了,请前往以下地址自行观看:
http://www.gbtags.com/gb/rtreplayerpreview/1924.htm
 
via 极客标签
编程百科
2020-08-27 13:43:48
主题:几个炫酷的3D旋转动态效果(附代码)
相关推荐: 极客标签前端特效资源精品大荟萃#003 近期前端特效资源精品大荟萃#001 jQuery,Html5前端特效资源精品大荟萃#001 JS、JQuery、CSS+DIV实例大全 几个炫酷的3D旋转动态效果(附代码) 前端面试题(一) JS、JQuery、CSS+DIV实例大全part1(共两卷此卷为part1) HTML5 实现小车动画效果(Canvas/CSS3/JQuery)
推荐群组: 电脑DIY
更多相关推荐
JavaScript CSS jQuery HTML5
  之前,我们发布了极客编程挑战赛,竞赛题目是“制作炫酷的3D旋转动态显示效果”,想知道更多信息,请前往以下地址进行了解: http://www.gbtags.com/gb/share/9290.htm
 
有没有感觉很精彩呢?接下来,我们来总结一下此次竞赛的优秀作品,看大神们是如何实现3D旋转效果的:
1、 纯CSS3制作的3D旋转海报
     代码地址: http://www.gbtags.com/gb/rtreplayerpreview/1906.htm
2、 CSS3旋转八卦图
    代码地址: http://www.gbtags.com/gb/rtreplayerpreview/1907.htm
3、 纯CSS3实现3D旋转效果
     代码地址: http://www.gbtags.com/gb/rtreplayerpreview/1910.htm
4、 正八面体的立体旋转效果
      代码地址: http://www.gbtags.com/gb/rtreplayerpreview/1912.htm
5、 3D旋转动态显示登录注册
      代码地址: http://www.gbtags.com/gb/rtreplayerpreview/1921.htm 纯CSS3制作的3D旋转海报 本期挑战 :
发挥想象,制作炫酷的3D旋转动态显示效果。据说旋转内容包含“创客贴”三个字,容易获得更多点赞哦~
以下为某浏览器Mac版的页面显示效果,可以作为效果参考。
  赞助商[创客贴]介绍: 创客贴一款简单易用、功能强大的在线设计工具平台,平台提供海量的摄影图片、矢量图形、字体、模板板式等,用户只需要通过简单的拖拽操作就可以简单快速的制作出精美的设计图片,例如海报、banner图、信息图表、ppt、社交图片等,解决了现有ps等大型软件操作繁杂、技能要求高、下载安装等问题,受到大量用户的喜爱。
官网链接: www.chuangkit.com
 
本期礼品:
感谢创客贴提供的精美礼品,本周礼品共有十份。由点赞数前十的参赛者获得~ 
程序员必备用书,5本。
创客贴吉祥物抱枕,5个。
(1)jQuery技术内幕:深入解析jQuery架构设计与实现原理   (1本)
  
 
(2)JavaScript框架设计 司徒正美著9787115343581           (1本)
 
(3)HTML5与CSS3基础教程(第8版)
 
 
(4)高性能网站建设进阶指南-web开发者性能优化最佳实践
 
 
(5)实用脊椎病康复指南,中西医结合康复指导书 (程序员必备)
 
(6)创客贴玩偶*5
 
 
 
编程百科
2020-08-27 13:43:42
主题:标题列表的截取和样式定义
只可惜text-overflow 只有IE支持。似乎有可能在CSS3成为标准。http://www.css3.info/preview/text-overflow/
编程百科
2020-08-27 13:43:16
主题:关于offsetTop的疑问
IE中你改div的border设为1,padding设为10pxoffsetTop应该就是10了firefox与ie的处理方式不同,offsetTop取得的是相对body的 css不用单独搞,多积累些就ok了 offsetTop不是css相关,是DOM的知识了
编程百科
2020-08-27 13:43:06
主题:分享PHP中的10个实用函数
相关推荐: PHP常用函数【上】 PHP函数式编程特性探讨 Aptana Rails IDE可用了 php中curl扩展的安装及post简单使用 PHP函数视频教程(LAMP兄弟连原创) 纵观PHP这十年发展,就算兄弟连倒闭也不能阻止它正在强大 PHP的函数基础知识 分享PHP中的10个实用函数 兄弟连新版PHP视频教程(共346讲)
推荐群组: emacs
更多相关推荐
PHP 兄弟连 PHP函数 分享PHP中的10个实用函数PHP的功能越来越强大,里面有着非常丰富的内置函数。资深的PHP程序员对它们可能都很熟悉,但很多参加PHP培训的PHP初学者,仍然对一些非常有用的函数不太熟悉。这篇摘自兄弟连的文章里,我们就列举10个你或许不了解但实用的PHP函数,供大家参考和学习。 1. php_check_syntax 这个函数可以用来检查特定文件中的PHP语法是否正确。 使用方法: 2. highlight_string 当你想要把PHP代码显示到页面上时,highlight_string()函数就会非常有用,它可以用内置定义的语法高亮颜色把你提供的PHP代码高亮显示。这个函数有两个参数,第一个参数是要被突出显示的字符串。第二个参数如果设置成TRUE,就会把高亮后的代码返回。 使用方法: '); ?> 3. show_source 这个函数的运行和highlight_file()相似,它可以显示PHP语法高亮后的文件,并且是根据HTML标签进行语法高亮的。 使用方法: 4. php_strip_whitespace 这个函数跟上面的show_source()函数相似,但它会删除文件里的注释和空格符。 使用方法: 5. _halt_compiler 它可以中止编译器的执行,这对于在PHP脚本中嵌入数据是很有帮助的,就像安装文件一样。 使用方法: 6. highlight_file 这是一个非常有用的PHP函数,它能返回指定的PHP文件,并按照语法高亮突出显示文件内容。 使用方法: 7. ignore_user_abort 利用这个函数,用户可以拒绝浏览器端终止执行脚本的请求。正常情况下客户端的退出会导致服务器端脚本的停止运行。 使用方法: 8. str_word_count 这个函数可以用来统计字符串中单词的数量。 使用方法: 9. get_defined_vars 这个函数在代码调试时十分重要,它会返回一个包括所有已定义的变量的多维数组。 使用方法: 10. get_browser 这个函数检查并读取browscap.ini文件,返回浏览器兼容信息。 使用方法:
编程百科
2020-08-27 13:42:48
主题:2016最热门的PHP框架
相关推荐: PHP框架的繁荣是正确的发展方向吗? 6个创建Web应用程序的高效PHP框架 使用zend框架,就象找到了党组织 最佳PHP,HTML5和CSS框架大荟萃之一 PHP框架 从此不求人:自主研发一套PHP前端开发框架 Yii2.0 PHP框架 PHP+Laravel实战博客项目 Laravel框架基础到项目实战 完整版 PHP面向对象设计模式
推荐群组: Groovy on Grails
更多相关推荐
PHP 许多PHP开发者选择PHP框架,就是因为在PHP框架中为你的应用已经提供了精准的目录和环境,便于快捷开发。这也是一个开发高扩展性和高质量网页的最佳实践。在过去几年中,Lavarel有很明显的优势一直处在最热门PHP框架的冠军位置,同样在2016年也是如此。现在我们也越来越多讲开发逻辑转移到前端,后端只是作为一个API。然而,学习一个全栈框架是仍然有必要的。但是在众多框架中,你如何挑选一款最适合你自己的呢?所以让我们坐下来,看看这篇文章,找到属于你自己的PHP框架。那么小编就和大家一起盘点一下2016最热门的PHP框架。 Laravel 就如谷歌热门趋势表所展现的,Laravel一直是PHP开发者最受欢迎的PHP框架。这是一个年轻的框架,但是拥有优雅的语法,可简单快速开发你的应用。它拥有大多数常见的功能,如:路由,身份验证,会话,队列和缓存。 CodeIgniter 排名第二的是CodeIgniter。它是一个轻量级的PHP框架,提供了简单而精致的平台来开发你的的Web应用程序。但是使得CI排名第二的最重要的原因就是CI并没有提供足够的安全防护,所以这并不是我们选择框架的首选。 Yii 2 一个基于DRY (Don’t Repeat Yourself) 理念的,拥有简洁编程逻辑的纯面向对象框架。Yii2中整合了jQuery还有一套完整的AJAX机制可以使得很好的扩展你的皮肤和主题功能。总的来说,Yii2框架对于前端转后端的开发者来说很友好。 CakePHP CakePHP同样是一款受PHP开发者欢迎的框架,因为它轻量级、简单、反应迅速并且编写简单。它的模板简单易用。CakePHP基于“CRUD”,这是在数据库交互最方便以及最流行的功能方式。CakePHP还有用像:安全验证、邮件、会话、cookie和请求处理这些功能。CakePHP最大的缺点就是没有支持面向对象。 Symfony2 Symfony一直是PHP开发者稳定使用的框架之一。它非常灵活并且功能强大。Symfony有很多可以复用的部分比如:安全、模板、转义、验证、表单配置等。 ? 总结 这就是现在最流行的5款PHP框架。上面的5款框架都可以作为PHP开发公司的首选。如果要问我会选择哪一个框架,我觉得我会说是Lavarel。因为它上手容易,文档也完整。但如果你仅仅是看代码也很容易上手。当然你要选择最适合你的框架来进行开发
编程百科
2020-08-27 13:42:40
主题:[HTML/CSS]关于兼容IE 火狐 google 等一系列浏览器的代码
相关推荐: [CSS HACK]IE6、IE7、IE8、Firefox兼容性问题 FF、IE7、IE6的CSS问题 IE css hack汇总 CSS Hack 浏览器兼容写法 用法 在不同的浏览器使用不同的css样式,解决浏览器兼容问题 自己总结的html+css试题 CSS/CSS3常用样式与web移动端资源 某Java大佬在地表最强Java企业(阿里)面试总结
推荐群组: HTML5
更多相关推荐
PHP 想必做网页设计的盆友们对各个浏览器的兼容问题很头疼吧 特别是可恶的IE家庭,强大的BUG之国 带给网页设计师们的是伤不起啊,由于不同的浏览器对CSS的支持及解析结果不一样,还由于CSS中的优先级的关系。我们就可以根据这个来针对不同的浏览器来写不同的CSS。  CSS Hack大致有3种表现形式,CSS类内部Hack、选择器Hack以及HTML头部引用(if IE)Hack,CSS Hack主要针对IE浏览器。    类内部Hack:比如 IE6能识别下划线"_"和星号" * ",IE7能识别星号" * ",但不能识别下划线"_",而firefox两个都不能认识。等等    选择器Hack:比如 IE6能识别*html .class{},IE7能识别*+html .class{}或者*:first-child+html .class{}。等等    HTML头部引用(if IE)Hack:针对所有IE:,针对IE6及以下版本:,这类Hack不仅对CSS生效,对写在判断语句里面的所有代码都会生效。    书写顺序,一般是将识别能力强的浏览器的CSS写在后面。下面如何写里面说得更详细些。编辑本段如何写CSS Hack   比如要分辨IE6和firefox两种浏览器,可以这样写:       我在IE6中看到是红色的,在firefox中看到是绿色的。    解释一下:    上面的css在firefox中,它是认识不了后面的那个带星号的东东是什么的,于是将它过滤掉,不予理睬,解析得到的结果 是:div{background:green},于是理所当然这个div的背景是绿色的。    在IE6中呢,它两个background都能识别出来,它解析得到的结果是:div{background:green;background:red;}, 于是根据优先级别,处在后面的red的优先级高,于是当然这个div的背景颜色就是红色的了。    CSS hack:区分IE6,IE7,firefox    区别不同浏览器,CSS hack写法:    区别IE6与FF:   background:orange;*background:blue;    区别IE6与IE7:   background:green !important;background:blue;    区别IE7与FF:   background:orange; *background:green;    区别FF,IE7,IE6:   background:orange;*background:green;_background:blue;   background:orange;*background:green !important;*background:blue;    注:IE都能识别*;标准浏览器(如FF)不能识别*;   IE6能识别*,某些情况下不能识别 !important,    -----------------------------------------------------------------------------------------------    IE6支持重定义中的!important,例如:   .yuanxin {color:#e00!important;}   .yuanxin {color:#000;}    你将会发现定义了样式class="yuanxin"时,在IE下,字体显示为红色(#e00)。    但不支持同一定义中的!important。例如:   .yuanxin {color:#e00!important;color:#000}    此时在IE6下不支持,你将会发现定义了样式class="yuanxin"时,字体显示为黑色(#000)。    不包括如下这种形式的同一定义中的!important。   #pageOver{height:expression(document.documentElement.offsetHeight)!important;   height:100%;}此种形式的定义, IE6中是可以解释到important的。    -----------------------------------------------------------------------------------------------    IE6 IE7能识别*,也能识别!important;   FF不能识别*,但能识别!important;    IE6 IE7 FF   * √ √ ×   !important √   √ √    浏览器优先级别:FF
编程百科
2020-08-27 13:42:32
相关推荐: PHP常用函数【上】 PHP函数式编程特性探讨 Aptana Rails IDE可用了 php中curl扩展的安装及post简单使用 从此不求人:自主研发一套PHP前端开发框架 PHP中的10个实用函数 常用PHP5函数小全 超实用PHP函数总结整理 实用的php封装函数
推荐群组: emacs
更多相关推荐
PHP PHP的功能越来越强大,里面有着非常丰富的内置函数。资深的PHP程序员对它们可能都很熟悉,但很多参加PHP培训的PHP初学者,仍然对一些非常有用的函数不太熟悉。这篇文章里,我们就列举10个你或许不了解但实用的PHP函数,供大家参考和学习。 1. php_check_syntax 这个函数可以用来检查特定文件中的PHP语法是否正确。 使用方法: 2. highlight_string 当你想要把PHP代码显示到页面上时,highlight_string()函数就会非常有用,它可以用内置定义的语法高亮颜色把你提供的PHP代码高亮显示。这个函数有两个参数,第一个参数是要被突出显示的字符串。第二个参数如果设置成TRUE,就会把高亮后的代码返回。 使用方法: '); ?> 3. show_source 这个函数的运行和highlight_file()相似,它可以显示PHP语法高亮后的文件,并且是根据HTML标签进行语法高亮的。 使用方法: 4. php_strip_whitespace 这个函数跟上面的show_source()函数相似,但它会删除文件里的注释和空格符。 使用方法: 5. _halt_compiler 它可以中止编译器的执行,这对于在PHP脚本中嵌入数据是很有帮助的,就像安装文件一样。 使用方法: 6. highlight_file 这是一个非常有用的PHP函数,它能返回指定的PHP文件,并按照语法高亮突出显示文件内容。 使用方法: 7. ignore_user_abort 利用这个函数,用户可以拒绝浏览器端终止执行脚本的请求。正常情况下客户端的退出会导致服务器端脚本的停止运行。 使用方法: 8. str_word_count 这个函数可以用来统计字符串中单词的数量。 使用方法: 9. get_defined_vars 这个函数在代码调试时十分重要,它会返回一个包括所有已定义的变量的多维数组。 使用方法: 10. get_browser 这个函数检查并读取browscap.ini文件,返回浏览器兼容信息。 使用方法:
编程百科
2020-08-27 13:42:25
相关推荐: PHP开发Windows桌面应用程序实例 php 调试相关 共享安装 cacti 过程中的一些经历 cacti 中文-linux - sun solaris 写个日志封装器....感觉用起来很爽 PHP和MySQL中如何进行错误处理与调试 php错误处理与调试 PHP错误调试 PHP和mysql使用过程的调试的一点点技巧 PHP的MySQL扩展:PHP访问MySQL的常用扩展函数
推荐群组: sakai
更多相关推荐
PHP 1,错误类型:HTML问题; PHP问题; SQL问题; MYSQL问题; PHP错误一般归属于三个领域:语法错误; 运行时错误; 逻辑错误; SQL错误通常出现在语法上。 2,基本调试步骤: 保证头脑清醒; 确保运行正确的页面;确保保存了最近的更改;确保通过URL运行了所有PHP页面; 知道运行的PHP和MYSQL版本;知道正在运行什么WEB服务器; 尝试在不同的WEB浏览器中执行页面;尝试使用不同的WEB服务器执行页面; 3,调试HTML:检查源代码;使用验证工具(例如http://validator.w3.org)给表格添加边框;使用firefox的web developer构件;换不同的浏览器测试页面; 4,显示PHP错误 A,打开display_errors: 修改php.ini, display_errors = on; 或在脚本中加入:ini_set('display_errors', 1); 或: 或@运算符抑制单个错误; 或创建自己的错误处理程序: or die(''); /exit() 5,调试脚本 打开display_errors; 使用注释; 调用print()和echo(); 检查使用什么引号来打印变量; 跟踪变量; 打印数组值; 6,调试SQL问题 在PHP脚本中打印出任何适用的查询; echo $query; 在MYSQL或其他工具中运行查询; 以最基本的形式重写查询,然后向其中添加回各个元素,直到你发现哪个子句正在引发问题;
编程百科
2020-08-27 13:42:16
相关推荐: CodeIgniter与jQuery.Uploadify的结合 PHP常用函数【上】 写个日志封装器....感觉用起来很爽 PHP函数式编程特性探讨 PHP7自定义函数 PHP7文件目录函数库实战 从此不求人:自主研发一套PHP前端开发框架 【中国PHP教育大牛高洛峰】亲授php教程 C++socket网络编程--http服务器(支持php)实战教学视频
推荐群组: emacs
更多相关推荐
PHP php开发 PHP函数 PHP的功能越来越强大,里面有着非常丰富的内置函数。资深的PHP程序员对它们可能都很熟悉,但很多参加PHP培训的PHP初学者,仍然对一些非常有用的函数不太熟悉。这篇文章里,我们就列举10个你或许不了解但实用的PHP函数,供大家参考和学习。1. php_check_syntax 这个函数可以用来检查特定文件中的PHP语法是否正确。 使用方法: <?php $error_message = ""; $filename = "./php_script.php"; if(!php_check_syntax($filename, &$error_message)) { echo "Errors were found in the file $filename: $error_message"; } else { echo "The file $filename contained no syntax errors"; } ?> 2. highlight_string 当你想要把PHP代码显示到页面上时,highlight_string()函数就会非常有用,它可以用内置定义的语法高亮颜色把你提供的PHP代码高亮显示。这个函数有两个参数,第一个参数是要被突出显示的字符串。第二个参数如果设置成TRUE,就会把高亮后的代码返回。 使用方法: <?php highlight_string(' <?php phpinfo(); ?>'); ?> 3. show_source 这个函数的运行和highlight_file()相似,它可以显示PHP语法高亮后的文件,并且是根据HTML标签进行语法高亮的。 使用方法: <?php show_source("php_script.php"); ?> 4. php_strip_whitespace 这个函数跟上面的show_source()函数相似,但它会删除文件里的注释和空格符。 使用方法: <?php echo php_strip_whitespace("php_script.php"); ?> 5. _halt_compiler 它可以中止编译器的执行,这对于在PHP脚本中嵌入数据是很有帮助的,就像安装文件一样。 使用方法: <?php $fp = fopen(__FILE__, 'r'); fseek($fp, __COMPILER_HALT_OFFSET__); var_dump(stream_get_contents($fp)); // the end of the script execution __halt_compiler(); ?> 6. highlight_file 这是一个非常有用的PHP函数,它能返回指定的PHP文件,并按照语法高亮突出显示文件内容。 使用方法: <?php highlight_file("php_script.php"); ?> 7. ignore_user_abort 利用这个函数,用户可以拒绝浏览器端终止执行脚本的请求。正常情况下客户端的退出会导致服务器端脚本的停止运行。 使用方法: <?php ignore_user_abort(); ?> 8. str_word_count 这个函数可以用来统计字符串中单词的数量。 使用方法: <?php echo str_word_count("Hello How Are You!"); ?> 9. get_defined_vars 这个函数在代码调试时十分重要,它会返回一个包括所有已定义的变量的多维数组。 使用方法: <?php print_r(get_defined_vars()); ?> 10. get_browser 这个函数检查并读取browscap.ini文件,返回浏览器兼容信息。 使用方法: <?php echo $_SERVER['HTTP_USER_AGENT']; $browser = get_browser(); print_r($browser); ?>
编程百科
2020-08-27 13:42:06
相关推荐: 手机网站开发的一些总结 JSP开发 wap页面编码问题 WAP现状 各个手机平台对JSR规范支持大全 nokia 一部分 让你的博客支持手机等移动终端浏览器的访问 手机淘宝列表页面 的js调用展示 提权学习笔记 Kali Linux Web 渗透测试秘籍 第九章 客户端攻击和社会工程 Linux 就该这么学
推荐群组: 高级语言虚拟机
更多相关推荐
PHP 0) { // Check whether the browser/gateway says it accepts WML. $br = "WML"; } else { $browser = isset($_SERVER['HTTP_USER_AGENT']) ? trim($_SERVER['HTTP_USER_AGENT']) : ''; if(empty($browser)) return true; $mobile_os_list=array('Google Wireless Transcoder','Windows CE','WindowsCE','Symbian','Android','armv6l','armv5','Mobile','CentOS','mowser','AvantGo','Opera Mobi','J2ME/MIDP','Smartphone','Go.Web','Palm','iPAQ'); $mobile_token_list=array('Profile/MIDP','Configuration/CLDC-','160×160','176×220','240×240','240×320','320×240','UP.Browser','UP.Link','SymbianOS','PalmOS','PocketPC','SonyEricsson','Nokia','BlackBerry','Vodafone','BenQ','Novarra-Vision','Iris','NetFront','HTC_','Xda_','SAMSUNG-SGH','Wapaka','DoCoMo','iPhone','iPod'); $found_mobile=checkSubstrs($mobile_os_list,$browser) || checkSubstrs($mobile_token_list,$browser); if($found_mobile) $br ="WML"; else $br = "WWW"; } if($br == "WML") { return true; } else { return false; } } function checkSubstrs($list,$str){ $flag = false; for($i=0;$i 0){ $flag = true; break; } } return $flag; } if(check_wap()){ echo "wap"; }else{ echo "web"; } ?> 无兄弟 不编程
编程百科
2020-08-27 13:42:00
相关推荐: 53个要点提高PHP编程效率 53个要点提高PHP编程效率. 良好的书写规范提高PHP代码执行效率【上】 良好的书写规范提高PHP代码执行效率【下】 PHP提高编程效率的50个方法 提升PHP编程效率的20个要素 21天通关Python(仅视频课) 学习MySQL这一篇就够了
推荐群组: javascript研究小组
更多相关推荐
编程 PHP 方法 提升PHP编程效率的20个要素用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(兄弟连PHP编程:PHP手册中说echo是语言结构,不是真正的函数,故把函数加 上了双引号)。   1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。 2、$row[’id’] 的速度是$row[id]的7倍。   3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。   4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。   5、注销那些不用的变量尤其是大数组,以便释放内存。   6、尽量避免使用__get,__set,__autoload。   7、require_once()代价昂贵。   8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。   9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。   10、函数代替正则表达式完成相同功能。   11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。   12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。   13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。   14、用@屏蔽错误消息的做法非常低效,极其低效。   15、打开apache的mod_deflate模块,可以提高网页的浏览速度。   16、数据库连接当使用完毕时应关掉,不要用长连接。   17、错误消息代价昂贵。   18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。   19、递增一个全局变量要比递增一个局部变量慢2倍。   20、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。
编程百科
2020-08-27 13:41:55
相关推荐: java代码转PHP代码,高手进 javascript基础知识大集锦(2) [Python]华为面试题,交换两个数组的元素使之总和的差值最小。 冒泡,选择,插入排序 利用php数组函数做关联表的编辑 PHP数组函数详解大全 php常用数组函数总结 php中数组函数的应用 PHP返回json数组时索引数组变成关联数组的处理
推荐群组: D语言
更多相关推荐
PHP 需求为,在创建学校时,需要添加应用,于是创建了个学校应用关联表,编辑学校并提交时,后台需要判断更新的应用是否为一开始提交的,或是有新的应用提交,有旧的应用删除,简化为数组概括如下 $arr1 = array(1, 2, 4, 5, 6, 9); // 学校应用关联表中一开始的数据 $arr2 = array(3, 4, 5, 7, ; // 前台更新的数据 /* 两个数组相同的元素,提取不变的元素 Array ( [2] => 4 [3] => 5 ) */ $arr3 = array_intersect($arr1, $arr2); print_r($arr3); /* 两个数组不同的元素,需要删除的 Array ( [0] => 1 [1] => 2 [4] => 6 [5] => 9 ) */ $arr4 = array_diff($arr1, $arr3); print_r($arr4); /* 两个数组不同的元素,需要添加的 Array ( [0] => 3 [3] => 7 [4] => 8 ) */ $arr5 = array_diff($arr2, $arr3); print_r($arr5); 无兄弟 不编程
编程百科
2020-08-27 13:41:50
相关推荐: [面试题讨论]有没有比对象更细粒度的缓存 肤浅理解hibernate缓存 hibernate二级缓存攻略 论缓存之第一<道> PHP 性能 优化 缓存 PHP框架的认识误区 PHP框架的认识误区 各种缓存介绍 简单说说PHP优化(值得一看)
推荐群组: Hibernate
更多相关推荐
PHP 在日常工作中,开发者经常利用缓存来进行优化站点或优化应用程序。但在实际应用中,在使用缓存时,总是那么不尽如意。这什么原因呢?本文,笔者收集了最为常见的十大缓存误区以及使用建议。我们一起来看下 :http://www.lampbrother.net/ 1. 依赖默认的序列化。 默认的序列化处理方式可能会消耗大量的CPU资源,特别是处理复杂类型数据时。所以建议要根据语音和环境的不同,采用最优化的序列化和反序列化方式。 2. 在单一缓存中存储大对象数据。 由于序列化和反序列化需要一定的资源开销,处于并发负载时,大对象图形数据的频繁读取有可能会让服务器的CPU崩溃。相反,不妨考虑把大对象数据打散为较小的子对象,之后再各自进行缓存。根据你的需求读取最小的数据单元。 3. 在不同进程间使用缓存共享对象。 出现竞态条件(Race conditions)时,当写进程也参与其中,同时刚好程序的某部分也访问同一缓冲对象,情况会变得更坏。采取外部锁机制是有必要的。 4. 储存数据后立马进行缓存。 千万不要仓促行事,即使是刚写入不久,当存储资源紧张时,一个缓存足以阻碍程序运行。所以用代码来进行缓存空值返回检查是很有必要的。 5. 使用嵌套对象存储全集合。 由于序列化的影响,执行一次全集合存储会导致程序运行变慢。有鉴于此,单独对独立对象进行缓存可以实现分开读取,减少序列化影响。 6. 对父子对象采取统一与单独混用的存储方式。 有时候一个对象可能拥有两个或更多的父对象。根据统一对象本身的键进行缓存以便不会把同一对象存储于不同地方,这样父对象可以按需访问子对象。 7. 对配置信息进行缓存。 使用进程的本地静态变量来存储配置数据。缓存数据访问是有代价的,所以要尽可能把影响减到最低。 8. 对活性对象进行缓存,例如:流,文件,注册信息或者网络。 不要尝试对上述等包含引用信息的活性对象进行缓存。因为当缓存数据被删除后,之前缓存的活性对象不会被删除,这样会造成系统资源泄漏。 9. 对同一对象采取多键存储。 这样或许在使用一个键和索引号来进行访问时带来便利。如果一个缓存是in-memory的,这样做是可行的,因为缓存中包含了同一对象的引用信息,也就是说一旦该对象发生变更,都可以透过两边的访问路径进行查看。如果是远程(外部)缓存,任何变更的发生都是不可见的,所以这样会导致同步问题的产生。 10.在连续存储中进行更新或删除后没有及时更新相应缓存对象。 在一个远程缓存中,数据以拷贝方式存储,所以当更新对象时,缓存不会被同步更新。缓存必须被明确指定,才能根据变更而进行更新。在in-memory缓存中,一个对象发生的变更是对所有人可见的。在删除时情况类似,删除一个对象时,在缓存中不会被同步删除。这取决于程序本身如何确保缓存对象被正确删除。
编程百科
2020-08-27 13:41:43
相关推荐: gb2312编码转化utf8的输出不正常 用ruby实现简体中文和繁体中文的相互转化 被rails文件上传文件名搞疯了,实在没法来! PHP中文乱码解决办法 php读取目录中文文件名乱码解决方法 PHP导出文件名乱码解决 PHP 生成中文文件名乱码 解决php保存文件时文件名乱码问题 PHP解决文件名乱码问题
推荐群组: D语言
更多相关推荐
PHP 想必很多朋友在进行utf8编码的php开发上传功能的时候,都会遇到这样的一个问题,就是上传中文文件名的文件时,文件名会变成乱码,其实我们可以用iconv函数对文件名进行重新编码就解决问题了php文件 http://www.lampbrother.net/ 使用的是UTF-8编码,如果没有猜错APACHE处理用的应该是GBK。想明白了这个问题,就去查找相关的教程了,索性找到了iconv这个函数。函数原型:string iconv ( string in_charset, string out_charset, string str ) 使用例子:$content = iconv(“GBK”, “UTF-8”, $content); 这个例子的作用就是将$content从GBK转换成UTF-8编码。 乱码问题关键代码: 复制代码 代码如下: $name=iconv("UTF-8","gb2312", $name); 除了这样来解决上传文件中文乱码问题,我们还可以把上传文件重新命名即可。 例 复制代码 代码如下: $sFileName = “sda.php”; $sOriginalFileName = $sFileName; $sExtension = s str($sFileName, (strrpos($sFileName, ‘.’) + 1));//找到扩展名 $sExtension = strtolower($sExtension); $sFileName = date(“YmdHis”).rand(100, 200).”.”.$sExtension; //这样就是我们的新文件名了,全数字的不会有乱码了哦。 以下是一些补充: php上传中文文件名乱码解决方案 复制代码 代码如下: $filepath=”upload/”; $name=$filepath.$_FILES[“upfile”][“name”]; while(file_exists($name)){ $temp=explode(“.”,$name);//分割字符串 $name=$temp[0].”0″.”.”.$temp[1];//主文件名后面加0 } 复制代码 代码如下: //iconv()函数是关键 if(move_uploaded_file($_FILES[“upfile”][“tmp_name”],iconv(“UTF-8″,”gb2312”,$name))){//处理…} 我的PHP编码是UTF-8,其中原因可能是因为操作系统是GBK的原因! 注意:我的服务器是windows xp、apache,估计xp字符集是gbk。因为我的php代码保存为utf-8格式的,在给文件名命名时会出现乱码的情况,所以可以用iconv()函数将原本的utf-8格式的文件名转换为gbk格式的。 php utf8编码 上传中文文件名出现乱码的解决方法 想必很多朋友在进行utf8编码的php开发上传功能的时候,都会遇到这样的一个问题,就是上传中文文件名的文件时,文件名会变成乱码,我们可以用iconv函数对文件名进行重新编码就解决问题了。 复制代码 代码如下: header("Content-Type:text/html;charset=utf-8"); $submit = $_POST['submit']; if(isset($submit) && trim($submit) != ''){ $file = $_FILES['file']; if(isset($file['tmp_name'])){ $name = iconv('utf-8','gb2312',$file['name']); //利用Iconv函数对文件名进行重新编码 if(move_uploaded_file($file['tmp_name'],$name)){ echo '文件上传成功!'; echo '图片信息:'; print_r($file); } } }
编程百科
2020-08-27 13:41:31
相关推荐: GMail Drive 1.0.16 精彩PuTTY 中文教程 用VB实现“木马”式隐形运行程序 Linux文件系统简介 LINUX下挂载网络上WINDOWS系统光驱 解决无法自动挂载U盘问题 【树莓派】从零搭建DAS服务器,挂载扩容硬盘,实现文件存储与自动下载 四极管:Ubuntu下硬盘的自动挂载 Linux面试题
推荐群组: Ubuntu For Fun
更多相关推荐
PHP 如果你在找一个方便的方式在 Linux 机器上挂载你的 Google Drive 文件夹, 下面兄弟连教育将教你怎么使用 google-drive-ocamlfuse 来挂载 Google Drive。Google 还没有发行 Linux 版本的 Google Drive 应用,尽管现在有很多方法从 Linux 中访问你的 Drive 文件。如果你喜欢界面化的工具,你可以选择 Insync。如果你喜欢用命令行,有很多像 Grive2 这样的工具,以及更容易使用的以 Ocaml 语言编写的基于 FUSE 的文件系统。兄弟连教育www.lampbrother.net 将会用后面这种方式演示如何在 Linux 桌面上挂载你的 Google Drive。尽管这是通过命令行完成的,但是它的用法会简单到让你吃惊。它太简单了以至于谁都能做到。 这个系统的特点: 让我们接下来完成 google-drive-ocamlfuse 在 Ubuntu 16.04 桌面的安装,然后你就能够访问云盘上的文件了。 安装 打开终端。 用命令添加必要的 PPA sudo add-apt-repository ppa:alessandro-strada/ppa 出现提示的时候,输入你的 root 密码并按下回车。 用命令更新应用 sudo apt-get update 用命令安装软件 sudo apt-get install google-drive-ocamlfuse 授权 接下来就是授权 google-drive-ocamlfuse,让它有权限访问你的 Google 账户。先回到终端窗口敲下命令 google-drive-ocamlfuse,这个命令将会打开一个浏览器窗口,它会提示你登陆你的 Google 帐号或者如果你已经登陆了 Google 帐号,它会询问是否允许 google-drive-ocamlfuse 访问 Google 账户。如果你还没有登录,先登录然后点击“允许”。接下来的窗口(在 Ubuntu 16.04 桌面上会出现,但不会出现在 Elementary OS Freya 桌面上)将会询问你是否授给 gdfuse 和 OAuth2 Endpoint 访问你的 Google 账户的权限,再次点击“允许”。然后出现的窗口就会告诉你等待授权令牌下载完成,这个时候就能最小化浏览器了。当你的终端提示如下图一样的内容,你就能知道令牌下载完了,并且你已经可以挂载 Google Drive 了。 应用已经得到授权,你可以进行后面的工作。 挂载 Google Drive 在挂载 Google Drive 之前,你得先创建一个文件夹,作为挂载点。在终端里,敲下mkdir ~/google-drive命令在你的家目录下创建一个新的文件夹。最后敲下命令google-drive-ocamlfuse ~/google-drive 将你的 Google Drive 挂载到 google-drive 文件夹中。 这时你可以查看本地 google-drive 文件夹中包含的 Google Drive 文件/文件夹。你可以把 Google Drive 当作本地文件系统来进行工作。 当你想卸载 google-drive 文件夹,输入命令 fusermount -u ~/google-drive 没有 GUI,但它特别好用 看了这么多快试试 google-drive-ocamlfuse吧! 无兄弟 不编程
编程百科
2020-08-27 13:41:24
23456789101112