兼容各种浏览器的JavaScript图片幻灯片

1 Comment

兼容IE6,IE7,IE8,Firefox,Maxthon,Safari,Opera.

functions.js

/* 存储参数 */
var links = new Array();
var imgs = new Array();
var titles = new Array();

/* 显示参数 */
var imageWidth = 457;//图片宽度
var imageHeight = 210;//图片高度
var loading = "http://www.zainanfang.com/wp-content/themes/zainanfang/images/loading.png";//加载中图片
var hightColor = "#CF9262";//高亮色彩
var lowColor = "#F5F8F3";//低亮色彩
var titleColor = "#000";//题目文字色彩

/* 控制参数 */
var count = 4;//图片个数
var changeTime = 2000;//切换时间,单位毫秒

/* 初始化容器 */
for(var i = 1; i <= count; i++) { imgs[i] = new Image(); imgs[i].src = loading; titles[i] = ""; links[i] = "#";}

/* 插入CSS代码 */
var str = "<style type='text/css'>";
str += "#imgnv{height:16px;display:inline;}#imgnv div{float:left;margin-right:1px;display:inline;}";
str += "#imgnv div.on,#imgnv div.off{margin-bottom:1px;width:30px;height:15px;line-height:16px!important;font-size:9px;text-align:center;cursor:pointer;cursor:hand}";
str += "#imgnv div.on{background:"+hightColor+";color:"+lowColor+";}";
str += "#imgnv div.off{background:"+lowColor+";color:"+hightColor+";text-decoration:none}";
str += "#titnv{color:"+titleColor+";text-align:center;font-weight:bold;margin-top:5px;}";
str += "</style>";
str += "<div style='position:relative;border:1px solid #FFF'>";
str += "<div><a id='dlink' href='#'><img id='dimg' src='" + loading + "' border='0' width='" + imageWidth + "' height='"+imageHeight+"' style='filter:Alpha(opacity=100)' onmouseover='Pause(true)' onmouseout='Pause(false)'></a></div>";

/* 添加图片 */
str += "<div id='imgnv'>";
for(var i = 1; i <= count; i++)
{
str += "<div id='it"+i+"' class='";
if(i == 1) str += "on"; else str += "off";
str += "' onmouseover='ImgSwitch("+i+", true)' onmouseout='Pause(false)'>"+i+"</div>";
}
str += "</div><div id='titnv'></div>";
str += "</div>";

function SetAlpha(){if(document.all){if(oi.filters &amp;amp;amp;&amp;amp;amp; oi.filters.Alpha) oi.filters.Alpha.opacity = opacity;}else{oi.style.MozOpacity = ((opacity >= 100)? 99:opacity) / 100;}}
function ImgSwitch(id, p){if(p){pause = true;opacity = 100;SetAlpha();}oi.src = imgs[id].src;document.getElementById("dlink").href = links[id];document.getElementById("it" + lastid).className = "off";document.getElementById("it" + id).className = "on";document.getElementById("titnv").innerHTML = "<strong>" + titles[id] + "</strong>";curid = lastid = id;}
function ScrollImg(){if(pause &amp;amp;amp;&amp;amp;amp; opacity >= 100) return;if(sw == 0){opacity += 2;if(opacity > delay){ opacity = 100; sw = 1; }}if(sw == 1){opacity -= 3;if(opacity < 10){ opacity = 10; sw = 3; }}SetAlpha();if(sw != 3) return;sw = 0;curid++; if(curid > count) curid = 1;ImgSwitch(curid, false);}
function Pause(s){pause = s;}
function StartScroll(){setInterval(ScrollImg, speed);}
function CheckLoad(){if (imgs[1].complete == true &amp;amp;amp;&amp;amp;amp; imgs[2].complete == true) {clearInterval(checkid);setTimeout(StartScroll, changeTime);}}

index.php

<script src="<?php bloginfo('template_directory') ?>/functions.js" type="text/javascript"></script>
<script type="text/javascript">
links[1] = "<?php global $post; echo get_post_meta(198, 'link1', true); ?>";
links[2] = "<?php global $post; echo get_post_meta(198, 'link2', true); ?>";
links[3] = "<?php global $post; echo get_post_meta(198, 'link3', true); ?>";
links[4] = "<?php global $post; echo get_post_meta(198, 'link4', true); ?>";

