#2547
展开↯#2548
作者:广西柳州市
一个完整的ajax包,包括了错误处理,超时处理等功能
使用Ajax
使用Ajax的步骤主要有:创建Ajax对象,Ajax对象打开连接,Ajax对象发送数据,Ajax获得响应。
1. 创建Ajax对象
不同的浏览器有着不同的创建方法,因此我们需要封装一个创建Ajax对象的方法,大部分标准浏览器都支持原生的XMLHttpRequest对象,因此我们首先检测是否存在XHR对象方法,存在则直接调用,否则我们定义一个XMLHttpRequest方法。
[javascript] view plaincopy
//自运行函数,用于创建XMLHttpRequest方法
(function() {
//存在原生的XHR,直接返回
if( typeof XMLHttpRequst !== 'undefined') {
return;
} else if( typeof ActiveXObject !== 'undefined') {//否则判断ActiveXObject
XMLHttpRequest = function() {
if( typeof arguments.callee.activeXString !== 'string') {
var versions = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
for(var i = 0, len = versions.length; i < len; ++i) {
try {
var xhr = new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
return xhr;
} catch(ex) {
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
};
} else{
XMLHttpRequest = function(){
throw new Error('No XHR object available');
};
}
})();
2. 打开连接
通过第1步的代码,我们可以首先创建一个AJAX对象: var xhr = new XMLHttpRequest(); 接着打开连接xml.open("GET", "/some/url.cgi", true);
当然,我们通过后台异步的发送请求,自然先要对请求参数进行序列化,以下是一个序列化函数:
[javascript] view plaincopy
//表单数据序列化,支持两种不同的对象:
//-表单输入元素的数组
//-键/值对的散列表
//返回串行化后的字符串
var serialize = function(a){
var s = [];
if(a instanceof Array){
for (var i=0, len = a.length; i<len; ++i) {
s.push(a[i].name + '=' + encodeURIComponent(a[i].value));
};
} else{
for(var k in a){
s.push(k + '=' + encodeURIComponent(a[k]));
}
}
return s.join('&');
};
3.发送请求
发送GET请求则可以按如下步骤:
[javascript] view plaincopy
<pre name="code" class="javascript"><pre name="code" class="javascript">var xhr = new XMLHttpRequest();
xhr.open('GET', "/some/url.cgi?"+serialize(data), true);
xhr.send(null); //参数null对某些浏览器来说是必须的
发送POST的请求则需要先设置请求头的MIME类型,通常是application/x-www-form-urlencoded, 一个简单的示例如下:
[javascript] view plaincopy
<pre name="code" class="javascript" style="margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; background-color: rgb(240, 240, 240); ">var xhr = new XMLHttpRequest();
xhr.open('POST', "/some/url.cgi?", true);
xhr.setRequestHeader("Content-Type","application/x-www-urlencoded");
xhr.send(serialize(data));
4. 处理HTTP响应
在收到响应后,响应的数据会自动填充XHR对象的属性:
responseText:作为响应主体被返回的文本
respinseXML: 如果响应的内容类型是"text/xml"或"application/xml",这个属性将保存包含着响应数据的XML DOM文档
status: 响应的HTTP状态
statusText:HTTP状态的说明
在接到响应后,第一步是检查status属性,以确定响应已经成功返回。一般来说,可以将HTTP状态代码为200作为成功标志,此外状态码304表示请求的资源没有被修改,可以直接使用浏览器中缓存的版本,因此应该检测这两种属性。
当收到响应时,可以检测XHR对象的readyState属性,该属性表示请求/响应过程中的当前活动状态,且当readyState属性的值由一个变成另一个时,会触发一次readyStatechange事件,可以利用这个事件来检测每次状态变化后的readyState的值。 readyState的值有以下几种:
0:未初始化。尚未调用open()方法。
1:启动。已经调用open()方法,但尚未调用send()方法。
2:发送。已经调用send()方法,但尚未收到响应。
3:接收。已经接收到部分响应数据。
4:完成。已经接收到全部响应数据,而且已经可以在客户端使用了。
另外,在IE8中,还为XHR对象添加了一个timeout属性,表示请求在等待响应多少毫秒后就终止,在给timeout设置一个数值后,如果在规定时间内浏览器还未收到响应,那么会触发一个timeout事件,进而会调用ontimeout事件处理程序。当然为了保持跨浏览器的运行,我们可以自行模拟一个超时响应。
有了以上的介绍,我们则可以开发出一个完整的ajax包,包括了错误处理,超时处理等功能。代码如下:
[javascript] view plaincopy
//一个封装好的ajax对象
var ajax = {};
//检查服务器HTTP响应的成功状态
ajax.httpSuccess = function(xhr){
return xhr.status >= 200 && xhr.status < 300 || xhr.status == 304;
};
//发起一个ajax请求,opt为传入的设置参数对象
ajax.request = function(opt){
//如果没有提供某个选项的值,就用默认值代替
opt = {
//请求方法
method: opt.method || "POST",
//请求的URL
url:opt.url || "",
//请求超时的时间
timeout: opt.timeout || 5000,
//请求失败、成功或完成(不管成功还是失败都会调用)时执行的函数
complete: opt.complete || function(){},
error: opt.error || function(){},
success: opt.success || function(){},
//发送的请求参数
params: opt.params || ""
};
var xhr = new XMLHttpRequest(), //创建xhr对象
timeout = opt.timeout,//保存超时时间,默认5秒
requestDone = false,//标志请求是否完成
params = XX.serialize(opt.params); //GET请求的话则将参数序列化接到url后面
if(params !== '' && opt.method === 'GET'){
params = '?' + params;
opt.url += params;
}
//初始化xhr
xhr.open(opt.method, opt.url, true);
//初始化一个5秒的回调函数,用于取消请求(如果尚未完成的话)
setTimeout(function(){
requestDone = true;
}, timeout);
//监听文档状态的更新
xhr.onreadystatechange = function(){
//保持等待,直到数据完全加载,并保证请求未超时
if(xhr.readyState == 4 && !requestDone){
if(XX.ajax.httpSuccess(xhr)){
//成功则调用回调函数,并传入xhr对象
opt.success(xhr, xhr.responseText)
} else {
//发生错误
opt.error();
}
//调用完成回调函数
opt.complete();
//避免内存泄漏,清理文档
xhr = null;
}
};
if(opt.method === 'POST'){
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(params); //若为POST请求,则需序列化数据
} else{
xhr.send(null);
}
};
使用Ajax
使用Ajax的步骤主要有:创建Ajax对象,Ajax对象打开连接,Ajax对象发送数据,Ajax获得响应。
1. 创建Ajax对象
不同的浏览器有着不同的创建方法,因此我们需要封装一个创建Ajax对象的方法,大部分标准浏览器都支持原生的XMLHttpRequest对象,因此我们首先检测是否存在XHR对象方法,存在则直接调用,否则我们定义一个XMLHttpRequest方法。
[javascript] view plaincopy
//自运行函数,用于创建XMLHttpRequest方法
(function() {
//存在原生的XHR,直接返回
if( typeof XMLHttpRequst !== 'undefined') {
return;
} else if( typeof ActiveXObject !== 'undefined') {//否则判断ActiveXObject
XMLHttpRequest = function() {
if( typeof arguments.callee.activeXString !== 'string') {
var versions = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
for(var i = 0, len = versions.length; i < len; ++i) {
try {
var xhr = new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
return xhr;
} catch(ex) {
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
};
} else{
XMLHttpRequest = function(){
throw new Error('No XHR object available');
};
}
})();
2. 打开连接
通过第1步的代码,我们可以首先创建一个AJAX对象: var xhr = new XMLHttpRequest(); 接着打开连接xml.open("GET", "/some/url.cgi", true);
当然,我们通过后台异步的发送请求,自然先要对请求参数进行序列化,以下是一个序列化函数:
[javascript] view plaincopy
//表单数据序列化,支持两种不同的对象:
//-表单输入元素的数组
//-键/值对的散列表
//返回串行化后的字符串
var serialize = function(a){
var s = [];
if(a instanceof Array){
for (var i=0, len = a.length; i<len; ++i) {
s.push(a[i].name + '=' + encodeURIComponent(a[i].value));
};
} else{
for(var k in a){
s.push(k + '=' + encodeURIComponent(a[k]));
}
}
return s.join('&');
};
3.发送请求
发送GET请求则可以按如下步骤:
[javascript] view plaincopy
<pre name="code" class="javascript"><pre name="code" class="javascript">var xhr = new XMLHttpRequest();
xhr.open('GET', "/some/url.cgi?"+serialize(data), true);
xhr.send(null); //参数null对某些浏览器来说是必须的
发送POST的请求则需要先设置请求头的MIME类型,通常是application/x-www-form-urlencoded, 一个简单的示例如下:
[javascript] view plaincopy
<pre name="code" class="javascript" style="margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; background-color: rgb(240, 240, 240); ">var xhr = new XMLHttpRequest();
xhr.open('POST', "/some/url.cgi?", true);
xhr.setRequestHeader("Content-Type","application/x-www-urlencoded");
xhr.send(serialize(data));
4. 处理HTTP响应
在收到响应后,响应的数据会自动填充XHR对象的属性:
responseText:作为响应主体被返回的文本
respinseXML: 如果响应的内容类型是"text/xml"或"application/xml",这个属性将保存包含着响应数据的XML DOM文档
status: 响应的HTTP状态
statusText:HTTP状态的说明
在接到响应后,第一步是检查status属性,以确定响应已经成功返回。一般来说,可以将HTTP状态代码为200作为成功标志,此外状态码304表示请求的资源没有被修改,可以直接使用浏览器中缓存的版本,因此应该检测这两种属性。
当收到响应时,可以检测XHR对象的readyState属性,该属性表示请求/响应过程中的当前活动状态,且当readyState属性的值由一个变成另一个时,会触发一次readyStatechange事件,可以利用这个事件来检测每次状态变化后的readyState的值。 readyState的值有以下几种:
0:未初始化。尚未调用open()方法。
1:启动。已经调用open()方法,但尚未调用send()方法。
2:发送。已经调用send()方法,但尚未收到响应。
3:接收。已经接收到部分响应数据。
4:完成。已经接收到全部响应数据,而且已经可以在客户端使用了。
另外,在IE8中,还为XHR对象添加了一个timeout属性,表示请求在等待响应多少毫秒后就终止,在给timeout设置一个数值后,如果在规定时间内浏览器还未收到响应,那么会触发一个timeout事件,进而会调用ontimeout事件处理程序。当然为了保持跨浏览器的运行,我们可以自行模拟一个超时响应。
有了以上的介绍,我们则可以开发出一个完整的ajax包,包括了错误处理,超时处理等功能。代码如下:
[javascript] view plaincopy
//一个封装好的ajax对象
var ajax = {};
//检查服务器HTTP响应的成功状态
ajax.httpSuccess = function(xhr){
return xhr.status >= 200 && xhr.status < 300 || xhr.status == 304;
};
//发起一个ajax请求,opt为传入的设置参数对象
ajax.request = function(opt){
//如果没有提供某个选项的值,就用默认值代替
opt = {
//请求方法
method: opt.method || "POST",
//请求的URL
url:opt.url || "",
//请求超时的时间
timeout: opt.timeout || 5000,
//请求失败、成功或完成(不管成功还是失败都会调用)时执行的函数
complete: opt.complete || function(){},
error: opt.error || function(){},
success: opt.success || function(){},
//发送的请求参数
params: opt.params || ""
};
var xhr = new XMLHttpRequest(), //创建xhr对象
timeout = opt.timeout,//保存超时时间,默认5秒
requestDone = false,//标志请求是否完成
params = XX.serialize(opt.params); //GET请求的话则将参数序列化接到url后面
if(params !== '' && opt.method === 'GET'){
params = '?' + params;
opt.url += params;
}
//初始化xhr
xhr.open(opt.method, opt.url, true);
//初始化一个5秒的回调函数,用于取消请求(如果尚未完成的话)
setTimeout(function(){
requestDone = true;
}, timeout);
//监听文档状态的更新
xhr.onreadystatechange = function(){
//保持等待,直到数据完全加载,并保证请求未超时
if(xhr.readyState == 4 && !requestDone){
if(XX.ajax.httpSuccess(xhr)){
//成功则调用回调函数,并传入xhr对象
opt.success(xhr, xhr.responseText)
} else {
//发生错误
opt.error();
}
//调用完成回调函数
opt.complete();
//避免内存泄漏,清理文档
xhr = null;
}
};
if(opt.method === 'POST'){
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(params); //若为POST请求,则需序列化数据
} else{
xhr.send(null);
}
};
文章:Web前端的35个jQuery小技巧 发表时间:2016-05-26, 14:37:30
#2551
作者:广西柳州市
抽气降低压强到一定程度水就会沸腾。一边抽气,一边降低温度,到零度的时候,压强低到一定程度就开始沸腾,可这时候又是冰点,于是一边沸腾一边结冰
文章:高中生不知道的13个科学事实 发表时间:2016-05-25, 10:15:32
#2553
作者:广西柳州市
007: 俗话说,上梁不正下梁歪,你那些手下比你还贪婪,亏你还有脸站在忠党爱国这四个字的前面,中国有你这样的大魔头,老百姓是不会有好日子过的,我今天一定要为民除害。
司令:就凭你们两个废物……
文西:(把外衣一脱)废物?!我费了一生的精力,集合十种杀人武器于一身的超级武器霸王,名字就叫做要你命3000,终于研究成功了。阿七,靠边一点,远一点,再远一点。
司令:是吗?那我倒真想见识见识。
文西 要你命3000,(提出一串烂东西)西瓜刀、铁链、火药、硫酸、毒药、手枪、手榴弹、杀虫剂,每样都能独当一面,现在集中在一起,看你怕不怕?
司令:你这个老神经病,快点去死吧。
文西:哎等一等。(手一伸,没说完子弹穿透手臂,倒下。)
007:文西!
文西:阿七,全靠你了。
007:事到如今,没别的办法,(脱帽,脱外套)我只有单刀赴会。
司令:就凭你们两个废物……
文西:(把外衣一脱)废物?!我费了一生的精力,集合十种杀人武器于一身的超级武器霸王,名字就叫做要你命3000,终于研究成功了。阿七,靠边一点,远一点,再远一点。
司令:是吗?那我倒真想见识见识。
文西 要你命3000,(提出一串烂东西)西瓜刀、铁链、火药、硫酸、毒药、手枪、手榴弹、杀虫剂,每样都能独当一面,现在集中在一起,看你怕不怕?
司令:你这个老神经病,快点去死吧。
文西:哎等一等。(手一伸,没说完子弹穿透手臂,倒下。)
007:文西!
文西:阿七,全靠你了。
007:事到如今,没别的办法,(脱帽,脱外套)我只有单刀赴会。

文章:细数电影里那些酷炫的杀器 发表时间:2016-05-19, 15:51:31
#2557
作者:广西南宁市
<?php
/**
* @author 至尊王者
* @author Link http://home.cnblogs.com/u/flying_bat/
* @developer Zjmainstay
* @developer Link http://www.zjmainstay.cn
* @usage
* MysqlDump::dbDump('localhost', 'zjmainstay', '', 'test', 't_trade', 'tmp.sql');
*/
class MysqlDump {
/**
* 数据库内容导出
* @param $host database host
* @param $user username
* @param $pwd password
* @param $db database name
* @param $table only dump one table
* @param $filename custom file to write output content
*/
public static function dbDump($host, $user, $pwd, $db, $table = null, $filename = null) {
$mysqlconlink = mysql_connect($host, $user, $pwd, true);
if (!$mysqlconlink)
echo sprintf('No MySQL connection: %s',mysql_error())."<br/>";
mysql_set_charset( 'utf8', $mysqlconlink );
$mysqldblink = mysql_select_db($db,$mysqlconlink);
if (!$mysqldblink)
echo sprintf('No MySQL connection to database: %s',mysql_error())."<br/>";
$tabelstobackup = array();
$result = mysql_query("SHOW TABLES FROM `$db`");
if (!$result)
echo sprintf('Database error %1$s for query %2$s', mysql_error(), "SHOW TABLE STATUS FROM `$db`;")."<br/>";
while ($data = mysql_fetch_row($result)) {
if(empty($table)) {
$tabelstobackup[] = $data[0];
} else if(strtolower($data[0]) == strtolower($table)){ //only dump one table
$tabelstobackup[] = $data[0];
break;
}
}
if (count($tabelstobackup)>0) {
$result=mysql_query("SHOW TABLE STATUS FROM `$db`");
if (!$result)
echo sprintf('Database error %1$s for query %2$s', mysql_error(), "SHOW TABLE STATUS FROM `$db`;")."<br/>";
while ($data = mysql_fetch_assoc($result)) {
$status[$data['Name']]=$data;
}
if(!isset($filename)) {
$date = date('YmdHis');
$filename = "{$db}.{$date}.sql";
}
if ($file = fopen($filename, 'wb')) {
fwrite($file, "-- ---------------------------------------------------------\n");
fwrite($file, "-- Database Name: $db\n");
if(empty($table)) { //if not only dump single table, dump database create sql
self::_db_dump_create_database($db, $file);
}
fwrite($file, "-- ---------------------------------------------------------\n\n");
fwrite($file, "/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\n");
fwrite($file, "/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\n");
fwrite($file, "/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\n");
fwrite($file, "/*!40101 SET NAMES '".mysql_client_encoding()."' */;\n");
fwrite($file, "/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;\n");
fwrite($file, "/*!40103 SET TIME_ZONE='".mysql_result(mysql_query("SELECT @@time_zone"),0)."' */;\n");
fwrite($file, "/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;\n");
fwrite($file, "/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\n");
fwrite($file, "/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;\n");
fwrite($file, "/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;\n\n");
foreach($tabelstobackup as $table) {
echo sprintf('Dump database table "%s"',$table)."<br/>";
self::need_free_memory(($status[$table]['Data_length']+$status[$table]['Index_length'])*3);
self::_db_dump_table($table,$status[$table],$file);
}
fwrite($file, "\n");
fwrite($file, "/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;\n");
fwrite($file, "/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;\n");
fwrite($file, "/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;\n");
fwrite($file, "/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;\n");
fwrite($file, "/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n");
fwrite($file, "/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n");
fwrite($file, "/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n");
fwrite($file, "/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;\n");
fclose($file);
echo 'Database dump done!'."<br/>";
} else {
echo 'Can not create database dump!'."<br/>";
}
} else {
echo 'No tables to dump'."<br/>";
}
}
protected static function _db_dump_create_database($dbname, $file) {
$sql = "SHOW CREATE DATABASE `".$dbname."`";
$result=mysql_query($sql);
if (!$result) {
echo sprintf('Database error %1$s for query %2$s', mysql_error(), $sql)."<br/>";
return false;
}
$dbstruc=mysql_fetch_assoc($result);
fwrite($file, str_ireplace('CREATE DATABASE', 'CREATE DATABASE IF NOT EXISTS', $dbstruc['Create Database']).";\n");
fwrite($file, "USE `{$dbname}`;\n");
}
protected static function _db_dump_table($table,$status,$file) {
fwrite($file, "\n");
fwrite($file, "--\n");
fwrite($file, "-- Table structure for table $table\n");
fwrite($file, "--\n\n");
fwrite($file, "DROP TABLE IF EXISTS `" . $table . "`;\n");
fwrite($file, "/*!40101 SET @saved_cs_client = @@character_set_client */;\n");
fwrite($file, "/*!40101 SET character_set_client = '".mysql_client_encoding()."' */;\n");
$result=mysql_query("SHOW CREATE TABLE `".$table."`");
if (!$result) {
echo sprintf('Database error %1$s for query %2$s', mysql_error(), "SHOW CREATE TABLE `".$table."`")."<br/>";
return false;
}
$tablestruc=mysql_fetch_assoc($result);
fwrite($file, $tablestruc['Create Table'].";\n");
fwrite($file, "/*!40101 SET character_set_client = @saved_cs_client */;\n");
$result=mysql_query("SELECT * FROM `".$table."`");
if (!$result) {
echo sprintf('Database error %1$s for query %2$s', mysql_error(), "SELECT * FROM `".$table."`")."<br/>";
return false;
}
fwrite($file, "--\n");
fwrite($file, "-- Dumping data for table $table\n");
fwrite($file, "--\n\n");
if ($status['Engine']=='MyISAM')
fwrite($file, "/*!40000 ALTER TABLE `".$table."` DISABLE KEYS */;\n");
while ($data = mysql_fetch_assoc($result)) {
$keys = array();
$values = array();
foreach($data as $key => $value) {
if($value === NULL)
$value = "NULL";
elseif($value === "" or $value === false)
$value = "''";
elseif(!is_numeric($value))
$value = "'".mysql_real_escape_string($value)."'";
$values[] = $value;
}
fwrite($file, "INSERT INTO `".$table."` VALUES ( ".implode(", ",$values)." );\n");
}
if ($status['Engine']=='MyISAM')
fwrite($file, "/*!40000 ALTER TABLE ".$table." ENABLE KEYS */;\n");
}
protected static function need_free_memory($memneed) {
if (!function_exists('memory_get_usage'))
return;
$needmemory=@memory_get_usage(true) + self::inbytes($memneed);
if ($needmemory > self::inbytes(ini_get('memory_limit'))) {
$newmemory=round($needmemory/1024/1024)+1 .'M';
if ($needmemory>=1073741824)
$newmemory=round($needmemory/1024/1024/1024) .'G';
if ($oldmem=@ini_set('memory_limit', $newmemory))
echo sprintf('Memory increased from %1$s to %2$s','backwpup',$oldmem,@ini_get('memory_limit'))."<br/>";
else
echo sprintf('Can not increase memory limit is %1$s','backwpup',@ini_get('memory_limit'))."<br/>";
}
}
protected static function inbytes($value) {
$multi = strtoupper(substr(trim($value), -1));
$bytes = abs((int)trim($value));
if ($multi=='G')
$bytes=$bytes*1024*1024*1024;
if ($multi=='M')
$bytes=$bytes*1024*1024;
if ($multi=='K')
$bytes=$bytes*1024;
return $bytes;
}
}
//highlight_file
highlight_file(__FILE__);Run code
Cut to clipboard
文章:PHP导出数据库方法 发表时间:2016-05-16, 11:24:19
#2558
作者:广西南宁市
a标签的onclick与href的执行顺序
onclick的事件被先执行,其次是href中定义的(页面跳转或者javascript)
同时存在两个定义的时候(onclick与href都定义了),如果想阻止href的动作,在onclick必须加上return false;
在href中定义的函数如果有返回值的话,当前页面的内容将被返回值代替。
A标签触发onclick事件而不跳转
onclick的事件被先执行,其次是href中定义的(页面跳转或者javascript)
同时存在两个定义的时候(onclick与href都定义了),如果想阻止href的动作,在onclick必须加上return false;
在href中定义的函数如果有返回值的话,当前页面的内容将被返回值代替。
A标签触发onclick事件而不跳转
<a href="#" onclick="return test();">href onclick</a>
<script>
function test(){
//alert('teswt');
return false;
//return true;
}
</script>Run code
Cut to clipboard
文章:常用html、demo代码 发表时间:2016-05-12, 17:01:09
#2559
作者:广西南宁市
yourphp
分页手机版本问题移动设备li
分页手机版本问题移动设备li
<?php
$pages= str_ireplace('</a>','</a></li>',$pages);
$pages= str_ireplace('<a','<li style="display: inline-block;"><a',$pages);Run code
Cut to clipboard
文章:常用html、demo代码 发表时间:2016-05-07, 21:31:11
#2560
作者:广西南宁市
CSS Bugs 解决方案
说明:本文档兼容性测试基础环境为:windows系统;IE6-IE10, Firefox6.0, Chrome13.0, Safari5.1, Opera11.51
Bugs及解决方案列表(以下实例默认运行环境都为Standard mode):
如何在IE6及更早浏览器中定义小高度的容器?
方法:
#test{overflow:hidden;height:1px;font-size:0;line-height:0;}
IE6及更早浏览器之所以无法直接定义较小高度的容器是因为默认会有行高
如何解决IE6及更早浏览器浮动时产生双倍边距的BUG?
方法:
#test{display:inline;}
当在IE6及更早浏览器中出现浮动后margin值解析为双倍的情况,设置该元素的display属性为inline即可。
如何在IE6及更早浏览器下模拟min-height效果?
方法:
#test{min-height:100px;_height:100px;}
注意此时#test不能再设置overflow的值为hidden,否则模拟min-height效果将失效
如何解决按钮在IE7及更早浏览器下随着value增多两边留白也随着增加的问题?
方法:
input,button{overflow:visible;}
如何解决IE7及更早浏览器下当li中出现2个或以上的浮动时,li之间产生的空白间隙的BUG?
方法:
li{vertical-align:top;}
除了top值,还可以设置为text-top | middle | bottom | text-bottom,甚至特定的<length>和<percentage>值都可以
如何解决IE6及更早浏览器下的3像素BUG?
方法:
.a{color:#f00;}
.main{width:950px;background:#eee;}
.content{float:left;width:750px;height:100px;background:#ccc;_margin-right:-3px;}
.aside{height:100px;background:#aaa;}
<div class="main">
<div class="content">content</div>
<div class="aside">aside</div>
</div>
在IE6及更早浏览器下为.content设置margin-right:-3px;也可以设置.aside为浮动
如何解决IE6下的文本溢出BUG(江湖匪号:“谍影重重”或“一只猪的故事”)?
BUG重现:
.test{zoom:1;overflow:hidden;width:500px;}
.box1{float:left;width:100px;}
.box2{float:right;width:400px;}
<div class="test">
<div class="box1"></div>
<!-- 注释 -->
<div class="box2">↓这就是多出来的那只猪</div>
</div>
运行如上代码,你会发现文字发生了溢出,在IE6下会多出一只“猪”。造成此BUG的原因可能是多重混合的,如浮动,注释,宽高定义等等。并且注释条数越多,溢出的文本也会随之增多。
列举几个解决方法:
删除box1和box2之间所有的注释;
不设置浮动;
调整box1或box2的宽度,比如将box的宽度调整为90px
如何解决IE6使用滤镜PNG图片透明后,容器内链接失效的问题?
方法:
div{width:300px;height:100px;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='*.png');}
a{_position:relative;}
解决方法是为容器内的链接定义相对定位属性position的值为relative
如何解决IE6无法识别伪对象:first-letter/:first-line的问题?
方法1:
p:first-letter {float:left;font-size:40px;font-weight:bold;}
p:first-line {color:#090;}
增加空格:在伪对象选择符:first-letter/:first-line与包含规则的花括号"{"间增加空格。
方法2:
p:first-letter
{float:left;font-size:40px;font-weight:bold;}
p:first-line
{color:#090;}
换行:将整个花括号"{"规则区域换行。细节参见E:first-letter和E:first-line选择符
如何解决IE8会忽略伪对象:first-letter/:first-line里的!important规则的问题?
BUG重现:
p:first-letter {float:left;font-size:40px;font-weight:bold;color:#f00!important;color:#090;}
如上代码,在IE8下color定义都会失效,原因就是因为有color使用了!important规则。鉴于此,请尽量不要在:first-letter/:first-line里使用!important规则。
如何解决IE6会忽略同一条样式体内的!important规则的问题?
BUG重现:
div{color:#f00!important;color:#000;}
如上代码,IE6及以下浏览器div的文本颜色为#000,!important并没有覆盖后面的规则,也就是说!important被忽略了。解决方案是将该样式拆分为2条,细节参见!important规则
如何解决IE6及更早浏览器下当li内部元素是定义了display:block的内联元素时底部产生空白的问题?
BUG重现:
a,span{display:block;background:#ddd;}
<ul>
<li><a href="../">CSS参考手册</a></li>
<li><a href="../">CSS探索之旅</a></li>
<li><a href="../">web前端实验室</a></li>
<li><span>测试li内部元素为设置了display:block的内联元素时底部产生空白</span></li>
</ul>
如上代码,IE6及更早浏览器每个li内部的内联元素底部都会产生空白。解决方案是给li内部的内联元素再加上zoom:1
如何解决IE6及更早浏览器下未定义宽度的浮动或绝对定位元素会被内部设置了zoom:1的块元素撑开的问题?
BUG重现:
#test{zoom:1;overflow:hidden;border:1px solid #ddd;background:#eee;}
#test h1{float:left;}
#test .nav{float:right;background:#aaa;}
#test .nav ul{zoom:1;overflow:hidden;margin:0;padding:0;list-style:none;}
#test .nav li{float:left;margin:0 5px;}
<div id="test">
<h1>Doyoe</h1>
<div class="nav">
<ul>
<li><a href="../">CSS参考手册</a></li>
<li><a href="../">CSS探索之旅</a></li>
<li><a href="../">web前端实验室</a></li>
</ul>
</div>
</div>
如上代码,IE6及更早浏览器div.nav会被设置了zoom:1的ul给撑开。
列举几个解决方法:
设置ul为浮动元素;
设置ul为inline元素;
设置ul的width
如何解决IE7及更早浏览器下子元素相对定位时父元素overflow属性的auto|hidden失效的问题?
BUG重现:
div{overflow:auto;width:260px;height:80px;border:1px solid #ddd;}
p{position:relative;margin:0;}
<div>
<p>如果我是相对定位,我的父元素overflow属性设置为auto|hidden将失效。如果你使用的是IE及更早浏览器,你将可以看到这个BUG</p>
<p>如果我是相对定位,我的父元素overflow属性设置为auto|hidden将失效。如果你使用的是IE及更早浏览器,你将可以看到这个BUG</p>
</div>
如上代码,在IE7及更早浏览器下你会看到div的滚动条将无法工作。解决方案是给div也设置相对定位position:relative
如何解决Chrome在应用transition时页面闪动的问题?
方法:
-webkit-transform-style:preserve-3d;或-webkit-backface-visibility:hidden;
在Chrome下,使用过渡效果transition时有时会出现页面闪动
说明:本文档兼容性测试基础环境为:windows系统;IE6-IE10, Firefox6.0, Chrome13.0, Safari5.1, Opera11.51
Bugs及解决方案列表(以下实例默认运行环境都为Standard mode):
如何在IE6及更早浏览器中定义小高度的容器?
方法:
#test{overflow:hidden;height:1px;font-size:0;line-height:0;}
IE6及更早浏览器之所以无法直接定义较小高度的容器是因为默认会有行高
如何解决IE6及更早浏览器浮动时产生双倍边距的BUG?
方法:
#test{display:inline;}
当在IE6及更早浏览器中出现浮动后margin值解析为双倍的情况,设置该元素的display属性为inline即可。
如何在IE6及更早浏览器下模拟min-height效果?
方法:
#test{min-height:100px;_height:100px;}
注意此时#test不能再设置overflow的值为hidden,否则模拟min-height效果将失效
如何解决按钮在IE7及更早浏览器下随着value增多两边留白也随着增加的问题?
方法:
input,button{overflow:visible;}
如何解决IE7及更早浏览器下当li中出现2个或以上的浮动时,li之间产生的空白间隙的BUG?
方法:
li{vertical-align:top;}
除了top值,还可以设置为text-top | middle | bottom | text-bottom,甚至特定的<length>和<percentage>值都可以
如何解决IE6及更早浏览器下的3像素BUG?
方法:
.a{color:#f00;}
.main{width:950px;background:#eee;}
.content{float:left;width:750px;height:100px;background:#ccc;_margin-right:-3px;}
.aside{height:100px;background:#aaa;}
<div class="main">
<div class="content">content</div>
<div class="aside">aside</div>
</div>
在IE6及更早浏览器下为.content设置margin-right:-3px;也可以设置.aside为浮动
如何解决IE6下的文本溢出BUG(江湖匪号:“谍影重重”或“一只猪的故事”)?
BUG重现:
.test{zoom:1;overflow:hidden;width:500px;}
.box1{float:left;width:100px;}
.box2{float:right;width:400px;}
<div class="test">
<div class="box1"></div>
<!-- 注释 -->
<div class="box2">↓这就是多出来的那只猪</div>
</div>
运行如上代码,你会发现文字发生了溢出,在IE6下会多出一只“猪”。造成此BUG的原因可能是多重混合的,如浮动,注释,宽高定义等等。并且注释条数越多,溢出的文本也会随之增多。
列举几个解决方法:
删除box1和box2之间所有的注释;
不设置浮动;
调整box1或box2的宽度,比如将box的宽度调整为90px
如何解决IE6使用滤镜PNG图片透明后,容器内链接失效的问题?
方法:
div{width:300px;height:100px;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='*.png');}
a{_position:relative;}
解决方法是为容器内的链接定义相对定位属性position的值为relative
如何解决IE6无法识别伪对象:first-letter/:first-line的问题?
方法1:
p:first-letter {float:left;font-size:40px;font-weight:bold;}
p:first-line {color:#090;}
增加空格:在伪对象选择符:first-letter/:first-line与包含规则的花括号"{"间增加空格。
方法2:
p:first-letter
{float:left;font-size:40px;font-weight:bold;}
p:first-line
{color:#090;}
换行:将整个花括号"{"规则区域换行。细节参见E:first-letter和E:first-line选择符
如何解决IE8会忽略伪对象:first-letter/:first-line里的!important规则的问题?
BUG重现:
p:first-letter {float:left;font-size:40px;font-weight:bold;color:#f00!important;color:#090;}
如上代码,在IE8下color定义都会失效,原因就是因为有color使用了!important规则。鉴于此,请尽量不要在:first-letter/:first-line里使用!important规则。
如何解决IE6会忽略同一条样式体内的!important规则的问题?
BUG重现:
div{color:#f00!important;color:#000;}
如上代码,IE6及以下浏览器div的文本颜色为#000,!important并没有覆盖后面的规则,也就是说!important被忽略了。解决方案是将该样式拆分为2条,细节参见!important规则
如何解决IE6及更早浏览器下当li内部元素是定义了display:block的内联元素时底部产生空白的问题?
BUG重现:
a,span{display:block;background:#ddd;}
<ul>
<li><a href="../">CSS参考手册</a></li>
<li><a href="../">CSS探索之旅</a></li>
<li><a href="../">web前端实验室</a></li>
<li><span>测试li内部元素为设置了display:block的内联元素时底部产生空白</span></li>
</ul>
如上代码,IE6及更早浏览器每个li内部的内联元素底部都会产生空白。解决方案是给li内部的内联元素再加上zoom:1
如何解决IE6及更早浏览器下未定义宽度的浮动或绝对定位元素会被内部设置了zoom:1的块元素撑开的问题?
BUG重现:
#test{zoom:1;overflow:hidden;border:1px solid #ddd;background:#eee;}
#test h1{float:left;}
#test .nav{float:right;background:#aaa;}
#test .nav ul{zoom:1;overflow:hidden;margin:0;padding:0;list-style:none;}
#test .nav li{float:left;margin:0 5px;}
<div id="test">
<h1>Doyoe</h1>
<div class="nav">
<ul>
<li><a href="../">CSS参考手册</a></li>
<li><a href="../">CSS探索之旅</a></li>
<li><a href="../">web前端实验室</a></li>
</ul>
</div>
</div>
如上代码,IE6及更早浏览器div.nav会被设置了zoom:1的ul给撑开。
列举几个解决方法:
设置ul为浮动元素;
设置ul为inline元素;
设置ul的width
如何解决IE7及更早浏览器下子元素相对定位时父元素overflow属性的auto|hidden失效的问题?
BUG重现:
div{overflow:auto;width:260px;height:80px;border:1px solid #ddd;}
p{position:relative;margin:0;}
<div>
<p>如果我是相对定位,我的父元素overflow属性设置为auto|hidden将失效。如果你使用的是IE及更早浏览器,你将可以看到这个BUG</p>
<p>如果我是相对定位,我的父元素overflow属性设置为auto|hidden将失效。如果你使用的是IE及更早浏览器,你将可以看到这个BUG</p>
</div>
如上代码,在IE7及更早浏览器下你会看到div的滚动条将无法工作。解决方案是给div也设置相对定位position:relative
如何解决Chrome在应用transition时页面闪动的问题?
方法:
-webkit-transform-style:preserve-3d;或-webkit-backface-visibility:hidden;
在Chrome下,使用过渡效果transition时有时会出现页面闪动
文章:CSS技巧和经验 发表时间:2016-05-07, 16:14:11
#2561
作者:广西南宁市
CSS 其他技巧
说明:本文档兼容性测试基础环境为:windows系统;IE6-IE10, Firefox6.0, Chrome13.0, Safari5.1, Opera11.51
其它技巧和经验列表(以下实例默认运行环境都为Standard mode):
如何让层在falsh上显示?
方法:
<param name="wmode" value="transparent" />
设置flash的wmode值为transparent或opaque
如何使用标准的方法在页面上插入flash?
方法:
<object id="flash-show" type="application/x-shockwave-flash" data="*.swf">
<param name="movie" value="*.swf" />
<param name="wmode" value="transparent" />
<img src="*.jpg" alt="用于不支持flash或屏蔽flash时显示" />
</object>
至于flash的宽高可以在css里设置
如何在点文字时也选中复选框或单选框?
方法1:
<input type="checkbox" id="chk1" name="chk" /><label for="chk1">选项一</label>
<input type="checkbox" id="chk2" name="chk" /><label for="chk2">选项二</label>
<input type="radio" id="rad1" name="rad" /><label for="rad1">选项一</label>
<input type="radio" id="rad2" name="rad" /><label for="rad2">选项二</label>
该方式所有主流浏览器都支持
方法2:
<label><input type="checkbox" name="chk" />选项一</label>
<label><input type="checkbox" name="chk" />选项二</label>
<label><input type="radio" name="rad" />选项一</label>
<label><input type="radio" name="rad" />选项二</label>
该方式相比方法1更简洁,但IE6及更早浏览器不支持
IE下如何对Standard Mode与Quirks Mode进行切换?
IE6的触发(在DTD申明前加上XML申明):
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html>
IE5.5及更早浏览器版本直接以Quirks Mode解析。
所有IE版本的触发(在DTD申明前加上HTML注释):
<!-- Let IE into quirks mode -->
<!DOCTYPE html>
当没有DTD声明时,所有IE版本也会进入Quirks Mode。
如何区别display:none与visibility:hidden?
方法:
相同的是display:none与visibility:hidden都可以用来隐藏某个元素; 不同的是display:none在隐藏元素的时候,将其占位空间也去掉;而visibility:hidden只是隐藏了内容而已,其占位空间仍然保留。
如何设置IE下的iframe背景透明?
方法:
设置iframe元素的标签属性allowtransparency="allowtransparency"然后设置iframe内部页面的body背景色为transparent。 不过由此会引发IE下一些其它问题,如:设置透明后的iframe将不能遮住select
说明:本文档兼容性测试基础环境为:windows系统;IE6-IE10, Firefox6.0, Chrome13.0, Safari5.1, Opera11.51
其它技巧和经验列表(以下实例默认运行环境都为Standard mode):
如何让层在falsh上显示?
方法:
<param name="wmode" value="transparent" />
设置flash的wmode值为transparent或opaque
如何使用标准的方法在页面上插入flash?
方法:
<object id="flash-show" type="application/x-shockwave-flash" data="*.swf">
<param name="movie" value="*.swf" />
<param name="wmode" value="transparent" />
<img src="*.jpg" alt="用于不支持flash或屏蔽flash时显示" />
</object>
至于flash的宽高可以在css里设置
如何在点文字时也选中复选框或单选框?
方法1:
<input type="checkbox" id="chk1" name="chk" /><label for="chk1">选项一</label>
<input type="checkbox" id="chk2" name="chk" /><label for="chk2">选项二</label>
<input type="radio" id="rad1" name="rad" /><label for="rad1">选项一</label>
<input type="radio" id="rad2" name="rad" /><label for="rad2">选项二</label>
该方式所有主流浏览器都支持
方法2:
<label><input type="checkbox" name="chk" />选项一</label>
<label><input type="checkbox" name="chk" />选项二</label>
<label><input type="radio" name="rad" />选项一</label>
<label><input type="radio" name="rad" />选项二</label>
该方式相比方法1更简洁,但IE6及更早浏览器不支持
IE下如何对Standard Mode与Quirks Mode进行切换?
IE6的触发(在DTD申明前加上XML申明):
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html>
IE5.5及更早浏览器版本直接以Quirks Mode解析。
所有IE版本的触发(在DTD申明前加上HTML注释):
<!-- Let IE into quirks mode -->
<!DOCTYPE html>
当没有DTD声明时,所有IE版本也会进入Quirks Mode。
如何区别display:none与visibility:hidden?
方法:
相同的是display:none与visibility:hidden都可以用来隐藏某个元素; 不同的是display:none在隐藏元素的时候,将其占位空间也去掉;而visibility:hidden只是隐藏了内容而已,其占位空间仍然保留。
如何设置IE下的iframe背景透明?
方法:
设置iframe元素的标签属性allowtransparency="allowtransparency"然后设置iframe内部页面的body背景色为transparent。 不过由此会引发IE下一些其它问题,如:设置透明后的iframe将不能遮住select
文章:CSS技巧和经验 发表时间:2016-05-07, 16:13:30
#2563
作者:广西南宁市
17. 不要直接使用 $_SESSION 变量。也可以公共文件中不同name区分,其他就不用改了:
session_name('MANAGER');
session_start();
19. 使用str_replace取代preg_replace 。使用strtr代替str_replace
为啥不能用行if?? $a && ++$a_count;呢
session_name('MANAGER');
session_start();
19. 使用str_replace取代preg_replace 。使用strtr代替str_replace
为啥不能用行if?? $a && ++$a_count;呢
文章:提高PHP代码质量的36计 发表时间:2016-05-05, 10:05:07
#2564
作者:广西南宁市
父容器高度大于子图片高度的原因
div高度比图片高度大。
原因:img是inline元素,有假想元素。基于baseline定位时,父容器高度为假想元素的下半部分高度+图片高度。
解决方法:即消除假想元素影响。可以是 img { display: block; }; 可以是 div { line-height: 0}; 可以是img { vertical-align: middle//也可以是其他值 }; 可以是 div { font-size: 0};
div高度比图片高度大。
原因:img是inline元素,有假想元素。基于baseline定位时,父容器高度为假想元素的下半部分高度+图片高度。
解决方法:即消除假想元素影响。可以是 img { display: block; }; 可以是 div { line-height: 0}; 可以是img { vertical-align: middle//也可以是其他值 }; 可以是 div { font-size: 0};
文章:常用html、demo代码 发表时间:2016-05-04, 14:50:39
软件工程规定写代码的原则是“高内聚,低耦合”。内聚是代码块间的独立性,耦合是各个代码块间的联系。
对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。
代码内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高。所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
高内聚,低耦合的系统有什么好处呢?事实上,短期来看,并没有很明显的好处,甚至短期内会影响系统的开发进度,因为高内聚,低耦合的系统对开发设计人员提出了更高的要求。长期来看,低耦合的模块便于进行单元测试,且便于维护。
举例:
在java中,你想在你的程序中调用某个类比如说是A1,如果你在程序中直接new A1(),这样就写死了。如过下次业务逻辑有变化,你就必须重新修改A1类的代码。在这种情况下,如果A1类被其他的程序调用,你修改了A1类的代码,可能会对其他程序造成影响。
但是如果你在配置文件里配置你要用到的类的相关属性,通过程序动态地区获得,你只用修改这个配置文件,把他指向另一个类A2就行了。用A2替代A1。这就是低耦合,也是java的面向增加开放,面向修改关闭的原则。