Js中window.onload会覆盖

之前好长时间都注重项目的开发,没有整理一些知识要点,是不是有点自私,其实这是一种懒惰。闲话完毕,转入正题。在前些日子开发完typecho的验证码插件(seccode)之后,在后台的该插件设置页面中加了一个window.onload函数来处理一些事件。但是过了一天,感觉这个好像会被其他插件覆盖,那么这段代码将不会执行,显然这不是我们想要的。

下面代码说明:
<script type="text/javascript">
window.onload=function() {
	alert(123);
}

window.onload=function() {
	alert(345);
}
</script>
上面的程式将会弹出 345,显然可以说明一个问题,函数覆盖了。
接着看下面的代码:
<script type="text/javascript">
window.attachEvent('onload', function(){
	alert(123);
});
window.attachEvent('onload', function(){
	alert(345);
});
</script>
上面的程式将会先弹出 345,然后弹出 123。这说明函数没有覆盖掉,不过要注意是先执行最后绑定的事件。但是这个代码只有在ie下可执行,在FF,chrome下是不行的。
继续往下看,下面的代码将完美实现window.onload不覆盖问题:
<script type="text/javascript">
function fun1() {
	alert(123);
}
function fun2() {
	alert(345);
}
if(document.all) {
	window.attachEvent('onload', fun2);     //注意这里是 fun2
	window.attachEvent('onload', fun1);
} else {
	window.addEventListener('load', fun1);  //注意这里是 fun1
	window.addEventListener('load', fun2);
}
</script>

为了让ie浏览器与其他浏览器,比如chrome,Firfox得到相同的执行结果,请注意区分上面的几行代码。在ie下是先执行后绑定的事件函数,而在其他浏览器中却是先执行先绑定的事件函数,所以这里写的顺序不一样,但是执行结果一样的,都是先执行fun1这个函数。

31
Mar 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS 2 Comments

typecho 绚丽验证码插件(功能齐全)

typecho灌水机好多好多,没有专门放外链,竟然被灌水机发现了。刚开始没发现,过了几天,评论达到数百条,全部是垃圾。typecho后台有个限制设置,可以在一定的程度上加以控制,但是这样的方法太死板,属于一刀切。于是抽了点时间把Discuz中的验证码功能转换成了typecho插件。
可设置的类型:1. 英文图片验证码;2. 中文图片验证码;3. Flash验证码;4. 位图验证码。
对于中、英文验证码可自定义设置项很多,这里就不一一罗列了,要多酷,有多酷,决定权让给你。

阅读剩余部分...

29
Mar 2012
AUTHOR WiFeng
CATEGORY Asset
COMMENTS 34 Comments

Js与PHP中同一个表达式的差异

在好多编程语言中,各自的语法可能会不同,这很正常。不过,运算符之间的差异就需要仔细探讨了,如果不清晰的理解这些微小的差异,很容易混在一起,就会写出可能有bug的程序,这是很严重的问题,这也不是一个“高手”的作风,所以摘出来,分享,研究研究。
谁能更好的解释这一点,不胜感激。

Js 代码如下:
<script>
function fun(script) {
	script = script || 'common_extra';
	alert(script);  
}
fun('common');   //alert common
</script>
PHP代码如下:
<?php
function fun($script) {
	$script = $script || 'common_extra';
	var_dump($script);
}
fun('common');   //output bool(true) 
?> 

28
Mar 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS 5 Comments

解读php中clone方法的适用场合

在php语言中,对象之前相互传递是传其引用,如下:
<?php
class stu {
	public $age;
}

$s1 = new stu();
$s1->age = 2;

$s2 = $s1;
$s2->age = 3;

echo $s1->age;  //output 3
?>
从上面可以看出,$s1,$s2 指向是相同的,修改其中一个的属性值,另一个对应的属性值也在跟着变。普通的变量则是直接重新拷贝一份给其传递,如果对象之间想要实现这种结果,可以的,这就是clone的作用了。如下:
<?php
class stu {
	public $age;
}

$s1 = new stu();
$s1->age = 2;

$s2 = clone $s1;
$s2->age = 3;

echo $s1->age;  //output  2
?>
综上所述,如果想复制一个对象,那就用 clone(克隆)吧,普通的 等号(=) 赋值不是真正的复制,而是把指针指到同一块区域了。
26
Mar 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS 1 Comment

页面中图片如何等比显示

页面中很多时候都需要图片显示其原样,但是有时候图片实际大小与页面中显示区域的大小又有差距,这个怎么办?只有图片等比显示(只是等比缩小,不会等比放大,因为放大会失真,我想哪个产品经理都不想要这样的结果)
虽然之前项目中多次用到,但是没有保存起来,这里就显摆显摆,以后直接复制就可以哦。

用到的Javascript代码如下:
<script type="text/javascript">
function imgsizeauto(obj, width, height) {
	var img = new Image();
	img.src = obj.src;
	
	var realwidth = img.width;
	var realheight = img.height;
	var w_diff = realwidth - width;
	var h_diff = realheight - height;
	if(w_diff > 0 || h_diff > 0) {
		if(w_diff > h_diff) {
			obj.style.width = width + "px";
			obj.style.height = "auto";
		} else {
			obj.style.height = height + "px";
			obj.style.width = "auto";
		}
	} else {
		obj.style.width = "auto";
		obj.style.height = "auto";
	}	
}
</script>
在HTML中像如下这样调用
<img src="C:/Pictures/51syj3j.jpg" width="100" height="200" onload="imgsizeauto(this, 100, 200)" />
<img src="C:/Pictures/Desert.jpg" onload="imgsizeauto(this, 200, 100)" />