imgs[1].src = "<?php global $post; echo get_post_meta(198, 'image1', true); ?>";
imgs[2].src = "<?php global $post; echo get_post_meta(198, 'image2', true); ?>";
imgs[3].src = "<?php global $post; echo get_post_meta(198, 'image3', true); ?>";
imgs[4].src = "<?php global $post; echo get_post_meta(198, 'image4', true); ?>";

titles[1] = "<?php global $post; echo get_post_meta(198, 'title1', true); ?>";
titles[2] = "<?php global $post; echo get_post_meta(198, 'title2', true); ?>";
titles[3] = "<?php global $post; echo get_post_meta(198, 'title3', true); ?>";
titles[4] = "<?php global $post; echo get_post_meta(198, 'title4', true); ?>";
document.write(str);

var oi = document.getElementById("dimg");
var pause = false;
var curid = 1;
var lastid = 1;
var sw = 1;
var opacity = 100;
var speed = 15;
var delay = (document.all)? 400:700;
var checkid = setInterval(CheckLoad, 10);
</script>

在南方网站设计

2 Comments

最近在忙什么?很久没写文字了吧~
这几天一连接了两个网站项目来做,成功地都变成了WordPress后台.为WordPress开发模板真的是一件只能用惬意来形容的事情.一旦习惯了WordPress的”方言”,强大的功能实现起来并不是一个梦.
整体感觉起来,WordPress中提供对每篇文章的自定义域是最强大的功能,简直提供了一个小型数据库,你可以定义成任何东西!

zainanfang

上图就是最近一直在做的一个网站,在南方,是一个诗社.

创造爱的世界

1 Comment

趁我们还有实时创造属于自己的爱的世界的机会的时候,别浪费了它。

网页读取并嵌入Google Docs文档及表格(PHP)

4 Comments

什么是 Google 数据 API?

Google 数据 API 提供用于在网络上读写数据的简单标准协议。
这些 API 可以使用基于 XML 的两种标准联合格式:Atom 或 RSS。它们还具有一个供稿发布系统,其中包括 Atom 发布协议和用于处理查询的一些扩展功能(使用 Atom 的标准扩展模型)。
许多 Google 服务都支持 Google 数据 API 协议。以下数据 API 可以使您的客户端应用程序与 Google 服务进行互动:

动机

这几天我在做自己的一个网站制作及托管服务的网站,牵涉到一些客户信息的管理什么的,最好是能做成OA之类的形式,就像Google Docs里的SpreadSheet一样,在线编辑,在线显示。不过我实在没时间去自己做这种东西,于是我在想是不是能直接通过API把Google Docs里的SpreadSheet直接嵌入我自己写的网页里去。不见得需要编辑功能,估计Google也不会提供,不然Google Docs不就变成带有后门的网站留言文本编辑器了么…(所谓带有后门,是指与一般留言文本编辑器不同,不是把数据存储在本地网站,而是存储在另一个服务器,在这里就是Google Docs服务器上)

php_google_docs1

站在巨人的肩上,感谢Lim Jiunn Haur写的WordPress插件Inline Google Docs早就提供了这个功能,我把这个插件拆开,去掉多余的,为我所用了。

php_google_docs2

使用方法

用法很简单,后面的相关下载中提供了一个RAR包,当中包含两个文件夹,styles里包含了一个CSS,用于修饰SpreadSheet表格显示的效果,这里的风格基本上是白灰风格,如上图所示。鉴于保密需求我做了模糊处理,反正就那么个意思。你需要在你的网站中加入这个CSS或者将这个集成到你的CSS中,或者干脆不要,自己写。
includes文件夹是库,其中Zend是Google Data API库,由Google发布。gdocs是本文所述的库。加载Google Data API库的代码在gdocs下gdocs.php中,你可能需要做一点路径修改之类。至少在你的全局include库的地方加入Zend的位置,并include gdocs.php这个文件。

/* Add Zend library to path */
$path = dirname (__FILE__) . "/includes";
set_include_path (get_include_path () . PATH_SEPARATOR . $path);

另有一个全局配置文件config.php,我并没有给出,你自己要补上。示例如下:

/*  Site Configuration */
define('SITE_URL', 'http://www.yourdomain.com/');

