魏长东

weichangdong

正在查看: js 分类下的文章(第 1 页 / 共 23 篇)

js cal2插件实现时区功能

function getLocalTime(i) {
        //参数i为时区值数字,比如北京为东八区则输进8,西5输入-5
        if (typeof i !== 'number') return;
        var d = new Date();
        //得到1970年一月一日到现在的秒数
        var len = d.getTime();
        //本地时间与GMT时间的时间偏移差
        var offset = d.getTimezoneOffset() * 60000;
        //得到现在的格林尼治时间
        var utcTime = len + offset;
        return new Date(utcTime + 3600000 * i);
    }

Calendar.setup({
    weekNumbers: true,

    inputField : "start_time",
 
   trigger    : "start_time",
 
   dateFormat: "%Y-%m-%d %H:%M:%S",

    showTime: true,
 
   minuteStep: 1,
 
   onChange : function(){

        this.setHours(getLocalTime(0).getHours());
  
      this.setMinutes(getLocalTime(0).getMinutes());
 
   },
    
onSelect   : function() {this.hide();}

});

phantomjs casperjs 太牛逼了(没有之一)

//var server = require('webserver').create();
var casper = require('casper').create({
    verbose: true,
    logLevel: 'debug'
});
 
var system = require('system');
//casper.echo(system.args[4]);
//phantom.exit();
var  pass = system.args[4];

var verify = '';
casper.echo("==========");
 
 
casper.start('http://weichangdong.com/index.php/admin');

casper.then(function(){
	this.fill('form',{
		'name': 'admin',
		'password': pass
	},false);
});

// casper.thenClick('#name');
//casper.thenClick('#password');
casper.thenClick('form button');

casper.run(function(){
	var self = this;
	casper.echo("============="+self.getCurrentUrl()+'=======');

	if(self.exists('#typecho-message')){
		this.echo('get content ... ','ERROR');
		self.captureSelector('verify.png', '#typecho-message');
	}else{
		self.capture('renren.png');
	}
	self.exit();
});

casperjs login189.js pass

直接部分截图成功!!!!!!

有时间好好研究下

很厉害的js

看到别人写的一段js,觉得很厉害,共享下。因为本人对js的面向对象的写法还是很菜鸟。

/**
 * ajaxload js
 * @author yulipu
 * based on ylib's extend and event and ajax
 */
function AjaxLoad(opt) {
 opt = undefined == opt ? {} : opt;
 this.options = {
  container : 'listContainer',  // 容器
  loadMoreButton : 'loadMoreLink',  // 更多按钮
  lastId : 0,  // 最下面一条内容的id
  LatestId : 0  // 最新内容id
 };
 this.options = ylib.extend(this.options, opt);
 
 this.init();
}
AjaxLoad.prototype = {
 constructor : AjaxLoad,
 
 reset : function() {},
 
 init : function() {
  var _this = this;
  var o = this.options;
  // 添加事件
  ylib.E.addHandler(document.getElementById(o.loadMoreButton), 'click', function(){
   _this.loadMore(); 
  });
 },
 
 // 发送请求
 request : function(url, data, func, err) {
  ylib.ajax.request({
    "url" : url,
    "data" : data,
    "success" : func,
    "error" : err || function() {alert('请求超时或出错');}
  }); 
 },
 
 // 一些地址配置
 config : {
  // 动态加载内容地址
  loadmore : {
   url : _APP_ +'/about'
  },
  
  // 显示最新地址
  loadNew : {} 
 },
 
 // 加载更多
 loadMore : function() {
  var _this = this;
  var id = this.options.lastId;
  if(!id){alert('参数错误');return;}
  
  var container = document.getElementById(this.options.container);
  var aLink = document.getElementById(this.options.loadMoreButton);
  var parentEle = aLink.parentNode;
  var oldStr = parentEle.innerHTML;
  parentEle.innerHTML = '加载中...';
  
  var url = this.config.loadmore.url;
  var data = 'lastId='+id;
  this.request(url, data, function(str){
   parentEle.innerHTML = oldStr;
   _this.init();  // 重新添加事件
   if('4' == str) {
    alert('参数错误'); 
   } else if(str.indexOf("hava")>0) {
    container.innerHTML += str;
    try {
     _this.options.lastId = container.lastChild.getAttribute('id').split("_").pop();
    } catch(e) {
      
    }
    
   } else {
    parentEle.innerHTML = '没有数据了哦'; 
   }
   
  }, function(){
   parentEle.innerHTML = oldStr;
   _this.init(); // 重新添加事件
   alert('请求超时或出错');
  });
 } 
};

 