需要注意的是:
1. 一定要把这两个示例代码在页面中载入的次序调整对,如果按照上面的写法,那就必须先载入Js 代码,然后才可以写这个<img>,否则会提示脚本错误哦。
2. 为了完全控制图片不乱跑,可以在样式里初始化的时候控制这个<img> 的宽高,或者是标签里加上 width ,height 属性值,虽然在加载的时候图片可能是模糊的,但是那个时间不会超过0.5秒,所以不必多虑。
3. 上面函数的第一个参数值:当前img对象;第二个参数:控制图片显示的最大宽度(不想让它超过这个宽度);第三个参数:控制图片显示的最大高度(不想让它超过这个高度)。

20
Mar 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS 4 Comments

命令行下执行curl类函数报错,而从浏览器执行却正常

在国内,WAMP集成开发环境成了大多数php选手的第一选择。过于人性话的点击就可以实现自己想要处理的事情,但是这背后却让开发者变的越来越愚昧,越来越迟钝。 今天写了一个脚本,想让他在命令行下执行,却提示:
D:\WAMP\www\gzmama\appcron>php activity.php
Fatal error: Call to undefined function curl_init() in D:\WAMP\www\gzmama\appcro
n\source\class\class_appclient.php on line 50 
而通过直接在浏览器的地址栏输入相应地址执行却完全正常,因为我之前在 WAMP->PHP settings->php_curl 打钩了,这个在情理之中,可以理解。 然后通过phpinfo(),查看详细信息,发现了一行很重要的配置
Loaded Configuration File	D:\WAMP\Apache2\bin\php.ini
很显然,通过浏览器执行脚本的时候,是载入的上面这个路径下的php.ini,而在命令行下确实载入的 D:\WAMP\php\php.ini 。通过打钩选择,修改的是 D:\WAMP\Apache2\bin\php.ini , 所以直接打开 D:\WAMP\php\php.ini
;extension=php_curl.dll 
把上面一行最前面的 “;”去掉即可。
6
Mar 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

程序中对象传递与普通变量的区别

在Javascript PHP Java程序开发语言中,对象传递都是传其引用,而并非像普通类型的变量传递其值。 在Javascript中,如下:
<script type="text/javascript">
var student1 = {
		name : 123
};

var student2 = student1;
student1.name = 234;
alert(student2.name);  //alert 234 
</script>
在PHP中,如下:
<?php
// example one
class Student{
	public $age = 0;
}
$student1 = new Student();
$student1->age = 2;
fun($student1);
echo $student1->age;  //echo 3;

function fun($obj){
	$obj->age = 3;
}

//example two
$student2 = $student1;
$student2->age = 10;
echo $student1->age;    //echo 10
?>
在Java中,如下:
public class  Student{
	public int age = 0;
	public static void main(String[] args) {
		Student student1 = new Student();
		Student student2 = student1;
		student1.age = 10;
		System.out.print(student2.age);  //print 10
	}
}
4
Mar 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS 1 Comment

PHP include require 深入浅出

include() 语句包括并运行指定文件。以下文档也适用于 require()。 

以下内容引用自官方文档 

1> 这两种结构除了在如何处理失败之外完全一样。include() 产生一个警告而 require() 则导致一个致命错误。换句话说,如果你想在遇到丢失文件时停止处理页面就用 require()。include() 就不是这样,脚本会继续运行。同时也要确认设置了合适的 include_path。注意在 PHP 4.3.5 之前,包含文件中的语法错误不会导致程序停止,但从此版本之后会。 

2> 寻找包含文件的顺序先是在当前工作目录的相对的 include_path 下寻找,然后是当前运行脚本所在目录相对的 include_path 下寻找。例如 include_path 是 .,当前工作目录是 /www/,脚本中要 include 一个 include/a.php 并且在该文件中有一句 include "b.php",则寻找 b.php 的顺序先是 /www/,然后是 /www/include/。如果文件名以 ./ 或者是 ../ 开始,则只在当前工作目录相对的 include_path 下寻找。 

注释:如果 访问地址是 http://localhost/test/a.php 那么当前工作目录是test/ ,一般程序中建议使用./ 包含文件,这样程序执行起来比较快捷 

3> 当一个文件被包括时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。 

如果 include 出现于调用文件中的一个函数里,则被调用的文件中所包含的所有代码将表现得如同它们是在该函数内部定义的一样。所以它将遵循该函数的变量范围。 

当一个文件被包括时,语法解析器在目标文件的开头脱离 PHP 模式并进入 HTML 模式,到文件结尾处恢复。由于此原因,目标文件中应被当作 PHP 代码执行的任何代码都必须被包括在有效的 PHP 起始和结束标记之中. 

4> 因为 include() 是一个特殊的语言结构,其参数不需要括号。在比较其返回值时要注意。

<?php
// won't work, evaluated as include(('vars.php') == 'OK'), i.e. include('')
if (include('vars.php') == 'OK') {
    echo 'OK';
}

// works
if ((include 'vars.php') == 'OK') {
    echo 'OK';
}
?> 

个人理解: 1> 在不使用 ./ ../ 时会寻找程序设置的include_path, 如果使用了 ./ ../ 则程序中的include_path将失效。 

2> 在包含文件是,如果想要“找不到包含文件时给出合理的提示信息”,就建议使用 include. 如下代码:

if(!@include_once('./config/config_global.php')) {
	exit('config_global.php is missing');
}
如果文件 config_global.php,找不到则会给出提示:config_global.php is missing .  如果上面使用 require_once,则在找不到文件时直接会有一个致命的错误,将不会继续执行下面的代码,友好提示也就没有了。
2
Mar 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments