[转载]使用 jQuery dataTables - 2 四种数据来源

mikel阅读(1020)

[转载]使用 jQuery dataTables – 2 四种数据来源 – haogj – 博客园.

四种数据来源

对于 dataTables 来说,支持四种表格数据来源。

最为基本的就是来源于网页,网页被浏览器解析为 DOM 对象,在 dataTables 中称为  DOM 来源。


$(document).ready(function() {
	$('#example').dataTable();
} );

第二种数据来源为数组, JavaScript 中的数组,通过在初始化对象中传递一个名为 aaData 的数组,同样可以提供表格数据,前缀 aa 说明这是一个数组的数组,外层的数组表示表格的行,每一行同样是一个数组。


$(document).ready(function() {
	$('#demo').html( '<table cellpadding="0" cellspacing="0" border="0" class="display" id="example"></table>' );
	$('#example').dataTable( {
		"aaData": [
			/* Reduced data set */
			[ "Trident", "Internet Explorer 4.0", "Win 95+", 4, "X" ],
			[ "Trident", "Internet Explorer 5.0", "Win 95+", 5, "C" ],
			[ "Trident", "Internet Explorer 5.5", "Win 95+", 5.5, "A" ],
			[ "Trident", "Internet Explorer 6.0", "Win 98+", 6, "A" ],
			[ "Trident", "Internet Explorer 7.0", "Win XP SP2+", 7, "A" ],
			[ "Gecko", "Firefox 1.5", "Win 98+ / OSX.2+", 1.8, "A" ],
			[ "Gecko", "Firefox 2", "Win 98+ / OSX.2+", 1.8, "A" ],
			[ "Gecko", "Firefox 3", "Win 2k+ / OSX.3+", 1.9, "A" ],
			[ "Webkit", "Safari 1.2", "OSX.3", 125.5, "A" ],
			[ "Webkit", "Safari 1.3", "OSX.3", 312.8, "A" ],
			[ "Webkit", "Safari 2.0", "OSX.4+", 419.3, "A" ],
			[ "Webkit", "Safari 3.0", "OSX.4+", 522.1, "A" ]
		],
		"aoColumns": [
			{ "sTitle": "Engine" },
			{ "sTitle": "Browser" },
			{ "sTitle": "Platform" },
			{ "sTitle": "Version", "sClass": "center" },
			{
				"sTitle": "Grade",
				"sClass": "center",
				"fnRender": function(obj) {
					var sReturn = obj.aData[ obj.iDataColumn ];
					if ( sReturn == "A" ) {
						sReturn = "<b>A</b>";
					}
					return sReturn;
				}
			}
		]
	} );
} );

aoColumns 参数用来定义表格的列,这是一个数组,其中的每一个对象用来定义一列。

对于每一个列对象:

sTitle 定义列的标题

sClass 定义列的样式

fnRender 函数用来渲染列,这个函数将会传递一个参数对象,这个参数对象的 iDataColumn 属性表示当前的列索引,aData 表示当前的行数组。函数返回的结果将被填充到单元格中。

当然了,对于表示行的数组来说,长度应该是相同的。如果某一行数据缺失或者提供了过多地数据的话,就会得到一个警告。

错误的数组

第三种数据来源是 AJAX,也就是说可以向服务器发一个请求来获得数据。

在初始化参数对象中,通过 sAjaxSource 的属性传递请求的地址,bProcessing 表示是否需要显示一个工作中的提示。

在 JSON 方式返回的数据中,需要一个名为 aaData 的属性来提供实际的数据。

$(document).ready(function() {
	$('#example').dataTable( {
		"bProcessing": true,
		"sAjaxSource": '../examples_support/json_source.txt'
	} );
} );

其中 json_source.txt 就是 JSON 数据,其中定义了一个名为 aaData 的属性。这个文件可以在下载的压缩包中找到,在 examples\examples_support 文件夹中。

最后一种数据来源是服务器,对于大量的数据来说,你可能希望在服务器端完成所有的操作,分页、排序、过滤等等。dataTable 可以通过服务器完成这些功能,甚至其他的服务器,像  Google Gears 或者 Adobe Air,这样的话,dataTables 就是一个显示数据和提供操作事件的前端模块。

$(document).ready(function() {
	$('#example').dataTable( {
		"bProcessing": true,
		"bServerSide": true,
		"sAjaxSource": "../examples_support/server_processing.php"
	} );
} );

对于服务器来说,可以通过请求参数来获得当前的操作信息。

类型 名称 说明
int iDisplayStart 显示的起始索引
int iDisplayLength 显示的行数
int iColumns 显示的列数
string sSearch 全局搜索字段
boolean bEscapeRegex 全局搜索是否正则
boolean bSortable_(int) 表示一列是否在客户端被标志位可排序
boolean bSearchable_(int) 表示一列是否在客户端被标志位可搜索
string sSearch_(int) 个别列的搜索
boolean bEscapeRegex_(int) 个别列是否使用正则搜索
int iSortingCols 排序的列数
int iSortCol_(int) 被排序的列
string sSortDir_(int) 排序的方向 “desc” 或者 “asc”.
string sEcho DataTables 用来生成的信息

这篇文章介绍了在 C# 中结合 LINQ 使用 DataTables 进行服务端处理的经验 jQuery DataTables Plugin Meets C#

服务器应该返回如下的 JSON 格式数据

类型 名称 说明
int iTotalRecords 实际的行数
int iTotalDisplayRecords 过滤之后,实际的行数。
string sEcho 来自客户端 sEcho 的没有变化的复制品,
string sColumns 可选,以逗号分隔的列名,
array array mixed aaData 数组的数组,表格中的实际数据。
<pre>{
    "sEcho": 3,
    "iTotalRecords": 57,
    "iTotalDisplayRecords": 57,
    "aaData": [
        [
            "Gecko",
            "Firefox 1.0",
            "Win 98+ / OSX.2+",
            "1.7",
            "A"
        ],
        [
            "Gecko",
            "Firefox 1.5",
            "Win 98+ / OSX.2+",
            "1.8",
            "A"
        ],
        ...
    ] 
}