调用方法

<script type="text/javascript"> var ajaxLoad = new AjaxLoad({ "lastId" : 1 }); </script>

jquery又一利器

<script type="text/javascript">
    $(document).ready(function() {
        $.formValidator.initConfig({autotip:true,formid:"myform",onerror:function(msg){}});
        $("#old_password").formValidator({empty:true,onshow:"不修改密码请留空",onfocus:"密码应该为6-20位之间",
oncorrect:"旧密码输入正确"}).inputValidator({min:5,max:20,onerror:"密码应该为6-20位之间"}).ajaxValidator({
            type : "get",
            url : "<{$smarty.const.__CONTROLLER__}>/public_password_ajx",
            data :"",
            datatype : "html",
            async:'false',
            success : function(data){ if( data == 1 ) { return true; } else { return false; } },
            buttons: $("#dosubmit"),
            onerror : "旧密码输入错误",
            onwait : "请稍候..."
        });
        $("#new_password").formValidator({empty:true,onshow:"不修改密码请留空。",onfocus:"密码应该为6-20位之间"}).inputValidator({min:5,max:20,onerror:"密码应该为6-20位之间"});
        $("#new_pwdconfirm").formValidator({empty:true,onshow:"不修改密码请留空。",onfocus:"请输入两次密码不同。",oncorrect:"密码输入一致"}).compareValidator({desid:"new_password",operateor:"=",onerror:"请输入两次密码不同。"});
    });
</script>

 

formValidator 很强大啊 有机会好好用用。这次是在别人的基础上改改,也算结识了一位新朋友。

js 温习2

/* 
1、js数组跟其他语言的数组一样,都是数据的有序列表,但不同的是,js数组的每一项可以保存任何类型的数据。 
并且js数组的大小是可以动态调整的。 
 
2、创建数组方式: 
*/  
  
(1)使用Array构造函数创建数组:  
var names = new Array();  
  
创建length=30的数组  
var names = new Array(30); 如果预先知道数组长度,可直接传入数值   
alert(names.length);  30  
  
也可以像Array构造函数传递数组应该包含的项:  
var names2 = new Array("zhangsan","lisi","wangwu");  
alert(names2); zhangsan,lisi,wangwu  
  
给Array构造函数传递一个值也可以创建数组  
var ages = new Array(2);  创建包含两项的数组  
var ages = new Array("11"); 创建包含1项,即字符串“11”的数组  
  
可以省略new操作符  
var books = Array(2);创建包含两项的数组  
var books = Array("books1");创建包含1项,即字符串“books”的数组  
  
  
(2) 使用数组字面量表示法创建数组:数组字面量由一对包含数组项的方括号表示,多个数组项之间用逗号隔开  
var names = ["zhangsan","lisi","wangwu"];  创建一个包含3个字符串的数组  
var names = [];  创建一个空数组  
  
在数组最后一项添加逗号的结果:  
  
在其他浏览器中会创建包含2项且值分别为"zhangsan","lisi"的数组  
在IE中,names会创建包含3项,值分别为“zhangsan","lisi",undefined的数组,  
原因在于IE8及之前版本的ECMAScript实现在数组字面量方面存在BUG  
var names = ["zhangsan","lisi",];  
alert(names); IE9下报错,IE8及以下:zhangsan,lisi,  
alert(names.length);  
  
  
像这种省略值情况下,每一项都是undefined值。  
var names = [,,,,,];  
alert(names.length); 5:在及其他浏览器中创建包含5项的数组  
alert(names.length);   6:  在IE版本中创建包含6项的数组  
alert(names[5]); undefined  
  
  
读取设置数组值  
var colors = ["red","green","blue"];  
alert(colors[0]);  显示第一项  
colors[2] = "pink";  修改第三项  
alert(colors);  red,green,pink  
  