/*  Google Docs Settings */
define('GOOGLE_DOMAIN', 'yourdomain.com');
define('GOOGLE_USERNAME', 'username@yourdomain.com');
define('GOOGLE_PASSWORD', 'YourGooglePassword');
define('PROXY_HOST', '');
define('PROXY_PORT', '');
define('PROXY_USERNAME', '');
define('PROXY_PASSWORD', '');

调用显示Google Docs中包含的文档时,PHP代码如下:

gdocs_list();

具体的显示风格请自行修改includes的gdocs下,gdisplay.php文件。

调用显示某一个具体的SpreadSheet的时候,$atts['type']置’spreadsheet’,st_id为SpreadSheet的ID,例如’pNrLCrMF9srEYeIRCLO5kEF’,wt_id为工作表ID,例如’od6′,PHP代码如下:

$atts['type'] = $_GET['type'];
$atts['st_id'] = $_GET['st_id'];
$atts['wt_id'] = $_GET['wt_id'];
$atts['style'] = 'googledocs';
$atts['headings'] = NULL;

gdocs_display($atts);

注意事项

  • 按照原作者Lim Jiunn Haur代码中的声明,本作品源代码依旧遵循GNU Public License
  • 修改之后的代码示例只包含了必要的我能用到的功能,就是对Google Docs中Document和SpreadSheet的列表,以及SpreadSheet的显示功能,其他功能并未写出实例,但是包含的Google Data API是完整的,应该可以写出进一步功能的代码,这里留给读者去自行研究吧。

相关下载

参考资料

My Gmail

2 Comments

214gmail

情人节,给自己的Gmail换了一个漂亮的主题~

符合标准的TreeView实现(Div+CSS+JS+ASP.NET)

1 Comment

这几天有点小活,要求是ASP.NET的,虽然我不怎么看好ASP.NET,但是人家要求了我也就照做吧。
最复杂的部分是一个TreeView。出于兼容性和简单性考虑没有用ASP.NET的TreeView控件,而是参考一篇文章自行写了一个出来。

[singlepic=18460]