[转载]使用 jQuery dataTables - 1

mikel阅读(1027)

[转载]使用 jQuery dataTables – 1 – haogj – 博客园.

JQuery 的插件 dataTables 是一个优秀的表格插件,提供了针对表格的排序、浏览器分页、服务器分页、筛选、格式化等功能。dataTables 的网站上也提供了大量的演示和详细的文档进行说明,为了方便学习使用,这里一步一步进行说明。

首先,需要到 dataTables 的网站 http://www.datatables.net/ 下载这个脚本库,

目前的版本是 1.7.5,下载的压缩包中使用的 JQuery 是 1.4.4 。现在 JQuery1.5.1 已经发布,所以,这里使用最新的 jQuery 1.5.1 。

然后,在网页中先加入 jQuery 的引用,然后,加入 dataTables 的引用。

配置脚本

对于 dataTables 来说,表格必须通过 thead 和 tbody 进行说明,如下所示,

<table id="example" class="display" border="0" cellspacing="0" cellpadding="0">
<thead>
<tr>
<th> Rendering engine</th>
<th> Browser</th>
<th> Platform(s)</th>
<th> Engine version</th>
<th> CSS grade</th>
</tr>
</thead>
<tbody>
<tr class="odd gradeX">
<td>Trident</td>
<td>Internet Explorer 4.0</td>
<td>Win 95+</td>
<td class="center">4</td>
<td class="center">X</td>
</tr>

如果没有 thead 将会报错。

表格错误

最为简单的使用方式,就是零配置的方式。

/*
* Example init
*/
$(document).ready(function(){
$('#example').dataTable();
});

表格的效果

默认效果

注意,红框表示了四个默认的设置效果,分别用来选择每页的行数,表格的过滤器,表格的信息和换页。

此时,使用了几个默认的参数设置。在 dataTables 中,参数名称的前缀用来说明参数的数据类型,很明显,b 表示布尔类型,i 表示整数类型,s 表示字符串类型。

  • bPaginate: 是否分页,默认为 true,分页
  • iDisplayLength : 每页的行数,每页默认数量:10
  • sPaginationType: 分页样式,支持两种内置方式,two_button 和 full_numbers, 默认使用 two_button。
  • bLengthChange : 是否允许用户通过一个下拉列表来选择分页后每页的行数。行数为 10,25,50,100。这个设置需要 bPaginate 支持。默认为 true。
  • bFilter: 启用或禁止数据过滤,默认为 true。 注意,如果使用过滤功能,但是希望关闭默认的过滤输入框,应使用 sDom
  • bInfo: 允许或者禁止表信息的显示,默认为 true,显示信息。

我们也可以通过传递一个初始化参数对象来改变这些设置。例如,下面的例子将每页的行数设置为 20 行。

$(function () {
$("#example").dataTable(
{
iDisplayLength: 20
}
);
});

[原创]自定义VS2008的起始页的新闻订阅RSS

mikel阅读(1114)

自定义起始页的新闻区

  1. “工具”菜单上单击“选项”
  2. 展开“环境”,然后单击“启动”
  3. “起始页新闻频道”中,输入新闻 RSS 源 URL。
  4. 单击“确定”

同时可以使用VS2008的浏览器浏览网页,这样不用再VS2008和浏览器间来回切换了,的确方便了不少

[原创]树形分类数据库表结构设计

mikel阅读(1807)

最近项目中涉及到树形结构的分类信息管理功能,最终显示格式如下:

树形结构显示效果图

最初我设计的数据库表结构如下:

ID 分类名称 上级分类ID 当前分类层次

结果添加了几个不同的顶级分类的子类后,查询出数据显示的效果如下:

顺序混乱的树形显示

顺序混乱的树形显示

“鞋”这个分类数据库中上级分类Id存储的是服装分类的ID,但是我们查询出来后,遍历显示的效果确实在汽车用品里,因为我们是按默认ID排序的,所以显示的时候根本没有层级关系,尽管数据库中存储着“当前分类层次”这个字段值,还是需要我们手工处理显示问题,要么利用SQL语句根据层级关系一级一级的读取数据返回数据,要么用JavaScript在页面一级进行表格的row操作来切换行的位置,都是很费时费力的方法,于是想到记录每一个分类的路径信息,于是修改了数据库表结构如下:

ID 分类名称 上级分类ID 当前分类层次 分类路径

这个“分类路径”是做什么用的?

首先分类路径存储的是当前分类到顶级分类的完整路径,以一级ID,二级ID,…..,当前级ID的格式存储,这有什么好处呢?

大家利用SQL按分类路径进行一下排序就知道了,是不是自然的按照层级关系读取出数据来了,读取的数据如下:

数据库表结构

数据库表结构

好了,既然表结构出来了,那么就需要考虑path数据什么时候生成,当然是插入新分类的时候生成于是有了存储过程如下:

ALTER PROCEDURE Store_GoodsCategoryCreate
	@Identifier int,
	@ParentID int,
	@Sort_Order int,
	@is_Show int,
	@grade int,
	@Cate_Level int,
	@CategoryName nvarchar(20)=NULL,
	@Keywords nvarchar(500)=NULL,
	@Cate_Desc nvarchar(MAX)=NULL,
	@Cate_Unit nvarchar(20)=NULL,
	@home_display nvarchar(20)=NULL,
	@Filter_attr nvarchar(500)=NULL,
	@Cate_Path nvarchar(500)=NULL