colors[3] = "black"; 增加第四项,设置某个值的索引超过了数组长度,则数组长度自动加1  
alert(colors); red,green,pink,black  
  
  
3、length属性:>=0  ,length属性不是只读的,可以通过设置length属性来从数组末尾移除项或向数组中添加项  
var colors = ["red","green","blue"];  
colors.length = 2;    
alert(colors[2]);  undefined  
  
var colors = ["red","green","blue"];  
colors.length = 4;    
alert(colors[3]);  undefined  
  
var colors = ["red","green","blue"];  
colors[colors.length] = "black";  
colors[colors.length] = "pink";  
alert(colors);  red,green,blue,black,pink  
  
var colors = ["red","green","blue"]  
colors[99] = "black";  
alert(colors.length);  100  ,colors[3]到color[98]都是undefined  
  
4、数组类型判断   
  
对于一个网页或一个全局作用域,instanceof假定单一的全局执行环境  
var colors = ["red","green","blue"];  
var obj = {};  
alert(colors instanceof Array); true  
alert(obj instanceof Array);  false  
  
对于网页中包含多个框架,则就存在多个不同的全局执行环境,从而存在多个不同版本的Array构造函数,  
那么从一个框架向另一个框架传入一个数组,则传入的数组与第二个框架中的数组则分别具有不同构造  
为了解决这个问题,则须采用Array.isArray()方法  
  
var colors = ["red", "green", "blue"];  
var obj = {};  
alert(Array.isArray(colors)); true  
alert(Array.isArray(obj)); false  
  
兼容性:支持isArray方法的浏览器有: IE9+,其他浏览器  
  
  
5、toString(): 返回数组每一项用逗号分隔的字符串,调用数组每一项的toString()方法  
valueOf(): 返回数组  
var colors = ["red", "green", "blue"];  
alert("toString="+colors.toString()); red,green,blue  
alert(colors); alert接收字符串参数,传递给它的是数组,因此在后头会调用Array的toString()方法  
alert("valueOf="+colors.valueOf());   
alert(Array.isArray(colors.valueOf())); true  
  
toLocaleString():  返回数组每一项用逗号分隔的字符串,调用每一项的toLocaleString()方法,而不是toString()方法  
/* 
var book1 = { 
    toString : function(){ 
        return "book1.toString()"; 
    }, 
 
    toLocaleString : function(){ 
        return "book1.toLocaleString()"; 
    } 
 
}; 
var book2 = { 
    toString : function(){ 
        return "book2.toString()"; 
    }, 
 
    toLocaleString : function(){ 
        return "book2.toLocaleString()"; 
    } 
 
}; 
var book = [book1,book2]; 
alert(book); book1.toString(),book2.toString() 
alert(book.toString); function toString(){[natice code]} 
alert(book.toString());book1.toString(),book2.toString() 
alert(book.toLocaleString());book1.toLocaleString(),book2.toLocaleString() 
*/  
  
join(): 接收一个作为分隔符的参数, 返回由分隔符分隔的字符串,  
var colors = ["red^", "green^", "blue^"];  
alert(colors.join(','));red^,green^,blue^  
alert(colors.join('|'));red^|green^|blue^  
alert(colors.join()); 默认以逗号分隔: red^,green^,blue^  
alert(colors.join(undefined));在IE8+及其他浏览器中显示:red^,green^,blue^  
alert(colors.join(undefined)); 在IE7及以下版本显示:red^undefinedgreen^undefinedblue^  
  
如果数组中的某一项值为null或undefined,则该值在join()\valueOf()\toString()\toLocaleString()都返回空字符串  
var names = ["zhangsan",null,undefined,"lisi"];  
alert(names); zhangsan,,,lisi  
  
  
push():  接收任意数量参数,添加到数组末尾,返回修改后数组长度  
var names = new Array();  
var num = names.push("zhangsan","lisi");  
alert(num); 2  
num = names.push("wangwu");  
alert(num); 3  
var item = names.pop();  
alert(item); wangwu  
  
shift() : 移除数组第一项并返回  
var colors = ["red","green","blue"];  
var item = colors.shift();  移除第一项并返回  
alert(item);  
alert(colors.length); 2  
  
