原生JS实现AJAX、JSONP及DOM加载完成事件
- ajax({
- url:"http://192.168.66.90:8080/php/test5.php",
- type:"POST",
- data:{GUID:"288350897",subFlag:"1"},
- dataType:"jsonp",
- callback:"Jsoncallback",
- success:function(data){
- if(data.sex==0){
- var userSex="帅哥";
- }
- if(data.sex==1){
- var userSex="美女";
- }
- if(data.switch==0){
- $(".Mbox .mailInfo .text_").html('<span style="color:#fbff83">'+data.mailInfo+'</span>封'+userSex+'来信');
- $(".Mbox").addClass("ty");
- mbox.addEventListener("webkitAnimationEnd",function(){ //动画结束时事件
- var timer=setInterval(function(){
- if(mbox.offsetTop==-60){
- mbox.className='Mbox tyy';
- clearInterval(timer)
- }
- },1000)
- },false);
- }
- //alert(data.switch)
- },
- fail:function(status){
- // 此处放失败后执行的代码
- }
- });
- /***********************************
- 公共ajax方法支持跨越请求
- ************************************/
- function ajax(options) {
- options = options||{};
- if (!options.url||!options.callback){
- throw new Error("参数不合法");
- }
- //创建 script 标签并加入到页面中
- var callbackName=('jsonp_'+Math.random()).replace(".","");
- var oHead=document.getElementsByTagName('head')[0];
- options.data[options.callback]=callbackName;
- var params=formatParams(options.data);
- var oS=document.createElement('script');
- oHead.appendChild(oS);
- //创建jsonp回调函数
- window[callbackName]=function(json){
- oHead.removeChild(oS);
- clearTimeout(oS.timer);
- window[callbackName]=null;
- options.success&&options.success(json);
- };
- //发送请求
- oS.src=options.url+'?'+params;
- //超时处理
- if(options.time){
- oS.timer=setTimeout(function(){
- window[callbackName]=null;
- oHead.removeChild(oS);
- options.fail&&options.fail({message:"超时"});
- },time);
- }
- };
- //格式化参数
- function formatParams(data){
- var arr=[];
- for(var name in data){
- arr.push(encodeURIComponent(name)+"="+encodeURIComponent(data[name]));
- }
- return arr.join('&');
- }
jQuery制作从左到右从新排列内容动画特效
- <!doctype html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>jQuery制作从左到右从新排列内容动画特效</title>
- <style>
- body{ height: 3000px; padding: 0; margin: 0; }
- div{ background: #000; margin: 20px 0; width: 100px; height: 30px; color: #fff; line-height: 30px; text-align: center; }
- </style>
- </head>
- <script src="js/jquery.min.js"></script>
- <body>
- <div class="op1">111</div>
- <div class="op2">222</div>
- <div class="op3">333</div>
- <div class="op4">444</div>
- <div class="op5">555</div>
- <div class="op6">666</div>
- <div class="op7">777</div>
- <input type="button" value="stop!!!" />
- <script>
- var _width = ($(document).width() - $('div').width()) + "px";
- var animateList=[
- function(){ $('.op1').delay(500).animate({marginLeft:_width},500,queueList); },
- function(){ $('.op2').delay(300).animate({marginLeft:_width},500,queueList); },
- function(){ $('.op3').delay(300).animate({marginLeft:_width},500,queueList); },
- function(){ $('.op4').delay(700).animate({marginLeft:_width},500,queueList); },
- function(){ $('.op5').delay(300).animate({marginLeft:_width},500,queueList); },
- function(){ $('.op6').delay(200).animate({marginLeft:_width},500,queueList); },
- function(){ $('.op7').delay(300).animate({marginLeft:_width},500,function(){ alert('动画队列结束'); } );}
- ];
- $(document).queue('_queueList',animateList);
- var queueList=function(){
- $(document).dequeue('_queueList');
- };
- queueList();
- $(':button').click(function(){
- $(document).clearQueue('_queueList');
- });
- </script>
- </body>
- </html>
Linux复制本地文件到远程
scp -r /www/next.youyuan.com2 root@192.168.3.162:/www/
JSON 常用类型处理
- var str='{"weatherinfo": [{"city": "北京","city_en": "beijing", "cityid": "101130101","date": "","date_y": "2014年1月23日", "wind6": "微风"}]}';
- var obj=JSON.parse(str);
- var yy=JSON.stringify(obj);
- alert(yy)
JS设置数组随机取值,支持多个不重复【实例】
JS设置数组随机取值,支持多个不重复【实例】
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>无标题文档</title>
- </head>
- <body Arrdata="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33">
- </body>
- <script type="text/javascript" src="http://code.liuxinxiu.com/lib/zepto/zepto-1.1.6.js"></script>
- <script language="javascript">
- //从一个给定的数组arr中,随机返回num个不重复项
- function getArrayItems(arr, num) {
- //新建一个数组,将传入的数组复制过来,用于运算,而不要直接操作传入的数组;
- var temp_array = new Array();
- for (var index in arr) {
- temp_array.push(arr[index]);
- }
- //取出的数值项,保存在此数组
- var return_array = new Array();
- for (var i = 0; i<num; i++) {
- //判断如果数组还有可以取出的元素,以防下标越界
- if (temp_array.length>0) {
- //在数组中产生一个随机索引
- var arrIndex = Math.floor(Math.random()*temp_array.length);
- //将此随机索引的对应的数组元素值复制出来
- return_array[i] = temp_array[arrIndex];
- //然后删掉此索引的数组元素,这时候temp_array变为新的数组
- temp_array.splice(arrIndex, 1);
- } else {
- //数组中数据项取完后,退出循环,比如数组本来只有10项,但要求取出20项.
- break;
- }
- }
- return return_array;
- }
- //测试
- var ArrData=$("body").attr("Arrdata");
- //var ArrList=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33];
- var data=ArrData.split(",");//已经是数组,直接可以用str[0]去取了
- //alert(str[1])
- //alert(getArrayItems(arr,2));
- var html=getArrayItems(data,2);
- for(var i=0;i<html.length;i++){
- alert(html[i])
- }
- document.write(html)
- </script>
- </html>
JS遍历2层DOM装入数组转JSON【实例】
JS遍历2层DOM装入数组转JSON【实例】
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>无标题文档</title>
- <style>
- *{ margin:0; padding:0;}
- body{ color:#333; font-family:'Microsoft Yahei'; font-size:16px;}
- ul,li{ list-style:none; line-height:30px;}
- .conbox{ padding:10px;}
- .conbox .selected{ color:#CC0033}
- .conbox .lis span{ padding:0 5px;}
- </style>
- </head>
- <body arrData="111,222,333,444,555,666">
- <div class="conbox">
- <ul class="lisbox">
- <li data-qId="11" n="aaa" class="lis selected"><span class="on">111c</span><span class="on">222c</span><span class="on">333c</span></li>
- <li data-qId="22" n="bbb" class="lis">bbb</li>
- <li data-qId="33" n="ccc" class="lis selected"><span class="on">111a</span><span class="on">222a</span><span class="on">333a</span></li>
- <li data-qId="44" n="ddd" class="lis">ddd</li>
- <li data-qId="55" n="eee" class="lis selected"><span class="on">111b</span><span class="on">222b</span><span class="on">333b</span></li>
- <li data-qId="66" n="fff" class="lis">fff</li>
- </ul>
- </div>
- <div id="submitBtn" style=" width:100%; height:50px; line-height:50px; text-align:center; color:#fff; background:#CC0000">点击事件</div>
- </body>
- <script type="text/javascript" src="http://code.liuxinxiu.com/lib/zepto/zepto-1.1.6.js"></script>
- <script type="text/javascript">
- $("#submitBtn").on("click",function(){
- /********* 声明变量获取节点 ***************/
- var qList=$(".lisbox li.selected"),qLen=qList.length,arr=[];
- /********* 循环第一层问题 ***********/
- for(var i=0;i<qLen;i++){
- /**** var $anList=$qList.eq(i).find("[name=an" + i + "]:checked"),subArr=[]; ****/
- var anList=qList.eq(i).find(".on"),subArr=[];
- var qid=qList.eq(i).attr("data-qId");
- /***** 循环第二层答案 **********/
- for(var key=0;key<anList.length;key++){
- subArr.push(anList.eq(key).text());
- }
- /***** 添加到整体数组 ************/
- arr.push({Question:qid,Answer:subArr});
- }
- /***** 转化成JSON结构字符串 *******/
- var subArrst=JSON.stringify(subArr);
- var jsondata=JSON.stringify(arr);
- /***** 使用replace替换"号为空、可全部 ******/
- var _subArrst=subArrst.replace(/"/g,"");
- var _datalist=jsondata.replace(/"/g,"");
- var _dataJson={guId:111222,eventId:11,plat:5,datalist:subArrst};
- alert(_datalist)
- });
- </script>
- </html>
JSTL 与 JSP 或者 Java 相互传递变量的代码
两种方式
Nginx Post最大提交数据限制
原以为是php本身的限制,查看配置文件无论是POST还是单个文件上传都满足要求:
#post最大提交量
post_max_size = 8M
#php给个文件最大限制
upload_max_filesize = 2M
************************************************************************
NGINX错误日志显示:
Nginx 【client intended to send too large body: 1065755 bytes】
在Nginx.conf文件中添加:
client_max_body_size 64M; #多少M根据实际情况填写
重启即可!
PHP判断POST或GET请求,返回提交服务器的JSON数据(支持跨越)
注明:暂时不支持跨域名下GET请求
http://192.168.66.90:8080//php/POST_GET.php
- <?php
- //目前暂不支持跨域GET请求
- header('Content-type: text/json');
- html_entity_decode($string, ENT_QUOTES, 'UTF-8');
- //回调参数设置
- $param="callback";
- $callback=$_REQUEST[$param];
- //判断请求参数就是同域名下AJAX请求
- if(!isset($callback)){
- //返回多个Id
- if($_POST){
- exit(json_encode($_POST));
- }else if($_GET){
- exit(json_encode($_GET));
- }
- //返回单个Id
- if($_POST['Id']){
- $a=$_POST['Id'];
- //echo $a;
- exit(json_encode($a));
- }else if($_GET['Id']){
- $a=$_GET['Id'];
- //echo $a;
- exit(json_encode($a));
- }
- //强制开关按钮
- if($_POST['CT']){
- $a=$_POST['CT'];
- echo $a;
- }else if($_GET['CT']){
- $a=$_GET['CT'];
- echo $a;
- }
- }
- //判断请求参数存在就是实现JSONP跨越提交
- if(isset($callback)){
- //强制开关按钮
- if($_POST['Id']){
- $a=$_POST['Id'];
- $b=json_encode($a);
- $str=$callback."(".$b.")";
- }else{
- $a=$_POST['CT'];
- $str=$callback."(".$a.")";
- }
- echo $str;
- }
- ?>
http://192.168.66.90:8080/Ajax/s6.html
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>ajax test</title>
- <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
- <script type="text/javascript">
- $(document).ready(function(){
- //点击请求http接口,删除多条数据
- $(".delall").click(function(){
- //拼写成JSON数据格式,提交http接口JSON不需要转字符串
- //alert(JSON.stringify(obj))
- var val=$(".dellink.on").map(function(){
- return $(this).attr("id");
- }).get();
- var obj={Id:val};
- //var vot=JSON.stringify(obj);
- //alert(obj)
- /***** 同域名下多条ID请求
- $.ajax({
- url:"/php/POST_GET.php",
- type:"post",
- dataType:"json",
- //jsonp:"callback",
- data:obj,
- success:function(data){
- //var yy=JSON.stringify(data);
- //alert(yy)
- $.each(data.Id,function(i,item){
- $('#'+item).slideUp();
- });
- },
- error:function(){
- alert("异常!");
- }
- });
- */
- /***** 跨域名多条ID请求 *****/
- $.ajax({
- url:"http://192.168.66.90:8080//php/POST_GET.php",
- type:"post",
- dataType:"jsonp",
- jsonp:"callback",
- data:obj,
- success:function(data){
- //var yy=JSON.stringify(data);
- //alert(data)
- $.each(data,function(i,item){
- $('#'+item).slideUp();
- });
- },
- error:function(){
- alert("异常!");
- }
- });
- });
- //点击请求http接口,删除单条数据
- $(".dellink").click(function() {
- var thisId=$(this).attr("id");
- /***** 同域名Ajax请求
- $.ajax({
- url:"/php/POST_GET.php",
- type:"post",
- dataType:"json",
- //jsonp:"callback",
- data:{Id:thisId},
- success:function(data){
- //var yy=JSON.stringify(data);
- //alert(yy)
- $.each(data,function(i,item){
- $('#'+item).slideUp();
- });
- },
- error:function(){
- alert("异常!");
- }
- });
- *****/
- /****** 可支持jsonp跨域名请求 */
- $.ajax({
- url:"http://192.168.66.90:8080//php/POST_GET.php",
- type:"post",
- dataType:"jsonp",
- jsonp:"callback",
- data:{Id:thisId},//{Id:"44554547"}
- success:function(data){
- var yy=JSON.stringify(data);
- //alert(data)
- if(thisId==data){
- $('#'+data).slideUp();
- }
- },
- error:function(){
- alert("异常!");
- }
- });
- });
- //控制开关(服务器返回0或1)
- $(".control").click(function(){
- var hason=$(this).hasClass("on");
- /***** 同域名下访问http接口
- if(hason){
- $.ajax({
- url:"/php/POST_GET.php",
- type:"post",
- dataType:"json",
- data:{CT:"0"},
- success:function(data){
- $(".control").removeClass("on");
- $(".control").html("广告关闭")
- },
- error:function(){
- alert("异常!");
- }
- });
- }else{
- $.ajax({
- url:"/php/POST_GET.php",
- type:"post",
- dataType:"json",
- data:{CT:"1"},
- success:function(data){
- $(".control").addClass("on");
- $(".control").html("广告开启")
- },
- error:function(){
- alert("异常!");
- }
- });
- }
- */
- /***** 跨域名访问http接口 *****/
- if(hason){
- $.ajax({
- url:"http://192.168.66.90:8080//php/POST_GET.php",
- type:"post",
- dataType:"jsonp",
- jsonp:"callback",
- data:{CT:"0"},
- success:function(data){
- if(data==0){
- $(".control").removeClass("on");
- $(".control").html("广告关闭")
- }
- },
- error:function(){
- alert("异常!");
- }
- });
- }else{
- $.ajax({
- url:"http://192.168.66.90:8080//php/POST_GET.php",
- type:"post",
- dataType:"jsonp",
- jsonp:"callback",
- data:{CT:"1"},
- success:function(data){
- if(data==1){
- $(".control").addClass("on");
- $(".control").html("广告开启")
- }
- },
- error:function(){
- alert("异常!");
- }
- });
- }
- });
- //control end
- });
- </script>
- </head>
- <body>
- <style type="text/css">
- body { font-family: 'Microsoft Yahei'; margin:0; padding:0; font-weight:normal}
- .dellink,.delall,.list .control{height:60px; line-height:60px; color:#fff; width:600px; font-size:22px; text-align:center; margin:2px auto; cursor:pointer;}
- .dellink{ display:block; background:#000;}
- .delall{ background: #CC3366; }
- .list .control{ background:#CC0033; }
- .list .on{background:#006633;}
- </style>
- <a class="dellink on" id="1001">删除单条数据 0111</a>
- <a class="dellink" id="1002">删除单条数据 022</a>
- <a class="dellink on" id="1003">删除单条数据 0333</a>
- <a class="dellink on" id="1004">删除单条数据 044</a>
- <a class="dellink" id="1005">删除单条数据 0555</a>
- <div class="delall">请求http接口【并删除多条数据】</div>
- <div class="list">
- <div class="control on">广告开启</div>
- </div>
- </body>
- </html>
如何成为一名优秀的前端工程师 (share)
一、技术的必须的
作为一名最基础的前端工程师你必须掌握HTML、CSS和JavaScript。三者必须同时精通,类似我这样对前端知识一知半解的,一遇到问题就停下工作就四处搜索解决方案的,首先就算不上一个合格的前端人员。像我这样的如果当了前端工程师那工期肯定是不能保证的。合格的前端工程师第一要学会的就是在没有任何外来帮助的情况下(包括搜索引擎),能够完成大多数任务。
以下知识点是作为一个前端工程师必须了解和熟悉的:
- DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动。
- DOM操作——怎样添加、移除、移动、复制、创建和查找节点。
- 事件——怎样使用事件以及IE和DOM事件模型之间存在哪些主要差别。
- XMLHttpRequest——这是什么、怎样完整地执行一次GET请求、怎样检测错误。
- 严格模式与混杂模式——如何触发这两种模式,区分它们有何意义。
- 盒模型——外边距、内边距和边框之间的关系,IE < 8中的盒模型有什么不同。
- 块级元素与行内元素——怎么用CSS控制它们、它们怎样影响周围的元素以及你觉得应该如何定义它们的样式。
- 浮动元素——怎么使用它们、它们有什么问题以及怎么解决这些问题。
- HTML与XHTML——二者有什么区别,你觉得应该使用哪一个并说出理由。
- JSON——它是什么、为什么应该使用它、到底该怎么使用它,说出实现细节来。
上述这些知识点都应该是你“想都不用想”就知道的东西。除了上述的前端知识,也还需学会至少一门后端编程语言,让你自己学会如何与后端进行更好的交互。
很多前端工程师对一些库非常的熟悉,jQuery,Bootstrap等,但是对于库的熟悉并不能提现你的优秀,真正优秀的是那些理解库背后的机制,特别是能够徒手写出一个自己的库的人。
真正合格的前端工程师是能实现具体的功能要求,而优秀的前端工程师需要解决的问题是寻找一个最优的解决方案。
二、沟通很重要
优秀的前端工程师需要具备良好的沟通能力,因为你的工作与很多人的工作息息相关。在任何情况下,前端工程师至少都要满足下列四类客户的需求。
- 产品经理——这些是负责策划应用程序的一群人。他们能够想象出怎样通过应用程序来满足用户需求,以及怎样通过他们设计的模式赚到钱(但愿如此)。一般来说,这些人追求的是丰富的功能。
- UI设计师——这些人负责应用程序的视觉设计和交互模拟。他们关心的是用户对什么敏感、交互的一贯性以及整体的好用性。他们热衷于流畅靓丽但并不容易实现的用户界面。
- 项目经理——这些人负责实际地运行和维护应用程序。项目管理的主要关注点,无外乎正常运行时间——应用程序始终正常可用的时间、性能和截止日期。项目经理追求的目标往往是尽量保持事情的简单化,以及不在升级更新时引入新问题。
- 最终用户——当然是应用程序的主要消费者。尽管我们不会经常与最终用户打交道,但他们的反馈意见至关重要;没人想用的应用程序毫无价值。最终用户要求最多的就是对个人有用的功能,以及竞争性产品所具备的功能。
不要在没有作出评估之前就随便接受某项任务。你必须始终记住,一定先搞清楚别人到底想让你干什么,不能简单地接受“这个功能有问题”之类的大概其的说法。而且,你还要确切地知道这个功能或设计的真正意图何在。“加一个按钮”之类的任务并不总意味着你最后会加一个按钮。还可能意味着你会找产品经理,问一问这个按钮有什么用处,然后再找UI设计师一块探讨按钮是不是最佳的交互手段。要成为优秀的前端工程师,这种沟通至关重要。
那么,前端工程师应该最关注哪些人的意见呢?答案是所有这四类人。优秀的前端工程师必须知道如何平衡这四类人的需求和预期,然后在此基础上拿出最佳解决方案。由于前端工程师处于与这四类人沟通的交汇点上,因此其沟通能力的重要性不言而喻。如果一个非常酷的新功能因为会影响前端性能,必须删繁就简,你怎么跟产品经理解释?再比如,假设某个设计如果不改回原方案可能会给应用程序造成负面影响,你怎么才能说服UI设计师?作为前端工程师,你必须了解每一类人的想法从何而来,必须能拿出所有各方都能接受的解决方案。从某种意义上说,优秀的前端工程师就像是一位大使,需要时刻抱着外交官的心态来应对每一天的工作。
专业技术可能会引领你进入成为前端工程师的大门,但只有运用该技术创造的应用程序以及你跟他人并肩协同的能力,才会真正让你变得优秀。
三、提升无止境
优秀的前端工程师应该具备快速学习能力。推动Web发展的技术并不是静止不动的,这些技术几乎每天都在变化,如果没有快速学习能力,你就跟不上Web发展的步伐。你必须不断提升自己,不断学习新技术、新模式;仅仅依靠今天的知识无法适应未来。Web的明天与今天必将有天壤之别,而你的工作就是要搞清楚如何通过自己的Web应用程序来体现这种翻天覆地的变化。
四、前端开发知识架构
- 前端工程师
- 浏览器
- 编程语言
- 切页面
- 开发工具
- 代码质量
- 前端库/框架
- 前端标准/规范
- HTTP1.1
- ECMAScript3/5
- W3C/DOM/BOM/XHTML/XML/JSON/JSONP
- CommonJS/AMD
- HTML5/CSS3
- 性能
- 编程知识储备
- 数据结构
- OOP/AOP
- 原型链/作用域链
- 闭包
- 函数式编程
- 设计模式
- Javascript Tips
- 部署流程
- 代码组织
- 类库模块化
- CommonJS/AMD
- YUI3模块
- 业务逻辑模块化
- 文件加载
- 类库模块化
- 安全
- 移动Web
- HTML5/CSS3
- 响应式设计
- Zeptojs/iScroll
- V5/Sencha Touch
- PhoneGap
- jQuery Mobile
- JavaScript生态
- MongoDB/CouchDB
- 前沿技术社区/会议
- D2/WebRebuild
- NodeParty/W3CTech/HTML5梦工厂
- JSConf/沪JS(JSConf.cn)
- QCon/Velocity/SDCC
- JSConf/NodeConf
- YDN/YUIConf
- 计算机知识储备
- 编译原理
- 计算机网络
- 操作系统
- 算法原理
- 软件工程/软件测试原理
- 软技能
- 知识管理/总结分享
- 沟通技巧/团队协作
- 需求管理/PM
- 交互设计/可用性/可访问性知识
- 可视化
- 后端工程师
- 编程语言
- C/C++/Java/PHP/Ruby/Python/…
- 数据库
- SQL
- MySQL/MongoDB/Oracle
- 操作系统
- Unix/Linux/OS X/Windows
- 数据结构
- 编程语言