AS
BEGIN TRAN
	--选择ParentNode的Level+1
	SELECT @Cate_Level=Cate_Level+1 FROM Store_GoodsCategory WHERE Identifier=@ParentID
	IF @Cate_Level=0
	BEGIN
		ROLLBACK TRAN
	END
	--插入分类数据
	INSERT INTO Store_GoodsCategory(ParentID,Sort_Order,is_Show,grade,Cate_Level,CategoryName,
       Keywords,Cate_Desc,Cate_Unit,home_display,Filter_attr,Cate_Path)
	VALUES(@ParentID,@Sort_Order,@is_Show,@grade,@Cate_Level,@CategoryName,@Keywords,@Cate_Desc,
         @Cate_Unit,@home_display,@Filter_attr,@Cate_Path)
	IF(@@ERROR&gt;0)
	BEGIN
		ROLLBACK TRAN
	END
	SET @Identifier=@@IDENTITY --记录刚刚添加的ID

	--更新本节点的路径信息
	UPDATE Store_GoodsCategory
	SET
		Cate_Path=(select Cate_Path+','+Cast(@Identifier as nvarchar(20)) from Store_GoodsCategory where Identifier=@ParentID )
	WHERE
		Identifier=@Identifier

	IF(@@ERROR&gt;0)
	BEGIN
		ROLLBACK TRAN
	END

COMMIT TRAN

[转载]WPF中实现对Flash的播放及(循环)截图

mikel阅读(1170)

[转载]WPF中实现对Flash的播放及(循环)截图 – SongShu – 博客园.

要想实现Flash的播放支持,需要借助Flash自身的ActiveX控件.

而WPF作为一种展现层的技术,不能自身插入COM组件,必需借助Windows Form引入ActiveX控件.
比较标准的实现方法,可以参考以下链接:http://blogs.msdn.com/b/jijia/archive/2007/06/07/wpf-flash-activex.aspx
而本文则是介绍通过借助System.Windows.Forms下的WebBrowser实现.
但无论是那一种方法,本质上都是通过在WPF程序中引用Windows Form窗体,再在其内引入ActiveX控件.
实现对Flash的播放
首先,引入可在WPF上承载 Windows 窗体控件的元素:WindowsFormsHost,及添加对 Windows 窗体的引用.
具体的实现过程:项目引用–添加引用–选择 “WindowsFormsIntegration” 及 “System.Windows.Forms” –添加
在WPF页面分别添加这两者的引用:
XAML中的所有实现代码:
<Window x:Class="Capture.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:host="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Title="File Capture" Height="600" Width="800"
Unloaded="Window_Unloaded"
>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="150"></ColumnDefinition>
</Grid.ColumnDefinitions>
<host:WindowsFormsHost x:Name="host">
<forms:WebBrowser x:Name="browser"></forms:WebBrowser>
</host:WindowsFormsHost>
<Grid Background="Gray" Grid.Column="1">
<UniformGrid Rows="5" VerticalAlignment="Top">
<Button x:Name="btnOpen" Width="100" Height="30" Click="btnOpen_Click" Margin="0,10">Open File</Button>
<Button x:Name="btnCapture" Width="100" Height="30" Click="btnCapture_Click" Margin="0,10">Start Capture</Button>
<Button x:Name="btnStop" Width="100" Height="30" Click="btnStop_Click" Margin="0,10">Stop Capture</Button>
<CheckBox x:Name="cboxLoop" IsChecked="True" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="25,10,0,10">Loop Capture</CheckBox>
</UniformGrid>
</Grid>
</Grid>
</Window>

当需要把一选中的Flash文件(.swf 文件)添加进WebBrowser 中播放:
browser.Navigate(currentPath);
实现对Flash的截图
实现对Flash的截图,只要使用WebBrowser的基类WebBrowserBase里面的DrawToBitmap方法.
参数Bitmap为所绘制的位图(需初始化位图的大小),Rectangle为截取WebBrowser内容的区域(大小)
private void Capture()
{
 string fileName = System.IO.Path.GetFileNameWithoutExtension(currentPath);
string capturePath = string.Format(&quot;{0}\\Capture\\{1}&quot;, System.Environment.CurrentDirectory, fileName);

 if (!Directory.Exists(capturePath))
 {
 Directory.CreateDirectory(capturePath);
}

 Bitmap myBitmap = new Bitmap((int)host.ActualWidth, (int)host.ActualHeight);
 System.Drawing.Rectangle DrawRect = new System.Drawing.Rectangle(0, 0, (int)host.ActualWidth, (int)host.ActualHeight);
 browser.DrawToBitmap(myBitmap, DrawRect);

 string timeNow = DateTime.Now.ToString(&quot;yyyyMMddHHmmssfff&quot;);

 myBitmap.Save(string.Format(&quot;{0}\\{1}_{2}.png&quot;, capturePath, fileName, timeNow));
}

界面效果:
如上图所示,本实例实现了对Flash的循环截图,时间间隔为1秒.本部分比较简单,
通过使用System.Windows.Threading下的DispatcherTimer即可实现.具体可参考本文最后的附件代码.
实例代码下载:
1 xmlns:host="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" 2 xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

[转载]用CSS制作一个圆形放大镜

mikel阅读(1102)

[转载]用CSS制作一个圆形放大镜 – EtherDream の 原创空间 – 博客园.

话说图片放大,这是一个再容易不过的效果了。当然,今天说的可不是简简单单的在一个框里放大,而是一个圆。就像放大镜或是狙击镜那样,只有圆圈里的放大, 圈外的当然还是原来的图片。这是不是很不可思议? 当然不是。做过Flash的也许会脱口而出:套个蒙版就是了。可惜CSS不是Flash,没有那一套。我们只有从CSS里面慢慢挖掘。