技术指标如下:

  • 实现:Div+CSS+JavaScript+ASP.NET(C#)
  • 功能:可以实现无限级的TreeNode
  • 标准:在IE 7和Firefox 3.1下显示效果相同,兼容XHTML 1.0 Strict最严格的网页标准

效果如左图所示。最后一个函数可能会因为超宽看不到全部,具体请参照文章附件中的源代码。
附件下载:http://download.nocoo.us/Download/Archive/TreeViewCode.rar

TreeNode.cs

/// <summary>
/// TreeView结点类
/// </summary>
public class TreeNode
{
    private string name;
    private string href;
    private List<TreeNode> subNodes = new List<TreeNode>();

    /// <summary>
    /// 结点名
    /// </summary>
    public string Name { get { return name; } }
    /// <summary>
    /// 结点链接
    /// </summary>
    public string Href { get { return href; } }
    /// <summary>
    /// 下级结点个数
    /// </summary>
    public int Count { get { return this.subNodes.Count; } }
    /// <summary>
    /// 获取或者设置下级结点
    /// </summary>
    /// <param name="index">序号</param>
    /// <returns>下级结点</returns>
    public TreeNode this[int index]
    {
        get { return subNodes[index]; }
        set { subNodes[index] = value; }
    }

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="name">结点名</param>
    public TreeNode(string name)
    {
        this.name = name;
        this.href = null;
    }

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="name">结点名</param>
    /// /// <param name="href">结点链接</param>
    public TreeNode(string name, string href)
    {
        this.name = name;
        this.href = href;
    }

    /// <summary>
    /// 添加下级结点
    /// </summary>
    /// <param name="node">新结点</param>
    public void Add(TreeNode node)
    {
        subNodes.Add(node);
    }
}

TreeView.cs

/// <summary>
/// TreeView
/// </summary>
public class TreeView
{
    private List<TreeNode> nodes = new List<TreeNode>();

    /// <summary>
    /// 填充测试用数据
    /// </summary>
    public void FillTestData()
    {
        TreeNode node1 = new TreeNode("中国", "#");
        TreeNode node11 = new TreeNode("华北地区", "#");
        TreeNode node111 = new TreeNode("河南省", "#");
        TreeNode node112 = new TreeNode("河北省", "#");
        TreeNode node113 = new TreeNode("山东省", "#");
        TreeNode node1131 = new TreeNode("青岛市", "#");
        TreeNode node1132 = new TreeNode("济南市", "#");
        TreeNode node11321 = new TreeNode("市中区", "#");
        TreeNode node11322 = new TreeNode("历下区", "#");
        TreeNode node11323 = new TreeNode("槐荫区", "#");
        TreeNode node11324 = new TreeNode("天桥区", "#");
        TreeNode node11325 = new TreeNode("长清区", "#");
        TreeNode node1133 = new TreeNode("菏泽市", "#");
        TreeNode node1134 = new TreeNode("济宁市", "#");
        TreeNode node1135 = new TreeNode("德州市", "#");
        TreeNode node12 = new TreeNode("东北地区", "#");
        TreeNode node13 = new TreeNode("西北地区", "#");
        TreeNode node14 = new TreeNode("华东地区", "#");
        TreeNode node15 = new TreeNode("西南地区", "#");
        TreeNode node16 = new TreeNode("华南地区", "#");
        TreeNode node17 = new TreeNode("华中地区", "#");
        TreeNode node18 = new TreeNode("港澳台地区", "#");

        node1132.Add(node11321);
        node1132.Add(node11322);
        node1132.Add(node11323);
        node1132.Add(node11324);
        node1132.Add(node11325);

        node113.Add(node1131);
        node113.Add(node1132);
        node113.Add(node1133);
        node113.Add(node1134);
        node113.Add(node1135);

        node11.Add(node111);
        node11.Add(node112);
        node11.Add(node113);

        node1.Add(node11);
        node1.Add(node12);
        node1.Add(node13);
        node1.Add(node14);
        node1.Add(node15);
        node1.Add(node16);
        node1.Add(node17);
        node1.Add(node18);

        nodes.Add(node1);
        nodes.Add(new TreeNode("俄罗斯", ""));
        nodes.Add(new TreeNode("美国"));
        nodes.Add(new TreeNode("韩国"));
        nodes.Add(new TreeNode("澳大利亚"));
        nodes.Add(new TreeNode("印度", ""));
        nodes.Add(new TreeNode("加拿大", ""));
    }

    /// <summary>
    /// 获取TreeView的html代码
    /// </summary>
    /// <returns></returns>
    public string GetHtmlString()
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("<ul>");
        for (int i = 0; i < nodes.Count; i++)
        {
            sb.AppendLine(GetNodeHtml(nodes[i], 1, (i + 1).ToString()));
        }
        sb.AppendLine("</ul>");
        return sb.ToString();
    }

    private string GetNodeHtml(TreeNode thisNode, int depth, string id)
    {
        StringBuilder sb = new StringBuilder();
        bool hasSub = (thisNode.Count > 0) ? true : false;
        sb.AppendLine(string.Format("<li id=\"depth_{0}_item_{1}\">", depth, id));
        sb.AppendLine(string.Format(
            "<div class=\"{0}\" id=\"depth_{1}_item_{2}_ico\" onclick=\"controlNode(this,'depth_{1}_item_{2}')\"></div><h1>{3}</h1>",
            hasSub ? "closedir" : "nodir",
            depth,
            id,
            (thisNode.Href == null || thisNode.Href.Equals("")) ? thisNode.Name : string.Format("<a href=\"{0}\">{1}</a>", thisNode.Href, thisNode.Name)
            ));
        if (hasSub)
        {
            sb.AppendLine(string.Format("<div id=\"depth_{0}_item_{1}_layer\" style=\"display:block;\">", depth, id));
            sb.AppendLine("<ul>");
            for (int i = 0; i < thisNode.Count; i++)
            {
                sb.AppendLine(GetNodeHtml(thisNode[i], depth + 1, string.Format("{0}_{1}", id, i + 1)));
            }
            sb.AppendLine("</ul>");
            sb.AppendLine("</div>");
        }
        sb.AppendLine("</li>");
        return sb.ToString();
    }
}

ASP.NET页面调用:

<%
    CMC.TreeView list = new CMC.TreeView();
    list.FillTestData();
    Response.Write(list.GetHtmlString());
%>

ASP.NET页面JavaScript:

defaultNodeState();

