CSS和javascript+jQuery技巧小结

一、使用JQuery设置和改变CSS透明度 :

直接使用jQuery设置CSS透明度更直观更容易实现,因为你不需要考虑浏览器的兼容性,在IE下元素是否“haslayout”

$(".dropzone .dz-default.dz-message").css({ opacity: 0.5 }); // 所有浏览器有效
您也可以使用下面的jQuery代码使一个元素动画透明:

代码:

$(".dropzone .dz-default.dz-message").animate({ opacity: 0.5 }, 1000, function() { // 动画完成,所有浏览器下有效  });

不管元素的透明度在动画开始时是多少,它都会渐变到透明度为“0.4”。动画的速度通过值“1000”设定,动画时间以毫秒为单位。代码中的最后一个属性是一个可选回调函数,将在动画完成后执行。

如果该元素的透明度在CSS中已经设定为“0.4”,那在动画运行的时候,你将不会发觉有任何不同,所以动画开始和最终透明度要有所不同。

二、表格单元格宽度的设定和强制折行规定

有时候报表的字段包含文字比较多,如果使用自动布局,表格会有滚动条,对宏观查看整表的数据不是很方便。这时候改用固定布局,强制折行可以解决问题。

所有浏览器都支持 table-layout 属性。该属性有三种取值:


auto 默认。列宽度由单元格内容设定。
fixed 按照你设定的表格宽度或列宽显示数据,不受内容本身宽度影响。
inherit 规定应该从父元素继承 table-layout 属性的值。

注释:任何的版本的 Internet Explorer (包括 IE8)都不支持属性值 "inherit"。

解决方式:CSS代码:

.table { table-layout: fixed; word-wrap: break-word;  }

三、PHP去除数组重复元素

PHP数组去除重复内置函数有array_unique和array_flip。传统使用array_unique函数的效率较低。而array_flip函数比较快,速度提高五倍以上,因为该函数是将每个数组元素的key-value值交换,然后自动覆盖重复的键,再切换回来。

所以建议使用array_flip函数去重。写法:$arr = array_flip(array_flip($arr)); //经过两次可以删除重复元素。

四、jQuery Ajax数据格式json注意事项

Jquery1.4版本以后对json格式要求更加严格,如果设定dataType为json,一定要保证json格式符合json.org网站定义的格式才能执行success回调函数,否则执行onerror异常处理函数。跨域调用时,服务端会接收到一段$_GET['callback']的字符串。你需要在服务端将这段字符串拼接在需要返回的数据的前共同返回。例如在控制器函数中最后这样输出:echo $_GET['callback'] . '(' . json_encode($data) . ')';

JSON格式的大概注意点列一下:
1)键名称:用双引号括起
2)字符串:使用双引号括起
3)数字、布尔类型:不需要使用双引号括起 

援引jQuery API 说明原文:"json": Evaluates the response as JSON and returns a JavaScript object. In jQuery 1.4 the JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. (See json.org for more information on proper JSON formatting.)

目前有许多免费的json在线验证器,如果不确定自己写的json格式是否标准,可以利用诸如JSONLint等在线校验工具,对json进行检验。一个不错的验证网站奉上:http://www.bejson.com/go.php?u=http://www.bejson.com/index.php