先说IE,因为IE有滤镜,可以实现许多意想不到的功能。先来整理下我们的目标:
1.放大一副图片
2.只显示其中的一个圆
3.圆外是透明的

图片的缩放可以通过img元素的拉伸来实现。接着盖上一张透明像素画的实心圆,因此正好只显示出放大后中心圆圈部分。但第3步可就不对了,虽然之前加盖了 一张透明圆形的gif图片,屏幕上确实出现了一个放大过的圆形图片,但圆圈的外面却变成加盖图片的背景色了,因为这张图片是在最上层了。到此你或许在想给 其中某些元素加些透明度什么的,事实上无论给哪个层加透明度都是徒劳的。因为此时无非就两种情况:圆圈外被背景色覆盖;背景色透明的话就是一个矩形的放 大,而不是圆形。我们所希望的是:蒙版的背景色透明,并且在此位置下面的放大图也跟着透明

对于IE来说,这并非难事,因为IE有滤镜。如果你熟悉的话应该早就想到了Chroma滤镜,这是一个很重要的滤镜,因为他能把一个层里的指定颜色变成透 明色!这不正是我们期待吗。我们新建一个层,层里面分别叠上放大图片(后)和蒙版图片(前),就是为了让他们合并到这个新建层里。我们给这个新建层设置 Chroma滤镜,因为他们的子层都在此合并像素了,所以圆圈外那部分背景色透明后,取而代之的就是原图片。这就是我们最终想要的效果。

值得注意的是,Chroma滤镜在给指定的蒙版背景色透明的时候,圆圈里同样的颜色也会一起透明掉,所以要给蒙版设置一个非常少见的背景色,尽可能减少圆圈里的透明像素点

IE上面的解决方案还算简单,非IE的呢?你当然会说canvas,因为图形方面他是万能的。如果CSS上确实找不到办法,我们也只能用canvas。不 过可别忘了那些非IE的主流浏览器几乎都是支持CSS3的。CSS3虽然没有像Chroma滤镜那样的效果,但是对于本例这样的效果还是绰绰有余的:因为 我们只想要一个放大了的圆形图片,而CSS3天生就支持画圆。

CSS3支持层的圆角,例如border-radius:5px,就能给层的4个方角变为半径5px的圆角。我们不妨将其运用到极限,给一个 100*100的层设置一个border-radius:50px圆角,这时可就是一个圆滚滚的层了!层里面的内容当然不会限制在圆角里面,但层的背景图 片会。并且CSS3是支持背景图片缩放的,本例到此也就迎刃而解了。

前面关键的问题都以解决,下面就实现一个狙击瞄准器的效果,并支持滚轮缩放。为了使代码更清晰,本例分别为IE,FF及其他浏览器做了3个版本,通过Demo页面能够自动转跳。

Demo:

http://www.etherdream.com/funnyscript/zoom/Demo.html

当然,如果再改进的话我们还可以用png图片作为蒙版,带上一些渐变的透明度,就更像玻璃的材质了。(2010/12/20)

[转载]jquery插件之无缝循环新闻列表

mikel阅读(1041)

[转载]jquery插件之无缝循环新闻列表 – waitingbar – 博客园.

一、效果图:

newslist效果图

tips源码下载:http://files.cnblogs.com/waitingbar/newslist.rar

二、JQuery源码:

01 (function($){
02 $.fn.extend({
03 newsList:function(options){
04 var defaults ={
05 actName:'li', //显示条数名;
06 maxShowNum:'6', //最多的显示条数;
07 actNameH:'28', //一次移动的距离;
08 ulClass:'.ul_news_list', //被复制层的class
09 copyUlClass:'.ul_news_list2', //复制层的class
10 autoTime:'1500', //自动运行时间;
11 clickGoUpC:'.go_uplist', //点击向上class;
12 clickDownUpC:'.go_downlist', //点击向下class;
13 goStart:'go_tart',
14 autoCloss:'flase' //自动运行开关,当为'flase'时为开,其它则关;
15 } ;
16
17 options = $.extend(defaults, options);
18 return this.each(function(){
19 var o = options;
20 var counts =1;
21 var linum = $($(this).find(o.actName),$(this)).size();
22 var ul_class = $($(this).find(o.ulClass),$(this));
23 var copy_ul_class = $($(this).find(o.copyUlClass),$(this));
24 var click_go_up_c = $($(this).find(o.clickGoUpC),$(this));
25 var click_go_down_C = $($(this).find(o.clickDownUpC),$(this));
26 var go_start = $($(this).find(o.goStart),$(this));
27 if(linum > o.maxShowNum){
28 $(copy_ul_class).html($(ul_class).html());
29 goStartList();
30 }
31 var thiswrap = $($(ul_class).parent().parent(),$(this));
32 //自动运行函数
33 function auto_function(){
34 if(counts <= linum){
35 $(ul_class).animate({top:'-=' + o.actNameH},o.autoTime);
36 $(copy_ul_class).animate({top:'-=' + o.actNameH},o.autoTime);
37 counts++;
38 }else{
39 $(ul_class).animate({top:0},0);
40 $(copy_ul_class).animate({top:0},0);
41 counts = 1;
42 }
43 }
44 //点击向上移动时;
45 if(linum > o.maxShowNum){
46 $(click_go_up_c).click(function(){
47 if(counts <= linum){
48 $(ul_class).animate({top:'-=' + o.actNameH},0);
49 $(copy_ul_class).animate({top:'-=' + o.actNameH},0);
50 counts++;
51 }else{
52 $(ul_class).animate({top:0},0);
53 $(copy_ul_class).animate({top:0},0);
54 counts = 1;
55 }
56 });
57 }
58 //点击向下移动时;
59 if(linum > o.maxShowNum){
60 $(click_go_down_C).click(function(){
61 if(counts > 1){
62 counts--;
63 $(ul_class).animate({top:'-'+ counts*o.actNameH},0);
64 $(copy_ul_class).animate({top:'-'+ counts*o.actNameH},0);
65 }else{
66 $(ul_class).animate({top:0},0);
67 $(copy_ul_class).animate({top:0},0);
68 counts = linum+1;
69 }
70 });
71 }
72 //鼠标经过所发生的开始停止;
73 if(linum > o.maxShowNum){
74 $(thiswrap).hover(function(){
75 goStopList();
76 },function(){
77 goStartList();
78 });
79 }
80 function goStartList(){
81 if(o.autoCloss === 'flase'){
82 go_start = setInterval(auto_function,o.autoTime);
83 }
84 }
85 function goStopList(){
86 clearInterval(go_start);
87 }
88 });
89 }
90 });
91 }(JQuery));

