Leo の Blog Where there is a will there is a way! Trust youself can do it!

20六/090

JavaScript代码分享: 动态载入CSS, 或JavaScript 脚本文件

玩玩动态载入吧, 记得 jQuery 里有个方法 jQuery.getScript(); 这个后面好像还带一个回调函数, 功能是很好, 很强大. 不过载入CSS的时候就没有提供类似的方法. 自己写了两个函数. 玩玩很有意思呢.

不过注意的是玩动态载入的话, 前提是你的网络带宽和服务器速度都不错, 如果网络太烂, 页面就乱糟糟了呢.

先来载入CSS的函数:

/**
 * 动态增加 CSS 样式表文件. 不会重复加载
 * 但在别处使用这个函数,这个js要先加载
 *
 * @param: string cssUri 载入的 CSS 样式表定义脚本路径.
 *
 * @author: Cai.Aimin
 * @email: cam_work@163.com
 * @since: 2008-03-05
 *
 * @return void
 */
function loadCss(cssUri) {
    if(!cssUri) return;
    var styles = document.getElementsByTagName("link");
    var len = styles.length;
    var isLoaded = false;
    for(var i=0; i < len; i++) {
        if(cssUri == styles[i].getAttribute("href")) {
            isLoaded = true;
            break;
        }
    }
    if(!isLoaded) {
        var headObj = document.getElementsByTagName("head")[0];
        var cssLink = document.createElement("link");
        cssLink.setAttribute("rel", "stylesheet");
        cssLink.setAttribute("type", "text/css");
        cssLink.setAttribute("media", "screen");
        cssLink.setAttribute("href", cssUri);
        headObj.appendChild(cssLink);
    }
}

面这个是动态载入JavaScript脚本函数, 对js脚本载入前, 检查到已有的话就进行删除, 不然的话对新AJAX Loaded 进来的内容不能完成绑定操作. 当然重复载入浏览器是很懒的. 它会读取本地的缓存, 所以不需要担心重复读取服务器上的一段js脚本.

/**
 * 动态增加 JavaScript 脚本文件.
 * 但在别处使用这个函数,这个js要先加载
 *
 * @param: string jsUri 载入的 JavaScript 脚本路径.
 *
 * @author: Cai.Aimin
 * @email: cam_work@163.com
 * @since: 2008-03-05
 *
 * @return void
 */
function loadJs(jsUri) {
    if(!jsUri) return;
    var js = document.getElementsByTagName("script");
    var len = js.length;
    for(var i=0; i < len; i++) {
        if(jsUri == js[i].getAttribute("src")) {
            js[i].parentNode.removeChild(js[i]);
            break;
        }
        var headObj = document.getElementsByTagName("head")[0];
        var jsLink = document.createElement("script");
        jsLink.setAttribute("type", "text/javascript");
        jsLink.setAttribute("src", jsUri);
       headObj.appendChild(jsLink);
    }
}
20六/090

JavaScript代码分享. window.onload()

虽然使用 jQuery 可以非常方便的操作 DOM 树, 自己写一些代码辅助也是非常有意思的事. 也很有必要哦. 分享一下文档载入时的这个window.onload事件处理方法. 让它支持多事件.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/** 
 * 这个函数可以代替window.onload = function() {} 
 * 可以不受 window.onload 只能在一处使用的限制 
 * 但在别处使用这个函数,这个js要先加载 
 * 
 * @author: Cai.Aimin 
 * @email: cam_work@163.com 
 * @since: 2008-03-04 
 * @return void 
 */ 
function addLoadEvent(func) { 
        var oldOnload = window.onload; 
        if( typeof window.onload != 'function' ) { 
               window.onload = func; 
        } else { 
               window.onload = function() { 
                        oldOnload(); 
                        func(); 
                } 
        } 
}
19六/090

还是换 iNove 主题吧.

WP 现在真的是比较傻瓜化了. 虽然傻瓜化的配置页面显示效率不怎么样. 不过的确是比较方便. 还是能忍受的.