如果ajax使用默认格式不强制定义json格式,则服务端echo内容不需要拼接$_GET['callback']的字符串,但是在回调函数中需要通过eval()函数将json字符串转换为js对象,这样返回的data才能以类似data.res的方式调用eval加上圆括号的目的是迫使eval函数在评估JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为 语句(statement)来执行。举一个例子,例如对象{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结 束标记,那么{}将会被认为是执行了一句空语句。如:对json:{"sex":["man"],"address":["zjningbo"],"name":["cssrain"]} 执行eval函数: var jsObject=eval("("+json+")");得到的jsObject是({"sex":["man"],"address":["zjningbo"],"name":["cssrain"]}) 。

列出项目中的代码:

<script type="text/javascript">

	
$(function(){
	$posarea = $(".posarea");
	$postit = $(".posarea .ptit span");
	$(".setpos").click(function(){
		var rid = $(this).parent().siblings('td').eq(0).text();
		var titt = $(this).parent().siblings('td').eq(1).text();
		var tname = $.trim($(this).parent().siblings('td').eq(2).text());
		var typelv;
		var os = $("#resos").val();
		$("#resid").val(rid);
		$postit.text(titt);
		get_pos_data(rid,os);
		if(tname == '文章'){
			typelv = 1;
		}else if(tname == '资源专题'){
			typelv = 3;
		}else if(tname == 'PK'){
			typelv = 4;
		}
		if(typelv){
			$("#restype").val(typelv);
		}else{
			alert("未获取到类型(a_type),请重试");
		}
		$posarea.fadeIn(100);
	});
	$(".closepos").click(function(){
		$posarea.fadeOut();
	});
	$("#ajaxbtn").click(function(){
		var rid = $("#resid").val();
		var os = $("#resos").val();
		var a_type = $("#restype").val();
		update_pos_data(rid,os,a_type);
		$posarea.fadeOut(100);
	});
	//查询状态信息
	function get_pos_data(id,os){

		var str = "";
		$.ajax({
			type : "post",
			url : "http://pmtest.feiliu.com/?c=wansha&a=get_pos&callback=?",
			//dataType : "json",
			data : {"id":id, "os":os},
			success : function(msg) {
				msg = eval('(' + msg + ')');
				if(msg.res === 1){
					$.each(msg.data, function(i,record){
						str += "<li class='positem' id='" +record.id + "'><input type='checkbox' ";
						if(record.status == 1){
							str += " checked='checked' ";
						}
						str += "  /><span>" + record.title + "</span></li>";
					})
					$(".poscontent ul").html(str);
				}

			}	
		});
	}
	//更新状态信息
	function update_pos_data(id, os, a_type){
		var str = "";
		var arr = [], currid, currval;
		$(".poscontent ul li").each(function(i,val){
			var obj = new Object();
			currid = val.id;
			if($(this).children("input:checkbox").attr("checked")){
				currval = 1;
			}else{
				currval = 0;
			}
			obj['posid'] = currid;
			obj['posstatus'] = currval;
			arr.push(obj);
		});
		arr = JSON.stringify(arr);//序列化:将一个js对象或数组转换为一个包含 JSON 文本的字符串。
		$.ajax({
			type : "post",
			url : "http://pmtest.feiliu.com/?c=wansha&a=update_pos&callback=?",
			dataType : "json",
			data : {"id":id, "os":os,"status":arr,"a_type":a_type},
			success : function(sucmsg) {
			if(sucmsg.res==1){
				alert("保存成功");
				//window.location.href="?c=wansha&a=list_article_test";
			} else {
				alert("数据未更新或更新失败!");
			}	
			}	
		});
	}	
	
});

</script>

如果js 中将提交的数据进行了序列化(如通过JSON.stringify()),通过Ajax提交后,有时,浏览器自动转义json数据内部的双引号,加了反斜杠,这里需要接收后PHP过滤去掉,否则会影响PHP识别json格式,致使json_decode不能进行反序列化。

PHP对json格式要求比较严格,最好按照json规定标准化。

下面列出我的控制器controller文件对json的处理代码:


	public function get_pos(){
		$a_id = $_POST['id'] ? $_POST['id'] : '';
		$os = $_POST['os'] ? $_POST['os'] : 'android';
		if($a_id && $os){
			$data = array();
			$data['res'] = 0;
			if($os == 'android'){
				$data['data'] = array(
					0 => array(	
						'title' => '玩啥首页',
						'status' => 0,
						'id' => 115610000
						),
					1 => array(	
						'title' => '玩啥广告位',
						'status' => 0,
						'id' => 115610001
						),
					2 => array(	
						'title' => '游戏中心专题列表',
						'status' => 0,
						'id' => 114510002
						),	
					3 => array(	
						'title' => '游戏中心文章列表',
						'status' => 0,
						'id' => 114510003
						)
				);			
			
			}elseif($os == 'ios'){
				$data['data'] = array(
				0 => array(	
					'title' => '玩啥首页',
					'status' => 0,
					'id' => 115710000
					),
				1 => array(	
					'title' => '玩啥广告位',
					'status' => 0,
					'id' => 115710001
					),
				2 => array(	
					'title' => '游戏中心专题列表',
					'status' => 0,
					'id' => 113310002
					),	
				3 => array(	
					'title' => '游戏中心文章列表',
					'status' => 0,
					'id' => 113310003
					)
				);
			}
			if($os == 'android'){
				if(mod_wansha :: selecthomepage($a_id)){
					$data['data'][0]['status'] = 1;
				}
				if(mod_wansha :: selectadv($a_id)){
					$data['data'][1]['status'] = 1;
				}	

				if(mod_wansha :: select_imgp($a_id, $pid = substr($data['data'][2]['id'],0,-5))){
					$data['data'][2]['status'] = 1;
				}

				if(mod_wansha :: select_ap($a_id, $pid = substr($data['data'][3]['id'],0,-5))){
					$data['data'][3]['status'] = 1;
				}	

				$data['res'] = 1;
			}elseif($os == 'ios'){
				if(mod_wansha :: selecthomepage1157($a_id)){
					$data['data'][0]['status'] = 1;
				}
				if(mod_wansha :: selectadv1157($a_id)){
					$data['data'][1]['status'] = 1;
				}	
				if(mod_wansha :: select_imgp($a_id, $pid = substr($data['data'][2]['id'],0,-5))){
					$data['data'][2]['status'] = 1;
				}

				if(mod_wansha :: select_ap($a_id, $pid = substr($data['data'][3]['id'],0,-5))){
					$data['data'][3]['status'] = 1;
				}
				$data['res'] = 1;
			}

		}
		//echo $_GET['callback'] . '(' . json_encode($data) . ')';
		echo json_encode($data);
	}
	
	
	public function update_pos(){
		$a_id = $_POST['id'] ? $_POST['id'] : '';
		$os = $_POST['os'] ? $_POST['os'] : 'android';
		$a_type = $_GET['a_type'] ? $_GET['a_type'] : 0;
		$newdata['a_id'] = $a_id;
		$newdata['adv_type'] = $a_type;
		$newdata['adv_a_id'] = $a_id;
		$newdata['adv_isexists'] = 0;
		$newdata['adv_sort'] = 0;
		$newdata['ap_sort'] = 0;
		$newdata['ip_sort'] = 0;
		if($a_id){
			$data = array();
			$flag = array();
			$data['data'] = array();
			if($_POST['status']){
				$str = $_POST['status'];
				//为标准化,可给int型/布尔型正则匹配加上双引号
				//$tmpstr = preg_replace('/:(\w+)/is', ':"$1"', $str);
				//浏览器自动转义内部的双引号,加了反斜杠,这里需要PHP过滤去掉,否则会影响PHP识别json格式,json_decode不能进行反序列化。
				$tmpstr = preg_replace('/\\\/', '', $str);
				$tmpstr = trim($tmpstr);	//去除字符串首尾处的空白字符(或者其他字符)
				$data['data'] = json_decode($tmpstr);
				//debug($data['data']);
			}
			
			for($i = 0, $len = count($data['data']); $i < $len; $i++){
				$optionid = substr($data["data"][$i]->posid,-5,5);
				$productid = substr($data['data'][$i]->posid,0,-5);
				$statuscode = $data['data'][$i]->posstatus;
				switch($optionid){
					case 10000:
						if($productid == 1156 && $statuscode == 1 && $os == 'android' && !mod_wansha :: selecthomepage($a_id) ){
							$ret = mod_wansha :: insert_homepage($newdata);
							$flag[$i] = 1;
						}elseif($productid == 1157 && $statuscode == 1 && $os == 'ios' && !mod_wansha :: selecthomepage1157($a_id)){
							$ret = mod_wansha :: insert_homepage1157($newdata);
							$flag[$i] = 1;
						}
						break;
					case 10001:
						if($productid == 1156 && $statuscode == 1 && $os == 'android' && !mod_wansha :: selectadv($a_id) ){
							$ret = mod_wansha :: insert_adv($newdata);
							$flag[$i] = 1;
						}elseif($productid == 1157 && $statuscode == 1 && $os == 'ios' && !mod_wansha :: selectadv1157($a_id)){
							$ret = mod_wansha :: insert_adv1157($newdata);
							$flag[$i] = 1;
						}
						break;
					case 10002:
						if(!mod_wansha :: select_imgp($a_id,$productid) && $statuscode == 1){
							mod_wansha :: insert_imgp($newdata,$productid);
							$flag[$i] = 1;
						}
					case 10003:
						if(!mod_wansha :: select_ap($a_id,$productid) && $statuscode == 1){
							mod_wansha :: insert_ap($newdata,$productid);
							$flag[$i] = 1;
						}
						
						
				}
			}
			if(in_array(1,$flag)){
				$data['res'] = 1;
			}
			
		}
		/*跨域调用的时候,服务端会接收到一段$_GET['callback']的字符串,你需要在服务端将这段字符串拼接在需要返回的数据的前面共同返回*/
		echo $_GET['callback'] . '(' . json_encode($data) . ')';
	}


五、html中表单input元素size属性与maxlength的区别

设定文本框的宽度(size)和最大输入文本长度(maxlength)的关系

size的值小于maxlength的值时,当内容超过输入窗口的长度时会自动滚动;

反之,size的值大于maxlength的值,超过maxlength长度的内容无法输入。

设定文本框的宽度(size)对该文本框的输入限制没有作用,它只是在网页上显示了改文本框 的长度

最大输入文本长度(maxlength)则可以完全的限制输入长度,超过后就不会显示输入的字符

当然,如果再CSS style中定义了input文本框的宽度像素,CSS宽度的优先级要高一些,size的效果在此就不起作用了。


六、oracle中NULL和空字符串

空值没有大小,自然不能进行大于、小于、等于运算。而只能进行is null,is not null的判定。在Oracle中,0长度字符串等同于null,不能直接用等号判断,要用is null判断


七、 文章中富文本内容,移动端对图片进行处理,最好用CSS百分比限制宽度。

项目中,是将pc端的程序移植到了移动段,给安卓客户端程序webView调用。结果安卓程序取文章内容高度怎么都取不到准确的高度,下边总是多出一块空白。后来发现是由于一段图片处理的js造成的。由于图片加载处理完之前,WebView已经发出了取高度请求,此时取到的当然就不准确了。鉴于此,将js处理去掉,改为CSS控制,将内容区域图片都限定为百分比,即可解决webview取不到准确高度的问题。当然了,这样只是适用于移动端,如果pc端和移动端都通用此解决方案的话,PC端图片显示是要失真的,放大的比例太大,用户体验就会下降。

你可能感兴趣的:(JavaScript,json,Ajax,css)