三、HTML:

<script language=”JavaScript”>
$(document).ready(function(){
$(“#newslist”).newsList();
});
</script>

<div id=”newslist”>
<div class=”go_upanddown”><span class=”go_uplist”><img src=”images/newslist/goupbtn.gif” /></span><span class=”go_downlist”><img src=”images/newslist/godownbtn.gif” /></span></div>
<div class=”news_list_bar”>
<ul class=”ul_news_list”>
<li><a href=”#”>1、曾参加过唐山、汶川、玉树地震救援的援</a><a href=”#”>曾参加过唐,又来到了舟曲参加救援</a></li>
<li><a href=”#”>2、摩洛哥塞拉,艺术家在一场为流浪儿童为流浪儿童为流浪儿童为流浪儿童募捐的马戏节目中表演</a></li>
<li><a href=”#”>3、昆明警方近日县的“洪兴甸县的“洪兴甸县的“洪兴甸县的“洪兴帮”黑恶势力团伙,缴获…</a></li>
<li><a href=”#”>4、印度克什知自己的孩子在骚乱中丧生时痛不欲生..</a><a href=”#”>曾参加过唐曾参加过唐到了舟曲参加救援</a></li>
<li><a href=”#”>5、明昆明警方近日捣毁了寻甸县的“洪兴帮”黑恶势力团伙,缴获…</a></li>
<li><a href=”#”>6、曾参加过唐曾参加过唐曾参加过唐曾参加过唐</a></li>
<li><a href=”#”>7、湖北武汉汉口汉口曾参加过唐曾参加过唐曾参加过唐曾参加过唐观看两江洪峰过</a></li>
<li><a href=”#”>8、湖北武汉汉曾参加过唐曾参加过唐曾参加过唐曾参加过唐集在江边观</a></li>
<li><a href=”#”>9、湖北武汉汉口汉口龙王庙景区观景平台上,市民聚集在江边观看两江洪峰过汉</a></li>
</ul>
<ul class=”ul_news_list2″></ul>
</div>
</div>

四、CSS:

body { font-family:”微软雅黑”,Arial,”Lucida Grande”, Verdana, Lucida; font-size:12px; }
*{ padding:0; margin:0;}
img { border:0;}
.clear { clear:both;}
a { color:#000; text-decoration:none;}
a:hover { color:#EC6104;  text-decoration:none;}
.undis { display:none;}/*news_list*/
.news_list_bar { position:relative;  width:560px; height:168px; overflow:hidden; background:url(../images/slideshow2/v3_picture6.gif) repeat-y; background-color:#F00;}
.ul_news_list,
.ul_news_list2{ position:relative; list-style:none;}
.ul_news_list li,
.ul_news_list2 li{line-height:28px;  height:28px; width:500px; overflow:hidden; white-space:nowrap;padding:0 20px;}
.ul_news_list li a,
.ul_news_list2 li a{ padding-right:20px;}
.go_upanddown { position:absolute; margin:-20px 0 0 500px;}
.go_upanddown span { padding-right:10px; cursor:pointer;}

[转载]asp.net mvc fckeditor全攻略

mikel阅读(1198)

[转载]asp.net mvc fckeditor全攻略 – ZilchWei-专注asp.net mvc – 博客园.

环境说明:

软件环境:ASP.NET mvc3   +   vs2010

系统环境:windows xp sp3

浏览器: ie6(不要鄙视我)

首先:最近因为要使用fckeditor,我们在网络上可以找到很多ASP.NET mvc fckeditor使用的教程,结果发现不全面。才有了本文。我就直接进入正题了

第一步我们需要下载2个包:

第一个包:FCKeditor_2.6.6第二包:FCKeditor.Net_2.6.4。我们可以在这里下载http://ckeditor.com/download我下载我是最新版。

解压后我们可以得到如下文件:第一个包:

这里我们只需要5个文件+1个文件夹就搞定。然后我们把它复制到我们项目的Content/Fck文件夹中

第二包:我们只需要FCKeditor.Net_2.6.4\bin\Release\2.0\FredCK.FCKeditorV2.dll这个 Dll文件。同样我们需要复制到项目的bin文件夹中(这里需要右键单击我们的项目 选择在  windows资源管理器中打开)

如下图

这样我们的文件处理就完成了。现在我们需要开始进行对他们的配置。

首先我们右键单击项目用的引用,选择添加引用。然后在选项卡中选择浏览。找到项目\bin\FredCK.FCKeditorV2.dll选中,单击确定。如下

现在我们开始配置第一个包(项目\fck\editor):

1.打开fckconfig.js。找到

var _FileBrowserLanguage = ‘php’ ; // asp | aspx | cfm | lasso | perl | php | py
var _QuickUploadLanguage = ‘php’ ; // asp | aspx | cfm | lasso | perl | php | py

我们需要修改为

var _FileBrowserLanguage = ‘aspx’ ; // asp | aspx | cfm | lasso | perl | php | py
var _QuickUploadLanguage = ‘aspx’ ; // asp | aspx | cfm | lasso | perl | php | py

非常不明白为什么默认的是php,难道做php开发的比做.net的要帅?拉回正题。这里我们修改的是上传文件的语言使用aspx

当然我们还需要做一个非常有意义的事情就是将

FCKConfig.DefaultLanguage  = ‘en’ ;改为FCKConfig.DefaultLanguage  = ‘zh-cn’ ;

这里我们将前台显示语言更改为中文。当然如果您愿意每次在前台巧一次代码修改也可以。

我们开始配置Web. Config文件找到节点appSettings我们添加如下代码

<add key=”FCKeditor:BasePath” value=”~/Content/Fck/”/>

<add key=”FCKeditor:UserFilesPath” value=”/FCKPro/Files” />

这里的修改都是方便我们配置,如果您喜欢每次调用配置一次也可以不添加。

现在我们建立HomeController,然后添加一个名为Index的ActionResult代码如下:

public ActionResult Index()
{
return View();
}

然后我们建立一个Aspx的view。

我们在页头引入<%@ Register Assembly=”FredCK.FCKeditorV2″ Namespace=”FredCK.FCKeditorV2″ TagPrefix=”FckV2″%>

然后使用FckV2这个控件具体代码如下

<%@ Page Language=”C#” Inherits=”System.Web.Mvc.ViewPage<dynamic>” %>
<%@ Register Assembly=”FredCK.FCKeditorV2″ Namespace=”FredCK.FCKeditorV2″ TagPrefix=”FckV2″%>
<!DOCTYPE html>

<html>
<head runat=”server”>
<title>Index</title>
</head>
<body>
<div>
<%using (Html.BeginForm()) { %>
<FckV2:FCKeditor runat=”server”  ID=”content”></FckV2:FCKeditor>
<input type=”submit” value=”添加” />
<%} %>
</div></body>
</html>

我们现在可以让我们的程序运行起来

看来不错。。但是我们的新闻是需要图片的。我们尝试下图片上传。悲剧继续发生。我们看了一个错误

我们根据提示路径打开config.ascx文件找到方法private bool CheckAuthentication()修改返回值为true;

OK。可以上传了!

这里我说明下CheckAuthentication。我们最好在里面做一次验证。为什么?

因为当我们方法直接返回为真的时候,服务器不会验证用户是否有权限上传。那么结果会导致所有人可以上传包括hack。

好了。废话了一堆本文到此结束。你可以下载示例项目查看结果。我建议大家按本文做一次。

下载示例

[转载]Android 3.0 r1中文API文档(103) —— InputMethodManager [输入法]

mikel阅读(841)

[转载]Android 3.0 r1中文API文档(103) —— InputMethodManager [输入法] – 农民伯伯 – 博客园.

前言

本章内容是Android.view.inputmethod.InputMethodManager,为输入法相关章节,版本为Android 3.0 r1,翻译来自”六必治”,欢迎大家访问他的博客:http://www.cnblogs.com/zcmky/,再次感谢”六必治” !期待你加入Android API 中文的翻译,联系我over140@gmail.com。

声明

欢迎转载,但请保留文章原始出处:)

博客园:http://www.cnblogs.com/

Android中文翻译组:http://goo.gl/6vJQl

正文

一、结构

public final class InputMethodManager extends Object

java.lang.Object

android.view.inputmethod.InputMethodManager

二、类概述

整个输入法框架(IMF)结构的核心API,应用程序之间进行调度和当前输入法交互。你可以用Context.getSystemService()取得这一接口的实例。

架构总述(Architecture Overview)

输入法框架(IMF)共有三个主要部分:

* 输入法管理器,管理各部分的交互。它是一个客户端API,存在于各个应用程序的context中,用来沟通管理所有进程间交互的全局系统服务。

* 输入法(IME) ,实现一个允许用户生成文本的独立交互模块。系统绑定一个当前的输入法。使其创建和生成,决定输入法何时隐藏或者显示它的UI。同一时间只能有一个IME运行。

* 客户应用程序,通过输入法管理器控制输入焦点和IME的状态。一次只能有一个客户端使用IME

应用程序(Applications)

大多数情况下,使用标准TextView或其子类的应用程序只要做少量工作就可以让软键盘(soft input methods)正常工作。你要注意的是:

* 正确设置你的可编辑文本视图inputType,这样输入法有足够的上下文帮助用户向其输入文本。

* 当输入法显示时妥善处理隐藏屏幕空间。理想的情况下应用程序应处理窗口变小,如必要你可以利用系统执行平移窗口。你应在活动(activity)中设置windowSoftInputMode属性或调整创建窗口的相应值,以便系统决定平移或缩放(它会尝试自动调整但可能出错)。

* 你还可以通过相同的windowSoftInputMode控制窗口的首选软键盘状态(打开、关闭等)。

通过API可以与IMF及其IME交互实现更细致的控制,如显示或输入区域,用户选取某输入法等。

当你编写自己的文本编辑器的时候,你要实现onCreateInputConnection(EditorInfo)以返回你的InputConnection的接口实例,用来允许IME和你的文本编辑域来交互。

输入法(Input Methods)

一个输入法(IME)是Service(服务)的实现,通常继承自 InputMethodServiceIME提供核心的 InputMethod接口,尽管提供InputMethod通常是由InputMethodService来处理,而IME的实现只需要处理更高层的API

更多信息参阅InputMethodService

安全(Security)

输入法关系到许多安全问题,因其基本不受约束地驱动UI并监视用户输入。Android输入法框架还允许调度第三方IME,所必须小心以限制他们的选择和相互作用。

以下是IMF背后安全架构的要点:

* 只允许系统访问经BIND_INPUT_METHOD权限许可访问IMEInputMethod接口。通过绑定到要求这个权限的服务来强制实现这一点。所以系统可以保证没有不被信任的客户端在它的控制之外访问到当前的输入法。

* IMF中可能有许多客户进程,但在同一时间只有一个是激活的。未激活客户端不能与IMF核心交互通过下述机制实现。

* 输入法客户端只可访问InputMethodSession接口。每个客户端创建一个接口实例,只有与激活客户相关联的会话的调用才会被IME处理。这点通过普通IME AbstractInputMethodService执行,必须由IME显式的处理,而IME正是InputMethodSession的自定义实现。

* 只有激活的InputConnection接受操作。IMF通知每个客户进程是否激活,IMF忽略非激活进程对当前输入联接的调用。这确保了当前IME只将事件和文本编辑交付用户可见焦点的UI

* 一个IME永远不能在屏幕关闭时与 InputConnection交互。这是通过当屏幕关闭时所有客户端无效,并防止不良IME在用户无法关注其行为时驱动UI

* 客户应用程序可以要求系统选取一个新的IME,但不能编程式选择之一。这是避免恶意程序在用户导航到其它应用程序时,选择自己的IME并保持运行。也就是说,IME可以编程式的要求系统选择其它IME,因它完全控制了用户输入。

用户在可切换至一个新的IME前必须显式的启用它,以确认系统了解它,使其处于可用状态。

三、常量

public static final int HIDE_IMPLICIT_ONLY

hideSoftInputFromWindow(IBinder, int)中的标志,表示如果用户未显式地显示软键盘窗口,则隐藏窗口。

常量值: 1 (0x00000001)

public static final int HIDE_NOT_ALWAYS

hideSoftInputFromWindow(IBinder, int)中的标志,表示软键盘窗口总是隐藏,除非开始时以SHOW_FORCED显示。

常量值: 2 (0x00000002)

public static final int RESULT_HIDDEN

showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver结果代码标志:软键盘窗口从显示切换到隐藏时的状态。

常量值: 3 (0x00000003)

public static final int RESULT_SHOWN

showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver结果代码标志:软键盘窗口从隐藏切换到显示时的状态。

常量值: 2 (0x00000002)

public static final int RESULT_UNCHANGED_HIDDEN

showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver结果代码标志:软键盘窗口不变保持隐藏时的状态。

常量值: 1 (0x00000001)

public static final int RESULT_UNCHANGED_SHOWN

showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver结果代码标志:软键盘窗口不变保持显示时的状态。

常量值: 0 (0x00000000)

public static final int SHOW_FORCED

showSoftInput(View, int)标志,表示用户强制打开输入法(如长按菜单键),一直保持打开直至只有显式关闭。

常量值: 2 (0x00000002)

public static final int SHOW_IMPLICIT

showSoftInput(View, int)标志,表示隐式显示输入窗口,非用户直接要求。窗口可能不显示。

常量值: 1 (0x00000001)

四、公共方法

public void displayCompletions (View view, CompletionInfo[] completions)

(译者注:输入法自动完成)

public InputMethodSubtype getCurrentInputMethodSubtype ()

(译者注:获取当前输入法类型?)

public List<InputMethodInfo> getEnabledInputMethodList ()

(译者注:获取已启用输入法列表?)

public List<InputMethodSubtype> getEnabledInputMethodSubtypeList (InputMethodInfo imi, boolean allowsImplicitlySelectedSubtypes)

public List<InputMethodInfo> getInputMethodList ()

(译者注:获取输入法列表)

public Map<InputMethodInfo, List<InputMethodSubtype>> getShortcutInputMethodsAndSubtypes ()

public void hideSoftInputFromInputMethod (IBinder token, int flags)

关闭/隐藏输入法软键盘区域,用户不再看到或与其交互。只能由当前激活输入法调用,因需令牌(token)验证。

参数

token 在输入法启动时提供令牌验证,验证后可对其进行操作。

flags 提供额外的操作标志。当前可以为0 HIDE_IMPLICIT_ONLY, HIDE_NOT_ALWAYS等位设置。

public boolean hideSoftInputFromWindow (IBinder windowToken, int flags)

hideSoftInputFromWindow(IBinder, int, ResultReceiver)的无返回值版:从窗口上下文中确定当前接收输入的窗口,隐藏其输入法窗口

参数

windowToken 由窗口请求View.getWindowToken()返回得到的令牌(token)

flags 提供额外的操作标志。当前可以为0 HIDE_IMPLICIT_ONLY位设置。

public boolean hideSoftInputFromWindow (IBinder windowToken, int flags, ResultReceiver resultReceiver)

从窗口上下文中确定当前接收输入的窗口,要求隐藏其软键盘窗口。它可由用户调用并得到结果而不仅仅是显式要求输入法窗口隐藏。

参数

windowToken 由窗口请求View.getWindowToken()返回得到的令牌(token)

flags 提供额外的操作标志。当前可以为0 HIDE_IMPLICIT_ONLY位设置。

resultReceiver  如不为空,当IME处理请求告诉你完成时调用。你收到的结果码可以是RESULT_UNCHANGED_SHOWN, RESULT_UNCHANGED_HIDDEN, RESULT_SHOWN, RESULT_HIDDEN

public void hideStatusIcon (IBinder imeToken)

(译者注:隐藏状态栏图标?)

public boolean isAcceptingText ()

当前服务视图接受全文编辑返回真。没有输入法联接为false,这时其只能处理原始按键事件。

public boolean isActive (View view)

视图为当前输入的激活视图时返回真。

public boolean isActive ()

输入法中的任意视图激活时返回真。

public boolean isFullscreenMode ()

判断相关输入法是否以全屏模式运行。全屏时,完全覆盖你的UI时,返回真,否则返回假。

public boolean isWatchingCursor (View view)

如当前输入法要看到输入编辑者的光标位置时返回真。

public void restartInput (View view)

如有输入法联接至视图,重启输入以显示新的内容。可在以下情况时调用此方法:视图的文字导致输入法外观变化或有按键输入流,如应用程序调用TextView.setText()时。

参数

view 文字发生变化的视图。

public void sendAppPrivateCommand (View view, String action, Bundle data)

对当前输入法调用 InputMethodSession.appPrivateCommand()

参数

view 可选的发送命令的视图,如你要发送命令而不考虑视图附加到输入法,此项可以为空。

action 执行的命令名称。必须是作用域的名称,如前缀包名称,这样不同的开发者就不会创建冲突的命令。

data 命令中包含的任何数据。

public boolean setCurrentInputMethodSubtype (InputMethodSubtype subtype)

(译者注:此方法为3.0中新增的方法)

public void setInputMethod (IBinder token, String id)

强制切换到新输入法部件。只能由持有token的应用程序(application)或服务(service) 调用当前激活输入法。

参数

token 在输入法启动时提供令牌验证,验证后可对其进行操作。

id              切换到新输入法的唯一标识。

public void setInputMethodAndSubtype (IBinder token, String id, InputMethodSubtype subtype)

强制切换到一个新的输入法和指定的类型。只能由持有token的应用程序(application)或服务(service) 调用当前激活输入法。(译者注:此方法为3.0中新增的方法)

参数

token 在输入法启动时提供令牌验证,验证后可对其进行操作。

id 切换到新输入法的唯一标识。

subtype 切换到新输入法的新类型。

public void showInputMethodAndSubtypeEnabler (String topId)

译者注:此方法为3.0中新增的方法)

public void showInputMethodPicker ()

(译者注:显示输入法菜单列表)

public boolean showSoftInput (View view, int flags, ResultReceiver resultReceiver)

如需要,显式要求当前输入法的软键盘区域向用户显示。当用户与视图交互,用户表示要开始执行输入操作时,可以调用此方法。

参数

view 当前焦点视图,可接受软键盘输入。

flags 提供额外的操作标志。当前可以是0SHOW_IMPLICIT 位设置。

resultReceiver 如不为空,当IME处理请求告诉你完成时调用。你收到的结果码可以是RESULT_UNCHANGED_SHOWN, RESULT_UNCHANGED_HIDDEN, RESULT_SHOWN, RESULT_HIDDEN

public boolean showSoftInput (View view, int flags)

showSoftInput(View, int, ResultReceiver)的无返回值版:如需要,显式要求当前输入法的软键盘区域向用户显示。

参数

view 当前焦点视图,可接受软键盘输入。

flags 提供额外的操作标志。当前可以是0SHOW_IMPLICIT 位设置。

public void showSoftInputFromInputMethod (IBinder token, int flags)

显示输入法的软键盘区域,这样用户可以到看到输入法窗口并能与其交互。只能由当前激活输入法调用,因需令牌(token)验证。

参数

token 在输入法启动时提供令牌验证,验证后可对其进行操作。

flags 提供额外的操作标志。可以是0 SHOW_IMPLICIT, SHOW_FORCED位设置。

public void showStatusIcon (IBinder imeToken, String packageName, int iconId)

(译者注:显示状态栏图标?)

public boolean switchToLastInputMethod (IBinder imeToken)

public void toggleSoftInput (int showFlags, int hideFlags)

(译者注:切换软键盘)

public void toggleSoftInputFromWindow (IBinder windowToken, int showFlags, int hideFlags)

本方法切换输入法的窗口显示。如输入窗口已显示,它隐藏。如无输入窗口则显示。

参数

windowToken  由窗口请求View.getWindowToken()返回得到的令牌(token)

showFlags 提供额外的操作标志。当前可以为0 HIDE_IMPLICIT_ONLY位设置。

hideFlags 提供额外的操作标志。可以是0 HIDE_IMPLICIT_ONLY, HIDE_NOT_ALWAYS位设置。

public void updateCursor (View view, int left, int top, int right, int bottom)

返回窗口的当前光标位置。

public void updateExtractedText (View view, int token, ExtractedText text)

(译者注:当内容变化时文本编辑器调用此方法,通知其新提取文本。)

public void updateSelection (View view, int selStart, int selEnd, int candidatesStart, int candidatesEnd)

返回当前选择区域。

五、补充

结束

越忙越需要坚持。

[转载]web页面实现指定区域打印功能

mikel阅读(1035)

[转载]web页面实现指定区域打印功能 – 湛蓝天空ZHW – 博客园.

使用CSS,定义一个.noprint的class,将不打印的内容放入这个class内。

详细如下:

<style media=print type=”text/css”>
.noprint{visibility:hidden}
</style>
要打印的内容。哈哈!
<p class=”noprint”>将不打印的代码放在这里。</p>
<a href=”javascrīpt:window.print()” target=”_self”>打印</a>

第二种方法:指定打印区域

把要打印的内容放入一个 span或div,然后通过一个函数打印。

<span id=’div1′>把要打印的内容放这里</span>
<p>所有内容</p>
<div id=”div2″>div2的内容</div>
<a href=”javascrīpt:printme()” target=”_self”>打印</a>

<scrīpt language=”javascrīpt”>
function printme()
{
document.body.innerHTML=document.getElementById(‘div1’).innerHTML+'<br/>’+document.getElementById(‘div2’).innerHTML;
window.print();
}
</scrīpt>

如果要打印的只是整个页面中的一小部分,就最好采用第二种方法。

第三种方法:如果要打印的页面排版和原web页面相差很大,采用此种方法。

点打印按钮弹出新窗口,把需要打印的内容显示到新窗口中,在新窗口中调用window.print()方法,然后自动关闭新窗口。