昨天晚上给换上 iNove 主题, 已经更新到 1.4.5 版本了. 看看还不错. 就用它了.

不过先前使用的代码高亮插件是 WP-codebox 和现在用到 WP-Syntax 冲突. 必须卸载 codebox 插件了.

只是 wp-Syntax 不能设置默认显示行号. 郁闷! 先不管了. :)

Good day!

17六/090

安装 libmemcached, memcache_functions_mysql

我们到目标是 mysql 同步更新 memcache 服务器. 为此我们给它装上必要到软件. 现在要安装的是 libmemcache 和 memcache_functions_mysql 两个软件包. 下载地址为:

libmemcached: http://download.tangent.org/libmemcached-0.30.tar.gz

memcache_functions_mysql: http://download.tangent.org/memcached_functions_mysql-0.8.tar.gz

安装libmemcached需要装机器上已经安装 memcache, 这个前面已经有介绍. 这里不再说明.

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
wget http://download.tangent.org/libmemcached-0.30.tar.gz
 
wget http://download.tangent.org/memcached_functions_mysql-0.8.tar.gz
 
tar -zxf libmemcached-0.30.tar.gz
 
tar -zxf memcached_functions_mysql-0.8.tar.gz
 
cd libmemcached-0.30
 
./configure
 
make
 
sudo make install
 
sudo ln -s /usr/local/lib/libmemcached.so.2 /usr/lib/
 
cd ../memcached_functions_mysql-0.8
 
./configure --with-mysql=/usr/local/mysql/bin/mysql_config --libdir=/usr/local/mysql/lib/
 
make
 
sudo make install
 
/usr/local/mysql/bin/mysql -u root -p

说明一下. libmemcached 安装后要装 /usr/lib 里建一个链接, 不然 memcache_functions_mysql 包编译不过. 它会提示 找不到 libmemcached.

如果编译安装的 mysql 装编译 memcache_functions_mysql 包时 使用参数 --libdir=/usr/local/mysql/lib/mysql/ 假设 mysql 安装在 /usr/local/mysql 目录. 这里使用的是直接下载编译好的二进制包.

到此, 安装OK!

15六/090

安装 Memcache 服务器.

服务器初始化环境: Ubuntu-8.04.2 base-system + 编译环境.

载 memcache 和 libevent 包. Memcache用到了libevent这个库用于Socket的处理.

1
2
3
4
5
6
7
8
9
10
11
12
wget http://www.monkey.org/~provos/libevent-1.3.tar.gz
wget http://memcached.googlecode.com/files/memcached-1.2.8.tar.gz
tar -zxf libevent-1.3.tar.gz
tar -zxf memcached-1.2.8.tar.gz
cd libevent-1.3
./configure --prefix=/usr
make
sudo make install
cd ../memcached-1.2.8
./configure --with-libevent=/usr
make
sudo make install

安装后 memcached 会这 /usr/local/bin/目录下. 启动Memcache的服务器端:

sudo /usr/local/bin/memcached -d -m 64 -u root -l 192.168.1.232 -p 12001 -c 32 -P /tmp/memcached.pid

-d 选项是启动一个守护进程,
-m 是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
-u 是运行Memcache的用户,我这里是root,
-l 是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200,
-p 是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,
-c 选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
-P 是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,

结束Memcache进程,执行:

sudo kill `cat /tmp/memcached.pid`

可以启动多个守护进程, 端口不能一样.
现在用PHP脚本测试一下. 测试服务器是 192.168.1.230

1
2
3
4
5
6
7
8
9
10
/**
* memTest.php
* Memcache 服务器测试脚本
*/
//phpinfo();
 
$mem = new Memcache();
$mem->addServer('192.168.1.232', 12001);
$mem->set('mmKey', 'Hello, Baby!');
var_dump($mem->get('mmKey'));

http://localhost/memTest.php 可以看到输出了

string(12) "Hello, Baby!"

Memcache 服务器安装配置完毕.