unshift() : 在数组前端添加任意个项并返回数组新长度,对于IE7及更早版本,unshift返回undefined而不是数组长度  
var colors = ["red","green","blue"];  
var count = colors.unshift("aaa","bbb");  
alert(colors);"aaa","bbb","red","green","blue"  
alert(count);5  

js 温习1

//1、数组排序,默认升序排列,sort()方法会调用数组每一项的toString(),然后比较得到的字符串来排序  
//sort() : 返回排序之后的数组  
//var arr = [23,1,3,56,42,-1];  
//arr.sort();  
//alert(arr); // -1,1,3,23,42,56  
  
//即使数组每一项都是数值,sort()方法比较的也是字符串  
//var arr = [0,1,5,10,15];  
//arr.sort();  
//alert(arr); //0,1,10,15,5  
  
//sort()可以接收一个函数参数,用于对数组项进行比较  
/* 
function compare(a,b){ 
    if(a < b){ 
        return -1; 
    }else if(a > b){ 
        return 1; 
    }else{ 
        return 0; 
    } 
} 
var arr = [0,1,5,10,15]; 
arr.sort(compare); 
alert(arr); //0,1,5,10,15 
*/  
  
//2、反转数组:reverse(),返回排序之后的数组  
//var arr = [0,1,5,10,15];  
//arr.reverse();  
//alert(arr); //15,10,5,1,0  
  
  
//3、concat()方法: 基于当前数组中所有项创建一个新数组  
//concat()先创建当前数组的一个副本,然后将接收到的参数添加到数组的末尾,然后返回新的数组。  
//如果没有给concat()方法传参数,则仅仅是复制当前数组并返回副本。  
//如果给concat()传递的是一个或者多个数组,则会将数组每一项都添加到结果数组中,  
//如果传递参数不是数组,则会简单地添加数组末尾。  
  
//var names = ["zhangsan","lisi"];  
//var names2 = names.concat('wangwu','zhaoliu',['xiaoming','xiangsun']);  
//alert(names); //zhangsan,lisi  
//alert(names2); // zhangsan,lisi,wangwu,zhaoliu,xiaoming,xiangsun  
  
  
//4、slice() : 基于当前数组的一项或多项创建新数组,接收一个或者两个参数,项的起始位置和结束位置。  
//slice方法不影响原始数组  
//var names = ["zhangsan","lisi","wangwu","zhaoliu","sunqi"];  
//var names2 = names.slice(1);  
//var names3 = names.slice(1,4); //包含起始位置元素,不包含结束位置元素  
//alert(names); //zhangsan,lisi,wangwu,zhaoliu,sunqi  
//alert(names2); //lisi,wangwu,zhaoliu,sunqi  
//alert(names3); //lisi,wangwu,zhaoliu  
  
//如果slice参数中有负数,则用数组长度加上该数来定位  
//var names = ["zhangsan","lisi","wangwu","zhaoliu","sunqi"];  
//alert(names.slice(-2,-1)); // slice(-2,-1) = slice(3,4)  返回 ”zhaoliu“  
  
//如果结束位置小于起始位置,则返回空数组  
//alert(names.slice(4,1)); //空数组  
  
  
//5、splice()方法:向数组中插入项,splice()方法始终返回一个数组,该数组包含从原始数组中删除的项,  
//如果没有删除任何项,则返回空数组。  
//(1):  删除数组项,从哪个位置开始删除,删除几项  
//var names = ["zhangsan","lisi","wangwu","zhaoliu","sunqi"];  
//alert(names.splice(0,2)); //zhangsan,lisi  
//alert(names); //wangwu,zhaoliu,sunqi  
  
//(2):  插入数组项,向指定位置插入任意数量的项。参数: 起始位置、0(要删除的项数)、要插入的项  
//var names = ["zhangsan","lisi","wangwu","zhaoliu","sunqi"];  
//var deleted = names.splice(1,0,'aa','bb','cc');  
//alert(names); //zhangsan,aa,bb,cc,lisi,wangwu,zhaoliu,sunqi  
//alert(deleted);//返回空数组  
  
//(3):  替换,向指定位置插入任意数量的项,且同时删除任意数量项,参数: 起始位置、要删除的项数)、要插入的项  
//var names = ["zhangsan","lisi","wangwu","zhaoliu","sunqi"];  
//var deleted = names.splice(1,1,'aa','bb','cc');  
//alert(names); //zhangsan,aa,bb,cc,wangwu,zhaoliu,sunqi  
//alert(deleted);//lisi  
  
  
//6、indexOf() \ lastIndexOf()  :  返回要查找项在数组中的位置,没找到返回-1,使用全等===比较  
//支持浏览器包含IE9+、其他浏览器  
//var names = ["zhangsan","lisi","wangwu","zhaoliu","sunqi","lisi","wangwu","sunqi"];  
//alert(names.indexOf("lisi")); // 1  
//alert(names.lastIndexOf("lisi")); // 5  
  
//7、数组遍历:every(),filter(),forEach(),map(),some()  参数:每一项上运行的函数,运行该函数的作用域对象  
//支持这些遍历方法的浏览器:IE9+及其他浏览器  
//every(): 遍历数组每一项,如果每一项都返回true,则返回true  
//some(): 遍历数组每一项,如果任意一项返回true,则返回true  
//filter(): 过滤满足条件的值,返回这些值组成的新数组  
//map() : 返回一个数组,这个数组的每一项都是在原始数组的对应项上运行传入函数的结果。  
//forEach(): 没有返回值,与for循环一样  
/* 
var numbers = [1,2,3,4,5,4,3,2,1]; 
var everyResult = numbers.every(function(item,index,array){ 
    return item > 2; 
}); 
alert(everyResult);  //false 
 
var someResult = numbers.some(function(item,index,array){ 
    return item > 2; 
}); 
alert(someResult);  //true 
 
var filterResult = numbers.filter(function(item,index,array){ 
    return item > 2; 
}); 
alert(filterResult);  //3,4,5,4,3 
 
var mapResult = numbers.map(function(item,index,array){ 
    return item*2; 
}); 
 
alert(mapResult);//2,4,6,8,10,8,6,4,2 
 
numbers.forEach(function(item,index,array){ 
    //TODO 
}); 
*/  
//8、reduce()\reduceRight(): 遍历数组所有项,构建一个最终返回值  
//reduce():  从前向后遍历,reduceRight() :从后项前遍历  
//接收四个参数: 前一个值,当前值,项索引,数组对象  
//函数返回值作为第一个参数自动传递给下一项。  
  
//使用reduce()求和  
var numbers = [1,2,3,4,5,6,7,8,9,10];  
var sum = numbers.reduce(function(prev,cur,index,array){  
    return prev + cur;  
});  
alert(sum); //55  

pupload上传文件

因为涉及到跨域问题,放弃了uploadify,用这个实现了。

包含进来这个文件 plupload.full.min.js

<script>
 var uploader = new plupload.Uploader({
	runtimes : 'html5,flash,silverlight,html4',
	browse_button : 'file', // you can pass an id...
	container: document.getElementById('container'), // ... or DOM Element itself
	url : 'http://xxxx',
	flash_swf_url : '/assets/lib/pupload/js/Moxie.swf',
	silverlight_xap_url : '/assets/lib/pupload/js/Moxie.xap',
	
	filters : {
		max_file_size : '10mb',
		mime_types: [
			{title : "Image files", extensions : "jpg,gif,png"},
			{title : "Zip files", extensions : "zip"}
		]
	},

	init: {
		PostInit: function() {
			document.getElementById('filelist').innerHTML = '';

			document.getElementById('uploadfiles').onclick = function() {
				uploader.start();
				return false;
			};
		},

		FilesAdded: function(up, files) {
			plupload.each(files, function(file) {
				document.getElementById('filelist').innerHTML += '<div id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ') <b></b></div>';
			});
		},
        FileUploaded:function(up, file,res) {
            
            var re_data = eval('(' + res.response + ')');
            var  id = re_data.id;
            var  img_server_url = re_data.img_server_url;
            var  ok_url = img_server_url + '/crop/xl/c/'+id;
            //alert(ok_url)
            $("input[name='push_icon']").val(ok_url);
             $("#push_icon_show").attr('src',ok_url);
        },
		UploadComplete:function(up, file) {
			
		},
		UploadProgress: function(up, file) {
			document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
		},

		Error: function(up, err) {
		      alert(err.message);
			//document.getElementById('console').appendChild(document.createTextNode("\nError #" + err.code + ": " + err.message));
		}
	}
});