function defaultNodeState()
{
	var nodeState = getCookie("nodeState");
	if(nodeState == null)
	{
	    nodeState = ",|,|,";
		setCookie("nodeState",nodeState);
	}
	var layer = nodeState.split('|');
	for(var i=0;i<layer.length;i++)
	{
		if(layer[i] != ",")
		{
			var lItem = layer[i].split(',');
			var nodeIco = document.getElementById(lItem[0]+"_ico");
			var nodeLayer = document.getElementById(lItem[0]+"_layer");
			OpenNode(nodeIco);
			ShowDiv(nodeLayer);
		}
	}
}
function controlNode(obj,layerId)
{
	var className = obj.className.toLowerCase();
	var layer = document.getElementById(layerId + "_layer");

	cookiesNode(layerId, className);
	if(className == "opendir")
	{
		HideDiv(layer);
		obj.className = "closedir";
	}
	else if (className == "closedir")
	{
		ShowDiv(layer);
		obj.className = "opendir";
	}
}

function cookiesNode(layerId,className)
{
    var nodeState = getCookie("nodeState");
	if(nodeState == null)
	{
	    nodeState = ",|,|,";
		setCookie("nodeState",nodeState);
	}
	var layer = nodeState.split('|');
	var lDepth = getDepth(layerId);
	if(className == "opendir")
	{

		layer[lDepth-1] = ","
	}
	else
	{
		if(layer[lDepth-1] &amp;&amp;amp layer[lDepth-1] != ",") {
                        var lItem = layer[lDepth - 1].split(',');
			var lIco = document.getElementById(lItem[0]+"_ico");
			var lLayer = document.getElementById(lItem[0] + "_layer");
			HideDiv(lLayer);
			CloseNode(lIco);
			    }
			    layer[lDepth - 1] = layerId + "," + lDepth;
		    }
	var cValue = layer[0];
	for(var i=1;i<layer.length;i++)
	{
		cValue += "|" + layer[i];
	}
	setCookie("nodeState",cValue);
}

function getDepth(layerId)
{
	var lItem = layerId.split('_');
	return lItem[1];
}

function OpenNode(obj)
{
	obj.className = "opendir";
}
function CloseNode(obj)
{
	obj.className = "closedir";
}
function HideDiv(obj)
{
    obj.style.display='none';

}
function ShowDiv(obj)
{
    obj.style.display='block';
}

//设置cookies
function setCookie(name,value)
{
    var Days = 30;
    var exp = new Date();
    exp.setTime(exp.getTime() + Days*24*60*60*1000);
    document.cookie = name + "=" + escape(value) +
      ";expires=" + exp.toGMTString();
}
//读取cookies
function getCookie(name)
{
    var arr,reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
    if(arr = document.cookie.match(reg)) return unescape(arr[2]);
    else return null;
}

对字符串数组生成一个随机序

No Comments

这种情况:
一组照片,或者MP3歌曲,知道它们的路径,保存在一个数组中。现在想随机播放之。要求,每首歌出现的概率相等,且播放完全部之前不会重复,并且保证顺序可以前后无限快进或者快倒。

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace RandomStringArray
{
    class Program
    {
        private static int count = 50;

        static void Main(string[] args)
        {
            string[] originalArray = GetStringArray();
            string[] randomArray = new string[originalArray.Length];

            SortedList<int, string> list = new SortedList<int, string>();
            for (int i = 0; i < originalArray.Length; i++)
            {
                list.Add(originalArray[i].GetHashCode(), originalArray[i]);
            }

            int index = 0;
            foreach (KeyValuePair<int, string> item in list)
            {
                randomArray[index++] = item.Value;
            }

            // Print Result
            Console.WriteLine("Original:");
            for (int i = 0; i < originalArray.Length; i++)
            {
                Console.WriteLine(string.Format("[{0}]{1}", i, originalArray[i]));
            }
            Console.WriteLine("Random:");
            for (int i = 0; i < randomArray.Length; i++)
            {
                Console.WriteLine(string.Format("[{0}]{1}", i, randomArray[i]));
            }
        }

        /// <summary>
        /// Generate a directories list for test
        /// </summary>
        /// <returns>Directories list</returns>
        private static string[] GetStringArray()
        {
            if (!Directory.Exists("Temp"))
            {
                Directory.CreateDirectory("Temp");

                for (int i = 0; i < count; i++)
                {
                    Directory.CreateDirectory("Temp\\" +
                                Guid.NewGuid().ToString());
                }
            }
            return Directory.GetDirectories("Temp");
        }
    }
}