uploader.init();

function reloadPage()
{
	location.reload();
}
</script>

»»阅读全文

uploadify3.1版本参数使用详解

我用的代码 这个有一个弊端 就是跨域上传的时候 需要目标服务器 有crossdomain.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
 <allow-access-from domain="weichangdong.com" />
</cross-domain-policy>

<script type="text/javascript">
$(function() {
 $("#file").uploadify({
 'debug'    : false,
 'swf': 'uploadify.swf',//所需要的flash文件
 'cancelImg': 'uploadify-cancel.png',//单个取消上传的图片
 'script': 'uploadify.php',//实现上传的程序
 'uploader': 'uploadify.php',//实现上传的程序
 'auto': false,//自动上传
 'multi': true,//是否多文件上传
 'displayData': 'speed',//进度条的显示方式
 //'onInit':function(){alert("1");},
 'onUploadSuccess':function(file,response,data){
	 alert(response);
	 alert(data);
    var allData = eval('(' + data + ')');//通过这个 可以解析返回的json数据
	 alert(allData.ret);
 }
 });
 });
</script>


id: jQuery(this).attr('id'),//绑定的input的ID

      langFile: 'http://www.static-xxx.nu/uploader/uploadifyLang_en.js',//语言包的路径,能设置所有的提示文字

      swf: 'http://www.static-xxx.nu/uploader/uploadify.swf',//[必须设置]swf的路径

      uploader: '/uploadify/galleri.php',//[必须设置]上传文件触发的url

      auto:false,//文件选择完成后,是否自动上传

      buttonText:'Välj Filer',//上传按钮的文字

      height: 30,//上传按钮的高和宽

      width: 120,

formData

      buttonCursor: 'pointer',//上传鼠标hover后Cursor的形状

      cancelImage: 'http://www.static-xxx.nu/uploadify-cancel.png',//[必须设置]取消图片的路径

      checkExisting:'/uploader/uploadify-check-existing.php',//检查上传文件是否存,触发的url,返回1/0

      debug: true,//debug模式开/关,打开后会显示debug时的信息

      fileObjName:'file',

      fileSizeLimit : 0,//文件的极限大小,以字节为单位,0为不限制。1MB:1*1024*1024

      fileTypeDesc: 'Bild JPG',//允许上传的文件类型的描述,在弹出的文件选择框里会显示

      fileTypeExts: '*.jpg',//允许上传的文件类型,限制弹出文件选择框里能选择的文件

      method: 'post',//和后台交互的方式:post/get

      multi: true,//是否能选择多个文件

      queueID: 'fileQueue',//显示上传文件队列的元素id,可以简单用一个div来显示

      queueSizeLimit : 999,//队列中允许的最大文件数目

      progressData : 'all', // 'percentage''speed''all'//队列中显示文件上传进度的方式:all-上传速度+百分比,percentage-百分比,speed-上传速度

      removeCompleted : true,//上传成功后的文件,是否在队列中自动删除

      removeTimeout: 3,

      requeueErrors : true,

      postData: {},//和后台交互时,附加的参数

      preventCaching : true,

      transparent: true,

      successTimeout : 30,//上传时的

      timeoutuploadLimit:999//能同时上传的文件数目

»»阅读全文

NodeJS应用场景

每次学习一个新的语言,我就会先看看他应用的场景。之前学了一阵子lua,主要的应用场景是和nginx配合,我觉得还是挺有用的,暂时只是学了一点皮毛,等到实际需要的时候在深入学习。

之前看到一个网站有一个功能,就是实时统计网站在线人数,打开网页个数的功能,我觉得很牛逼,一看原来是nodejs实现的,就想了解了解nodejs。之前也在网上找了一个nodejs写的聊天系统,虽然没多少代码,但是聊天系统基本功能还是实现了。

»»阅读全文