推荐几款zend解密软件 不指定

jed , 2008-9-2 14:30 , 代码编程 , 评论(0) , 阅读(5442) , Via 本站原创
前些日子接触了一下,zend解密软件,感觉都功能挺强大的,特此在此整理一下。

黑刀软件:



mmsn软件:

下载文件 (已下载 19448 次)


DeZender5软件

这个是朋友推荐的,还没用过。个人觉得还是mmsn好用。

下载文件 (已下载 498 次)







Tags:

 

要实现整个树,我们只要调用函数时用一个空字符串作为 $parent 和 $level = 0: display_children('',0); 函数返回了我们的食品店的树状图如下:

 

Food
Fruit
Red
Cherry
Yellow
Banana
Meat
Beef
Pork

注意如果你只想看一个子树,你可以告诉函数从另一个节点开始。例如,要显示“Fruit”子树,你只要display_children('Fruit',0);

The Path to a Node节点的路径

利用差不多的函数,我们也可以查询某个节点的路径如果你只知道这个节点的名字或者ID。例如,“Cherry”的路径是“Food”> “Fruit”>“Red”。要获得这个路径,我们的函数要获得这个路径,这个函数必须从最深的层次开始:“Cheery”。但后查找这个节点的父 节点,并添加到路径中。在我们的例子中,这个父节点是“Red”。如果我们知道“Red”是“Cherry”的父节点。

这个函数现在返回了指定节点的路径。他把路径作为数组返回,这样我们可以使用print_r(get_path('Cherry')); 来显示,其结果是:

Array
(
   [0] => Food
   [1] => Fruit
   [2] => Red)

 

不足

正如我们所见,这确实是一个很好的方法。他很容易理解,同时代码也很简单。但是邻接列表模型的缺点在哪里呢?在大多数编程语言中,他运行很慢,效率很差。这主要是“递归”造成的。我们每次查询节点都要访问数据库。

每次数据库查询都要花费一些时间,这让函数处理庞大的树时会十分慢。

造成这个函数不是太快的第二个原因可能是你使用的语言。不像Lisp这类语言,大多数语言不是针对递归函数设计的。对于每个节点,函数都要调用他自 己,产生新的实例。这样,对于一个4层的树,你可能同时要运行4个函数副本。对于每个函数都要占用一块内存并且需要一定的时间初始化,这样处理大树时递归 就很慢了。

改进前序遍历树

现在,让我们看另一种存储树的方法。递归可能会很慢,所以我们就尽量不使用递归函数。我们也想尽量减少数据库查询的次数。最好是每次只需要查询一次。

我们先把树按照水平方式摆开。从根节点开始(“Food”),然后他的左边写上1。然后按照树的顺序(从上到下)给“Fruit”的左边写上2。这 样,你沿着树的边界走啊走(这就是“遍历”),然后同时在每个节点的左边和右边写上数字。最后,我们回到了根节点“Food”在右边写上18。下面是标上 了数字的树,同时把遍历的顺序用箭头标出来了。

我们称这些数字为左值和右值(如,“Food”的左值是1,右值是18)。正如你所见,这些数字按时了每个节点之间的关系。因为“Red”有3和6 两个值,所以,它是有拥有1-18值的“Food”节点的后续。同样的,我们可以推断所有左值大于2并且右值小于11的节点,都是有2-11的 “Food”节点的后续。这样,树的结构就通过左值和右值储存下来了。这种数遍整棵树算节点的方法叫做“改进前序遍历树”算法。

 

在继续前,我们先看看我们的表格里的这些值:

注意单词“left”和“right”在SQL中有特殊的含义。因此,我们只能用“lft”和“rgt”来表示这两个列。(译注——其实Mysql 中可以用“`”来表示,如“`left`”,MSSQL中可以用“[]”括出,如“[left]”,这样就不会和关键词冲突了。)同样注意这里我们已经不需要“parent”列了。我们只需要使用lft和rgt就可以存储树的结构。

获取树

如果你要通过左值和右值来显示这个树的话,你要首先标识出你要获取的那些节点。例如,如果你想获得“Fruit”子树,你要选择那些左值在2到11的节点。用SQL语句表达:

SELECT * FROM tree WHERE lft BETWEEN 2 AND 11;

这个会返回:

好吧,现在整个树都在一个查询中了。现在就要像前面的递归函数那样显示这个树,我们要加入一个ORDER BY子句在这个查询中。如果你从表中添加和删除行,你的表可能就顺序不对了,我们因此需要按照他们的左值来进行排序。

SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC;

就只剩下缩进的问题了。

要显示树状结构,子节点应该比他们的父节点稍微缩进一些。我们可以通过保存一个右值的一个栈。每次你从一个节点的子节点开始时,你把这个节点的右值 添加到栈中。你也知道子节点的右值都比父节点的右值小,这样通过比较当前节点和栈中的前一个节点的右值,你可以判断你是不是在显示这个父节点的子节点。当 你显示完这个节点,你就要把他的右值从栈中删除。要获得当前节点的层数,只要数一下栈中的元素。

 

 

如果运行这段代码,你可以获得和上一部分讨论的递归函数一样的结果。而这个函数可能会更快一点:他不采用递归而且只是用了两个查询

节点的路径

有了新的算法,我们还要另找一种新的方法来获得指定节点的路径。这样,我们就需要这个节点的祖先的一个列表。

由于新的表结构,这不需要花太多功夫。你可以看一下,例如,4-5的“Cherry”节点,你会发现祖先的左值都小于4,同时右值都大于5。这样,我们就可以使用下面这个查询:

SELECT title FROM tree WHERE lft < 4 AND rgt > 5 ORDER BY lft ASC;

注意,就像前面的查询一样,我们必须使用一个ORDER BY子句来对节点排序。这个查询将返回:

+-------+
| title |
+-------+
| Food  |
| Fruit |
| Red   |
+-------+

我们现在只要把各行连起来,就可以得到“Cherry”的路径了。

有多少个后续节点?How Many Descendants

如果你给我一个节点的左值和右值,我就可以告诉你他有多少个后续节点,只要利用一点点数学知识。

因为每个后续节点依次会对这个节点的右值增加2,所以后续节点的数量可以这样计算:

descendants = (right – left - 1) / 2

利用这个简单的公式,我可以立刻告诉你2-11的“Fruit”节点有4个后续节点,8-9的“Banana”节点只是1个子节点,而不是父节点。

自动化树遍历

现在你对这个表做一些事情,我们应该学习如何自动的建立表了。这是一个不错的练习,首先用一个小的树,我们也需要一个脚本来帮我们完成对节点的计数。

让我们先写一个脚本用来把一个邻接列表转换成前序遍历树表格。

 

这是一个递归函数。你要从rebuild_tree('Food',1); 开始,这个函数就会获取所有的“Food”节点的子节点。

如果没有子节点,他就直接设置它的左值和右值。左值已经给出了,1,右值则是左值加1。如果有子节点,函数重复并且返回最后一个右值。这个右值用来作为“Food”的右值。

递归让这个函数有点复杂难于理解。然而,这个函数确实得到了同样的结果。他沿着树走,添加每一个他看见的节点。你运行了这个函数之后,你会发现左值和右值和预期的是一样的(一个快速检验的方法:根节点的右值应该是节点数量的两倍)。

添加一个节点

我们如何给这棵树添加一个节点?有两种方式:在表中保留“parent”列并且重新运行rebuild_tree() 函数——一个很简单但却不是很优雅的函数;或者你可以更新所有新节点右边的节点的左值和右值。

第一个想法比较简单。你使用邻接列表方法来更新,同时使用改进前序遍历树来查询。如果你想添加一个新的节点,你只需要把节点插入表格,并且设置好parent列。然后,你只需要重新运行rebuild_tree() 函数。这做起来很简单,但是对大的树效率不高。

第二种添加和删除节点的方法是更新新节点右边的所有节点。让我们看一下例子。我们要添加一种新的水果——“Strawberry”,作为“Red” 的最后一个子节点。首先,我们要腾出一个空间。“Red”的右值要从6变成8,7-10的“Yellow”节点要变成9-12,如此类推。更新“Red” 节点意味着我们要把所有左值和右值大于5的节点加上2。

我们用一下查询:

 

UPDATE tree SET rgt=rgt+2 WHERE rgt>5;
UPDATE tree SET lft=lft+2 WHERE lft>5;

现在我们可以添加一个新的节点“Strawberry”来填补这个新的空间。这个节点左值为6右值为7。

INSERT INTO tree SET lft=6, rgt=7, title='Strawberry';

如果我们运行display_tree() 函数,我们将发现我们新的“Strawberry”节点已经成功地插入了树中:

Food
 Fruit
   Red
     Cherry
     Strawberry
   Yellow
     Banana
 Meat
   Beef
   Pork

缺点

首先,改进前序遍历树算法看上去很难理解。它当然没有邻接列表方法简单。然而,一旦你习惯了左值和右值这两个属性,他就会变得清晰起来,你可以用这个技术来完成临街列表能完成的所有事情,同时改进前序遍历树算法更快。当然,更新树需要很多查询,要慢一点,但是取得节点却可以只用一个查询。

总结

你现在已经对两种在数据库存储树方式熟悉了吧。虽然在我这儿改进前序遍历树算法性能更好,但是也许在你特殊的情况下邻接列表方法可能表现更好一些。这个就留给你自己决定了

最后一点:就像我已经说得我部推荐你使用节点的标题来引用这个节点。你应该遵循数据库标准化的基本规则。我没有使用数字标识是因为用了之后例子就比较难读。

算法3

在MYSQL中,数据表大致上是
CREATE TABLE Table_Types
(
 id INTEGER NOT NULL AUTO_INCREMENT,
 parent_id INTEGER,
 node VARCHAR(255),
 PRIMARY KEY (id)
)
如上图,紫色的是数据记录的ID号,框内的数字是每条记录的node字段,记录了该记录的父ID和父ID的父ID和...
这样,假如我们要在ID为7的记录下,插入一条新ID为13的记录,新记录的node就是1,2,7,13
要找一个节点下的所有子节点,就无需用递归,只要一个SQL。
如“查ID为2记录下所有子节点”
select * from Table_Types where node like "1,2,%"
大家探讨一下,该算法的有效性和不足!
上次看到的左右值的算法,虽然在搜索方面很不错,但是如果是插入频繁的应用,性能就很差了,因为每次插入新节点都需要update该父节点以下 的所有记录。的右值。而上面这个算法,对插入操作尤其简单,只要找到父ID的根下来就可以了。搜索方面好像也还不错,都是避免了递归。

无论你要构建自己的论坛,在你的网站上发布消息还是书写自己的CMS程序,你都会遇到要在数据库中存储层次数据的情况。同时,除非你使用一种像XML的数据库,否则关系数据库中的表都不是层次结构的,他们只是一个平坦的列表。所以你必须找到一种把层次数据库转化的方法。

存储树形结构是一个很常见的问题,他有好几种解决方案。主要有两种方法:邻接列表模型和改进前序遍历树算法

在本文中,我们将探讨这两种保存层次数据的方法。我将举一个在线食品店树形图的例子。这个食品店通过类别、颜色和品种来组织食品。树形图如下:

本文包含了一些代码的例子来演示如何保存和获取数据。我选择PHP来写例子,因为我常用这个语言,而且很多人也都使用或者知道这个语言。你可以很方便地把它们翻译成你自己用的语言。

邻接列表模型(The Adjacency List Model)

我们要尝试的第一个——也是最优美的——方法称为“邻接列表模型”或称为“递归方法”。它是一个很优雅的方法因为你只需要一个简单的方法来在你的树中进行迭代。在我们的食品店中,邻接列表的表格如下:

如你所见,对每个节点保存一个“父”节点。我们可以看到“Pear”是“Green”的一个子节点,而后者又是“Fruit”的子节点,如此类推。 根节点,“Food”,则他的父节点没有值。为了简单,我只用了“title”值来标识每个节点。当然,在实际的数据库中,你要使用数字的ID。

显示树

现在我们已经把树放入数据库中了,得写一个显示函数了。这个函数将从根节点开始——没有父节点的节点——同时要显示这个节点所有的子节点。对于这些子节点,函数也要获取并显示这个子节点的子节点。然后,对于他们的子节点,函数还要再显示所有的子节点,然后依次类推。

也许你已经注意到了,这种函数的描述,有一种普遍的模式。我们可以简单地只写一个函数,用来获得特定节点的子节点。这个函数然后要对每个子节点调用自身来再次显示他们的子节点。这就是“递归”机制,因此称这种方法叫“递归方法”。


<?php
$dict=array(
'a'=>0xB0C4,
'b'=>0xB2C0,
'c'=>0xB4ED,
'd'=>0xB6E9,
'e'=>0xB7A1,
'f'=>0xB8C0,
'g'=>0xB9FD,
'h'=>0xBBF6,
'j'=>0xBFA5,
'k'=>0xC0AB,
'l'=>0xC2E7,
'm'=>0xC4C2,
'n'=>0xC5B5,
'o'=>0xC5BD,
'p'=>0xC6D9,
'q'=>0xC8BA,
'r'=>0xC8F5,
's'=>0xCBF9,
't'=>0xCDD9,
'w'=>0xCEF3,
'x'=>0xD188,
'y'=>0xD4D0,
'z'=>0xD7F9,
);
//取GB2312字符串首字母,原理是GBK汉字是按拼音顺序编码的.
function get_letter($input)
{
global $dict;
$str_1 = substr($input, 0, 1);
if ($str_1 >= chr(0x81) && $str_1 <= chr(0xfe)) {
$num = hexdec(bin2hex(substr($input, 0, 2)));
foreach ($dict as $k=>$v){
if($v>=$num)
break;
}
return $k;
}
else{
return $str_1;
}
}

echo get_letter('中');
echo get_letter('华');
echo get_letter('人');
echo get_letter('民');
echo get_letter('共');
echo get_letter('和');
echo get_letter('国');
echo get_letter('万岁');
echo get_letter('c');
echo get_letter('h');
echo get_letter('i');
echo get_letter('n');
echo get_letter('a');

?>
Tags: ,

FCK配置大全 不指定

jed , 2008-6-30 11:21 , 代码编程 , 评论(0) , 阅读(2590) , Via 本站原创
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
* Copyright (C) 2003-2007 Frederico Caldeira Knabben
*
* == BEGIN LICENSE ==
*
* Licensed under the terms of any of the following licenses at your
* choice:
*
* - GNU General Public License Version 2 or later (the "GPL")
* http://www.gnu.org/licenses/gpl.html
*
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
* http://www.gnu.org/licenses/lgpl.html
*
* - Mozilla Public License Version 1.1 or later (the "MPL")
* http://www.mozilla.org/MPL/MPL-1.1.html
*
* == END LICENSE ==
*
* Editor configuration settings.
*
* Follow this link for more information:
* http://wiki.fckeditor.net/Developer%27s_Guide/Configuration/Configurations_Settings
*/

// Disable the custom Enter Key Handler. This option will be removed in version 2.5.
FCKConfig.DisableEnterKeyHandler = false ;

FCKConfig.CustomConfigurationsPath = '' ;//自定义配置文件路径和名称

FCKConfig.EditorAreaCSS = FCKConfig.BasePath + 'css/fck_editorarea.css' ;//编辑区的样式表文件
FCKConfig.ToolbarComboPreviewCSS = '' ;

FCKConfig.DocType = '' ;

FCKConfig.BaseHref = '' ;//相对链接的基地址

FCKConfig.FullPage = false ;//是否允许编辑整个HTML文件,还是仅允许编辑BODY间的内容


FCKConfig.Debug = false ;//是否开启调试功能,这样,当调用FCKDebug.Output()时,会在调试窗中输出内容
FCKConfig.AllowQueryStringDebug = true ;

FCKConfig.SkinPath = FCKConfig.BasePath + 'skins/default/' ;//默认皮肤,可修改为:'skins/office2003/'
FCKConfig.PreloadImages = [ FCKConfig.SkinPath + 'images/toolbar.start.gif', FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif' ] ;

FCKConfig.PluginsPath = FCKConfig.BasePath + 'plugins/' ;//插件文件夹

// FCKConfig.Plugins.Add( 'autogrow' ) ;
FCKConfig.AutoGrowMax = 400 ;

// FCKConfig.ProtectedSource.Add( /<%[\s\S]*?%>/g ) ; // ASP style server side code <%...%>
// FCKConfig.ProtectedSource.Add( /<\?[\s\S]*?\?>/g ) ; // PHP style server side code
// FCKConfig.ProtectedSource.Add( /(<asp:[^\>]+>[\s|\S]*?<\/asp:[^\>]+>)|(<asp:[^\>]+\/>)/gi ) ; // ASP.Net style tags <asp:control>

FCKConfig.AutoDetectLanguage = true ;//浏览器自动检测语言,应改为false
FCKConfig.DefaultLanguage = 'en'//默认语言为英文,应改为'zh-cn'

FCKConfig.ContentLangDirection = 'ltr' ;//默认文字方向

FCKConfig.ProcessHTMLEntities = true ;
FCKConfig.IncludeLatinEntities = true ;
FCKConfig.IncludeGreekEntities = true ;

FCKConfig.ProcessNumericEntities = false ;

FCKConfig.AdditionalNumericEntities = '' ; // Single Quote: "'"

FCKConfig.FillEmptyBlocks = true ;//使用这个功能,可以将空的块级元素用空格来替代


FCKConfig.FormatSource = true ;//在切换到代码视图时是否自动格式化代码
FCKConfig.FormatOutput = true ;//当输出内容时是否自动格式化代码
FCKConfig.FormatIndentator = ' ' ;//当在源码格式下缩进代码使用的字符


FCKConfig.ForceStrongEm = true ;
FCKConfig.GeckoUseSPAN = false ;//是否允许SPAN标记代替B,I,U标记
FCKConfig.StartupFocus = false ;//开启时FOCUS到编辑器
FCKConfig.ForcePasteAsPlainText = false ;//强制粘贴为纯文本
FCKConfig.AutoDetectPasteFromWord = true ; // IE only.
FCKConfig.ForceSimpleAmpersand = false ;//是否不把&符号转换为XML实体
FCKConfig.TabSpaces = 1 ;//TAB键产生的空格字符数
FCKConfig.ShowBorders = true ;//合并边框

FCKConfig.SourcePopup = false ;
FCKConfig.ToolbarStartExpanded = true ;//开启是TOOLBAR是否展开
FCKConfig.ToolbarCanCollapse = true ;//是否允许展开/折叠工具栏
FCKConfig.IgnoreEmptyParagraphValue = true ;
FCKConfig.PreserveSessionOnFileBrowser = false ;
FCKConfig.FloatingPanelsZIndex = 10000 ;

FCKConfig.TemplateReplaceAll = true ;
FCKConfig.TemplateReplaceCheckbox = true ;

FCKConfig.ToolbarLocation = 'In' ;

//ToolbarSets表示设置 default默认设置.Basic基本设置.

FCKConfig.ToolbarSets["Default"] = [
['Source','DocProps','-','Save','NewPage','Preview','-','Templates'],
['Cut','Copy','Paste','PasteText','PasteWord','-','Print','SpellCheck'],
['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
['Form','Checkbox','Radio','TextField','Textarea','Select','Button','ImageButton','HiddenField'],
'/',
['Bold','Italic','Underline','StrikeThrough','-','Subscript','Superscript'],
['OrderedList','UnorderedList','-','Outdent','Indent'],
['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
['Link','Unlink','Anchor'],
['Image','Flash','Table','Rule','Smiley','SpecialChar','PageBreak'],
'/',
['Style','FontFormat','FontName','FontSize'],
['TextColor','BGColor'],
['FitWindow','-','About']
] ;

FCKConfig.ToolbarSets["Basic"] = [
['Bold','Italic','-','OrderedList','UnorderedList','-',/*'Link',*/'Unlink','-','Style','FontSize','TextColor','BGColor','-','Smiley','SpecialChar','Replace','Preview']

] ;

FCKConfig.EnterMode = 'p' ; // p | div | br
FCKConfig.ShiftEnterMode = 'br' ; // p | div | br

FCKConfig.Keystrokes = [
[ CTRL + 65 /*A*/, true ],
[ CTRL + 67 /*C*/, true ],
[ CTRL + 70 /*F*/, true ],
[ CTRL + 83 /*S*/, true ],
[ CTRL + 88 /*X*/, true ],
[ CTRL + 86 /*V*/, 'Paste' ],
[ SHIFT + 45 /*INS*/, 'Paste' ],
[ CTRL + 90 /*Z*/, 'Undo' ],
[ CTRL + 89 /*Y*/, 'Redo' ],
[ CTRL + SHIFT + 90 /*Z*/, 'Redo' ],
[ CTRL + 76 /*L*/, 'Link' ],
[ CTRL + 66 /*B*/, 'Bold' ],
[ CTRL + 73 /*I*/, 'Italic' ],
[ CTRL + 85 /*U*/, 'Underline' ],
[ CTRL + SHIFT + 83 /*S*/, 'Save' ],
[ CTRL + ALT + 13 /*ENTER*/, 'FitWindow' ],
[ CTRL + 9 /*TAB*/, 'Source' ]
] ;

FCKConfig.ContextMenu = ['Generic','Link','Anchor','Image','Flash','Select','Textarea','Checkbox','Radio','TextField','HiddenField','ImageButton','Button','BulletedList','NumberedList','Table','Form'] ;//字符串数组,右键菜单的内容
FCKConfig.BrowserContextMenuOnCtrl = false ;

FCKConfig.FontColors = '000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,808080,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF' ;//设置显示颜色拾取器时文字颜色列表

FCKConfig.FontNames = '宋体;黑体;隶书;楷体_GB2312;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana';//添加需要的中文字体
FCKConfig.FontSizes = '1/xx-small;2/x-small;3/small;4/medium;5/large;6/x-large;7/xx-large' ;//字体大小中的字号列表
FCKConfig.FontFormats = 'p;div;pre;address;h1;h2;h3;h4;h5;h6' ;//设置显示在文字格式列表中的命名

FCKConfig.StylesXmlPath = FCKConfig.EditorPath + 'fckstyles.xml' ;//设置定义CSS样式列表的XML文件的位置
FCKConfig.TemplatesXmlPath = FCKConfig.EditorPath + 'fcktemplates.xml' ;

FCKConfig.SpellChecker = 'ieSpell' ; // 'ieSpell' | 'SpellerPages'//设置拼写检查器
FCKConfig.IeSpellDownloadUrl = 'http://www.iespell.com/download.php' ;//下载拼写检查器的网址
FCKConfig.SpellerPagesServerScript = 'server-scripts/spellchecker.php' ; // Available extension: .php .cfm .pl
FCKConfig.FirefoxSpellChecker = false ;

FCKConfig.MaxUndoLevels = 15 ;

FCKConfig.DisableObjectResizing = false ;
FCKConfig.DisableFFTableHandles = true ;

FCKConfig.LinkDlgHideTarget = false ;
FCKConfig.LinkDlgHideAdvanced = false ;

FCKConfig.ImageDlgHideLink = false ;
FCKConfig.ImageDlgHideAdvanced = false ;

FCKConfig.FlashDlgHideAdvanced = false ;

FCKConfig.ProtectedTags = '' ;

// This will be applied to the body element of the editor
FCKConfig.BodyId = '' ;
FCKConfig.BodyClass = '' ;

FCKConfig.DefaultLinkTarget = '' ;

// The option switches between trying to keep the html structure or do the changes so the content looks like it was in Word
FCKConfig.CleanWordKeepsStructure = false ;

// The following value defines which File Browser connector and Quick Upload
// "uploader" to use. It is valid for the default implementaion and it is here
// just to make this configuration file cleaner.
// It is not possible to change this value using an external file or even
// inline when creating the editor instance. In that cases you must set the
// values of LinkBrowserURL, ImageBrowserURL and so on.
// Custom implementations should just ignore it.
var _FileBrowserLanguage = 'aspx' ; // asp | aspx | cfm | lasso | perl | php | py
var _QuickUploadLanguage = 'aspx' ; // asp | aspx | cfm | lasso | php


// Don't care about the following line. It just calculates the correct connector
// extension to use for the default File Browser (Perl uses "cgi").
var _FileBrowserExtension = _FileBrowserLanguage == 'perl' ? 'cgi' : _FileBrowserLanguage ;

FCKConfig.LinkBrowser = false;//是否允许在插入链接时浏览服务器

FCKConfig.LinkBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Connector=connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ;//插入链接时浏览服务器的URL
FCKConfig.LinkBrowserWindowWidth = FCKConfig.ScreenWidth * 0.7 ; // 70%//链接目标浏览器窗口高度
FCKConfig.LinkBrowserWindowHeight = FCKConfig.ScreenHeight * 0.7 ; // 70%//链接目标浏览器窗口宽度

FCKConfig.ImageBrowser = false;//false表示关闭图片文件浏览服务器的功能
FCKConfig.ImageBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Image&Connector=connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ;//浏览服务器时运行的URL
FCKConfig.ImageBrowserWindowWidth = FCKConfig.ScreenWidth * 0.7 ; // 70% ;//图像浏览器窗口高度
FCKConfig.ImageBrowserWindowHeight = FCKConfig.ScreenHeight * 0.7 ; // 70% ;//图像浏览器窗口宽度

FCKConfig.FlashBrowser = false;//false表示关闭Flash浏览服务器的功能
FCKConfig.FlashBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Flash&Connector=connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ;
FCKConfig.FlashBrowserWindowWidth = FCKConfig.ScreenWidth * 0.7 ; //70% ;
FCKConfig.FlashBrowserWindowHeight = FCKConfig.ScreenHeight * 0.7 ; //70% ;

FCKConfig.LinkUpload = true ;//True表示开启文件上传的功能
FCKConfig.LinkUploadURL = FCKConfig.BasePath + 'filemanager/upload/' + _QuickUploadLanguage + '/upload.' + _QuickUploadLanguage ;
FCKConfig.LinkUploadAllowedExtensions = "" ; // empty for all
FCKConfig.LinkUploadDeniedExtensions = ".(html|htm|php|php2|php3|php4|php5|phtml|pwml|inc|asp|aspx|ascx|jsp|cfm|cfc|pl|bat|exe|com|dll|vbs|js|reg|cgi|htaccess|asis|sh|shtml|shtm|phtm)$" ; // empty for no one

FCKConfig.ImageUpload = true ;//True表示开启图片上传的功能
FCKConfig.ImageUploadURL = FCKConfig.BasePath + 'filemanager/upload/' + _QuickUploadLanguage + '/upload.' + _QuickUploadLanguage + '?Type=Image' ;
FCKConfig.ImageUploadAllowedExtensions = ".(jpg|gif|jpeg|png|bmp)$" ; // empty for all
FCKConfig.ImageUploadDeniedExtensions = "" ; // empty for no one

FCKConfig.FlashUpload = true ;//True表示开启Falsh上传的功能
FCKConfig.FlashUploadURL = FCKConfig.BasePath + 'filemanager/upload/' + _QuickUploadLanguage + '/upload.' + _QuickUploadLanguage + '?Type=Flash' ;
FCKConfig.FlashUploadAllowedExtensions = ".(swf|fla)$" ; // empty for all
FCKConfig.FlashUploadDeniedExtensions = "" ; // empty for no one

FCKConfig.SmileyPath = FCKConfig.BasePath + 'images/smiley/msn/' ;//图符文件夹路径
FCKConfig.SmileyImages = ['regular_smile.gif','sad_smile.gif','wink_smile.gif','teeth_smile.gif','confused_smile.gif','tounge_smile.gif','embaressed_smile.gif','omg_smile.gif','whatchutalkingabout_smile.gif','angry_smile.gif','angel_smile.gif','shades_smile.gif','devil_smile.gif','cry_smile.gif','lightbulb.gif','thumbs_down.gif','thumbs_up.gif','heart.gif','broken_heart.gif','kiss.gif','envelope.gif'] ;//字符数组 图符窗中图片文件名数组
FCKConfig.SmileyColumns = 8 ;// 图符窗列数
FCKConfig.SmileyWindowWidth = 320 ;//图符窗口宽度
FCKConfig.SmileyWindowHeight = 240 ;//图符窗口高度
Tags:

URL 处理函数库 不指定

jed , 2008-6-19 08:50 , 代码编程 , 评论(0) , 阅读(1520) , Via 本站原创
parse_url: 解析 URL 字符串。
urldecode: 还原 URL 编码字符串。
urlencode: 将字符串以 URL 编码。
base64_encode: 将字符串以 BASE64 编码。
base64_decode: 将 BASE64 编码字符串解码。

parse_url
解析 URL 字符串。
语法: array parse_url(string url);
返回值: 数组
函数种类: 资料处理
内容说明: 本函数将 URL 字符串予以解析,并将结果返回数组中。完整的 URL 类似这样子
scheme://user:pass@host:port/path?query。
http://john:john1234@john.wilson.gs:88/abcdef.php?a=1234
因此返回的数组包括了下列元素:scheme、host、port、user、pass、path、query 与 fragment 等。

urldecode
还原 URL 编码字符串。
语法: string urldecode(string str);
返回值: 字符串
函数种类: 编码处理
内容说明: 本函数将 URL 编码后字符串还原成未编码的样子。编码使用 %## 的格式。
参考: urlencode()

urlencode
将字符串以 URL 编码。
语法: string urlencode(string str);
返回值: 字符串
函数种类: 编码处理
内容说明: 本函数将字符串以 URL 编码。例如空格就会变成加号。Homepage 中 form 资料传送就是用 urlencode 编码后再送出。
使用范例
本例将中文字符串以 URL 编码过,转给别的 CGI 使用

<?php
$EncodeStr=urlencode($ChineseName);
echo "<a href=/cgi/personal.cgi?n=$EncodeStr>个人信息</a>";
?>

参考: urldecode()

base64_encode
将字符串以 BASE64 编码。
语法: string base64_encode(string data);
返回值: 字符串
函数种类: 编码处理
内容说明: 本函数将字符串以 MIME BASE64 编码。此编码方式可以让中文字或者图片也能在网络上顺利传输。在 BASE64 编码后的字符串只包含英文字母大小写、阿拉伯数字、加号与反斜线,共 64 个基本字符,不包含其它特殊的字符,因而才取名 BASE64。编码后的字符串比原来的字符串长度再加 1/3 左右。更多的 BASE64 编码信息可以参考 RFC2045 文件之 6.8 节。
参考: base64_decode() chunk_split()

base64_decode
将 BASE64 编码字符串解码。
语法: string base64_decode(string encoded_data);
返回值: 字符串
函数种类: 编码处理
内容说明: 本函数将以 MIME BASE64 编码字符串解码。解码后的字符串可能为中文字符串或其它的二进位资料。
参考: base64_encode()


Tags: ,
1、支持PHP4和PHP5
2、增加了对ajax分页的功能
3、优化了整体结构等等。。。

代码如下:



<?
/**
* filename: ext_page.class.php
* @package:phpbean
* @author :feifengxlq<feifengxlq#gmail.com><http://www.phpobject.net/>
* @copyright :Copyright 2006 feifengxlq
* @license:version 2.0
* @create:2006-5-31
* @modify:2006-6-1
* @modify:feifengxlq 2006-11-4
* description:超强分页类,四种分页模式,默认采用类似baidu,google的分页风格。
* 2.0增加功能:支持自定义风格,自定义样式,同时支持PHP4和PHP5,
* to see detail,please visit http://www.phpobject.net/blog/read.php?
* example:
* 模式四种分页模式:
   require_once('../libs/classes/page.class.php');
   $page=new page(array('total'=>1000,'perpage'=>20));
   echo 'mode:1<br>'.$page->show();
   echo '<hr>mode:2<br>'.$page->show(2);
   echo '<hr>mode:3<br>'.$page->show(3);
   echo '<hr>mode:4<br>'.$page->show(4);
   开启AJAX:
   $ajaxpage=new page(array('total'=>1000,'perpage'=>20,'ajax'=>'ajax_page','page_name'=>'test'));
   echo 'mode:1<br>'.$ajaxpage->show();
   采用继承自定义分页显示模式:
   demo:http://www.phpobject.net/blog
*/
class page  
{
    /**
     * config ,public
     */
    var $page_name="PB_page";//page标签,用来控制url页。比如说xxx.php?PB_page=2中的PB_page
    var $next_page='>';//下一页
    var $pre_page='<';//上一页
    var $first_page='First';//首页
    var $last_page='Last';//尾页
    var $pre_bar='<<';//上一分页条
    var $next_bar='>>';//下一分页条
    var $format_left='[';
    var $format_right=']';
    var $is_ajax=false;//是否支持AJAX分页模式    
    
    /**
     * private
     *
     */    
    var $pagebarnum=10;//控制记录条的个数。
    var $totalpage=0;//总页数
    var $ajax_action_name='';//AJAX动作名
    var $nowindex=1;//当前页
    var $url="";//url地址头
    var $offset=0;
    
    /**
     * constructor构造函数
     *
     * @param array $array['total'],$array['perpage'],$array['nowindex'],$array['url'],$array['ajax']...
     */
    function page($array)
    {
        if(is_array($array)){
           if(!array_key_exists('total',$array))$this->error(__FUNCTION__,'need a param of total');
           $total=intval($array['total']);
           $perpage=(array_key_exists('perpage',$array))?intval($array['perpage']):10;
           $nowindex=(array_key_exists('nowindex',$array))?intval($array['nowindex']):'';
           $url=(array_key_exists('url',$array))?$array['url']:'';
        }else{
           $total=$array;
           $perpage=10;
           $nowindex='';
           $url='';
        }
        if((!is_int($total))||($total<0))$this->error(__FUNCTION__,$total.' is not a positive integer!');
        if((!is_int($perpage))||($perpage<=0))$this->error(__FUNCTION__,$perpage.' is not a positive integer!');
        if(!empty($array['page_name']))$this->set('page_name',$array['page_name']);//设置pagename
        $this->_set_nowindex($nowindex);//设置当前页
        $this->_set_url($url);//设置链接地址
        $this->totalpage=ceil($total/$perpage);
        $this->offset=($this->nowindex-1)*$this->perpage;
        if(!empty($array['ajax']))$this->open_ajax($array['ajax']);//打开AJAX模式
    }
    /**
     * 设定类中指定变量名的值,如果改变量不属于这个类,将throw一个exception
     *
     * @param string $var
     * @param string $value
     */
    function set($var,$value)
    {
        if(in_array($var,get_object_vars($this)))
           $this->$var=$value;
        else {
            $this->error(__FUNCTION__,$var." does not belong to PB_Page!");
        }
        
    }
    /**
     * 打开倒AJAX模式
     *
     * @param string $action 默认ajax触发的动作。
     */
    function open_ajax($action)
    {
        $this->is_ajax=true;
        $this->ajax_action_name=$action;
    }
    /**
     * 获取显示"下一页"的代码
     *  
     * @param string $style
     * @return string
     */
    function next_page($style='')
    {
        if($this->nowindex<$this->totalpage){
            return $this->_get_link($this->_get_url($this->nowindex+1),$this->next_page,$style);
        }
        return '<span class="'.$style.'">'.$this->next_page.'</span>';
    }
    
    /**
     * 获取显示“上一页”的代码
     *
     * @param string $style
     * @return string
     */
    function pre_page($style='')
    {
        if($this->nowindex>1){
            return $this->_get_link($this->_get_url($this->nowindex-1),$this->pre_page,$style);
        }
        return '<span class="'.$style.'">'.$this->pre_page.'</span>';
    }
    
    /**
     * 获取显示“首页”的代码
     *
     * @return string
     */
    function first_page($style='')
    {
        if($this->nowindex==1){
            return '<span class="'.$style.'">'.$this->first_page.'</span>';
        }
        return $this->_get_link($this->_get_url(1),$this->first_page,$style);
    }
    
    /**
     * 获取显示“尾页”的代码
     *
     * @return string
     */
    function last_page($style='')
    {
        if($this->nowindex==$this->totalpage){
            return '<span class="'.$style.'">'.$this->last_page.'</span>';
        }
        return $this->_get_link($this->_get_url($this->totalpage),$this->last_page,$style);
    }
    
    function nowbar($style='',$nowindex_style='')
    {
        $plus=ceil($this->pagebarnum/2);
        if($this->pagebarnum-$plus+$this->nowindex>$this->totalpage)$plus=($this->pagebarnum-$this->totalpage+$this->nowindex);
        $begin=$this->nowindex-$plus+1;
        $begin=($begin>=1)?$begin:1;
        $return='';
        for($i=$begin;$i<$begin+$this->pagebarnum;$i++)
        {
            if($i<=$this->totalpage){
                if($i!=$this->nowindex)
                    $return.=$this->_get_text($this->_get_link($this->_get_url($i),$i,$style));
                else  
                    $return.=$this->_get_text('<span class="'.$nowindex_style.'">'.$i.'</span>');
            }else{
                break;
            }
            $return.="\n";
        }
        unset($begin);
        return $return;
    }
    /**
     * 获取显示跳转按钮的代码
     *
     * @return string
     */
    function select()
    {
        $return='<select name="PB_Page_Select" onchange="window.location.href=\''.$this->url.'\'+this.options[this.selectedIndex].value">';
        for($i=1;$i<=$this->totalpage;$i++)
        {
            if($i==$this->nowindex){
                $return.='<option value="'.$i.'" selected>'.$i.'</option>';
            }else{
                $return.='<option value="'.$i.'">'.$i.'</option>';
            }
        }
        unset($i);
        $return.='</select>';
        return $return;
    }
    
    /**
     * 获取mysql 语句中limit需要的值
     *
     * @return string
     */
    function offset()
    {
        return $this->offset;
    }
    
    /**
     * 控制分页显示风格(你可以增加相应的风格)
     *
     * @param int $mode
     * @return string
     */
    function show($mode=1)
    {
        switch ($mode)
        {
            case '1':
                $this->next_page='下一页';
                $this->pre_page='上一页';
                return $this->pre_page().$this->nowbar().$this->next_page().'第'.$this->select().'页';
                break;
            case '2':
                $this->next_page='下一页';
                $this->pre_page='上一页';
                $this->first_page='首页';
                $this->last_page='尾页';
                return $this->first_page().$this->pre_page().'[第'.$this->nowindex.'页]'.$this->next_page().$this->last_page().'第'.$this->select().'页';
                break;
            case '3':
                $this->next_page='下一页';
                $this->pre_page='上一页';
                $this->first_page='首页';
                $this->last_page='尾页';
                return $this->first_page().$this->pre_page().$this->next_page().$this->last_page();
                break;
            case '4':
                $this->next_page='下一页';
                $this->pre_page='上一页';
                return $this->pre_page().$this->nowbar().$this->next_page();
                break;
            case '5':
                return $this->pre_bar().$this->pre_page().$this->nowbar().$this->next_page().$this->next_bar();
                break;
        }
        
    }
/*----------------private function (私有方法)-----------------------------------------------------------*/
    /**
     * 设置url头地址
     * @param: String $url
     * @return boolean
     */
    function _set_url($url="")
    {
        if(!empty($url)){
            //手动设置
            $this->url=$url.((stristr($url,'?'))?'&':'?').$this->page_name."=";
        }else{
            //自动获取
            if(empty($_SERVER['QUERY_STRING'])){
                //不存在QUERY_STRING时
                $this->url=$_SERVER['REQUEST_URI']."?".$this->page_name."=";
            }else{
                //
                if(stristr($_SERVER['QUERY_STRING'],$this->page_name.'=')){
                    //地址存在页面参数
                    $this->url=str_replace($this->page_name.'='.$this->nowindex,'',$_SERVER['REQUEST_URI']);
                    $last=$this->url[strlen($this->url)-1];
                    if($last=='?'||$last=='&'){
                        $this->url.=$this->page_name."=";
                    }else{
                        $this->url.='&'.$this->page_name."=";
                    }
                }else{
                    //
                    $this->url=$_SERVER['REQUEST_URI'].'&'.$this->page_name.'=';
                }//end if                
            }//end if
        }//end if
    }
    
    /**
     * 设置当前页面
     *
     */
    function _set_nowindex($nowindex)
    {
        if(empty($nowindex)){
            //系统获取
            
            if(isset($_GET[$this->page_name])){
                $this->nowindex=intval($_GET[$this->page_name]);
            }
        }else{
            //手动设置
            $this->nowindex=intval($nowindex);
        }
    }
        
    /**
     * 为指定的页面返回地址值
     *
     * @param int $pageno
     * @return string $url
     */
    function _get_url($pageno=1)
    {
        return $this->url.$pageno;
    }
    
    /**
     * 获取分页显示文字,比如说默认情况下_get_text('<a href="">1</a>')将返回[<a href="">1</a>]
     *
     * @param String $str
     * @return string $url
     */    
    function _get_text($str)
    {
        return $this->format_left.$str.$this->format_right;
    }
    
    /**
      * 获取链接地址
    */
    function _get_link($url,$text,$style=''){
        $style=(empty($style))?'':'class="'.$style.'"';
        if($this->is_ajax){
            //如果是使用AJAX模式
            return '<a '.$style.' href="javascript:'.$this->ajax_action_name.'(\''.$url.'\')">'.$text.'</a>';
        }else{
            return '<a '.$style.' href="'.$url.'">'.$text.'</a>';
        }
    }
    /**
      * 出错处理方式
    */
    function error($function,$errormsg)
    {
        die('Error in file <b>'.__FILE__.'</b> ,Function <b>'.$function.'()</b> :'.$errormsg);
    }
}
?>






提供一个简单的演示demo

PHP代码如下:



<?
require_once('../libs/classes/page.class.php');
$page=new page(array('total'=>1000,'perpage'=>20));
echo 'mode:1<br>'.$page->show();
echo '<hr>mode:2<br>'.$page->show(2);
echo '<hr>mode:3<br>'.$page->show(3);
echo '<hr>mode:4<br>'.$page->show(4);
echo '<hr>开始AJAX模式:';
$ajaxpage=new page(array('total'=>1000,'perpage'=>20,'ajax'=>'ajax_page','page_name'=>'test'));
echo 'mode:1<br>'.$ajaxpage->show();
?>



效果图见附件!


提供自定义风格的演示demo一个:

PHP代码如下:



<style type="text/css">
<!--
.pagenavi { text-align:center;  font: 11px Arial, tahoma, sans-serif; padding-top: 20px; padding-bottom: 10px; margin: 0px; }
.pagenavi a {border: 1px solid #E2F1AF; background: #FFFFFF; text-decoration: none; color:#C16012; display:inline-block; padding-left:6px; padding-right:6px; padding-top:2px; padding-bottom:2px}
.pagenavi a:visited {border: 1px solid #E2F1AF; background: #FFFFFF; text-decoration: none; padding-left:6px; padding-right:6px; padding-top:2px; padding-bottom:2px}
.pagenavi .break {border: medium none;  text-decoration: none; color:#C16012; background:;; padding-left:6px; padding-right:6px; padding-top:2px; padding-bottom:2px}
.pagenavi .num {color:#C16012; font-size:12pt; padding-left:3px; padding-right:3px; padding-top:0; padding-bottom:0}
.pagenavi .curr {padding: 2px 6px; border-color: #999; font-weight: bold; font-size:12pt; background:transparent;}
.pagenavi a:hover {color: #C16012; background: #E2F1AF; text-decoration: none}
-->
</style>
<?
require_once('../libs/classes/page.class.php');
class mypage extends page
{
    function mypage($array)
{
     parent::page($array);
  $this->first_page=1;
  $this->last_page=$this->totalpage;
  $this->set('format_left','');
  $this->set('format_right','');
}

function show()
{
     $pagestr='<div class="pagenavi" id="lopage">页:';
  $pagestr.=$this->first_page().' ';
  $pagestr.=$this->nowbar('','curr');
  $pagestr.='<span class="break">...</span>';
  $pagestr.=$this->last_page();
  $pagestr.='   (总计<span class="num">'.$this->totalpage.'</span>页) </div>';
  $pagestr.='</div>';
  return $pagestr;
}
}
$page=new mypage(array('total'=>1000,'perpage'=>20));
echo $page->show();
?>







Tags: , ,
做程序的时候,无论Php还是Asp,缓存的问题很是让人讨厌,虽说缓存是个好东西,但在写程序,调试程序的时候,缓存就显得多余了,尤其是在那无敌的Ie下...

我想大部分页面都会有一个或几个相同的头文件被包含,我们可以在头文件里加入下面的代码解决缓存问题:



Php:header("Cache-Control: no-cache, must-revalidate");

ASP:response.addHeader("Cache-Control","no-cache");



当然,如果只有一个或为数不多的几个页面需要禁止缓存,我们同样可以把上面的代码单独加入到那些需要的页面里面。
Tags: ,

php日期转换 不指定

jed , 2008-5-10 21:01 , 代码编程 , 评论(0) , 阅读(1530) , Via 本站原创

问:如何将“02 January 2008”转换成“2008-01-02”呢?
答:date("Y-m-d", strtotime("02 January 2008"))
十分好用的js代码,能够屏蔽Alt+方向键,F5刷新键,退格键,还有CTR+N,shift+F10,F11等键

<script>  
  function   document.onkeydown()   {          
      if   ((window.event.altKey)&&    
              ((window.event.keyCode==37)||       //屏蔽   Alt+   方向键   ←    
                (window.event.keyCode==39))){     //屏蔽   Alt+   方向键   →    
            alert("软件不支持你使用ALT+方向键前进或后退!");    
            event.returnValue=false;    
            }    
      if   ((event.keyCode==8)||                         //屏蔽退格删除键    
              (event.keyCode==116)){                     //屏蔽   F5   刷新键    
            event.keyCode=0;    
            event.returnValue=false;    
            }    
      if   ((event.ctrlKey)&&(event.keyCode==78)){       //屏蔽   Ctrl+n    
            event.returnValue=false;    
            }    
      if   ((event.shiftKey)&&(event.keyCode==121)){   //屏蔽   shift+F10    
            event.returnValue=false;    
            }    
      if   (event.keyCode==122){   //屏蔽   F11    
            event.returnValue=false;    
            }    
      }
  function   document.onfocus(){
      if   ((window.event.altKey)&&    
              ((window.event.keyCode==37)||       //屏蔽   Alt+   方向键   ←    
                (window.event.keyCode==39))){     //屏蔽   Alt+   方向键   →    
            alert("软件不支持你使用ALT+方向键前进或后退!");    
            event.returnValue=false;    
            }    
      if   ((event.keyCode==8)||                         //屏蔽退格删除键    
              (event.keyCode==116)){                     //屏蔽   F5   刷新键    
            event.keyCode=0;    
            event.returnValue=false;    
            }    
      if   ((event.ctrlKey)&&(event.keyCode==78)){       //屏蔽   Ctrl+n    
            event.returnValue=false;    
            }    
      if   ((event.shiftKey)&&(event.keyCode==121)){   //屏蔽   shift+F10    
            event.returnValue=false;    
            }    
      if   (event.keyCode==122){   //屏蔽   F11    
            event.returnValue=false;    
            }    
      }
  </script>  


Tags: ,
大家一定遇到过网页内容无法复制的问题,虽然实现技术简单,但碰到时还真是挺烦人的,现在偶提供两个最迅速的解决方案
方法1:
推荐大家使用基于IE内核的浏览器--世界之窗(The world),具备解除页面脚本屏蔽复制的功能,现同解除页面右键菜单限制功能一起,在其它选项中可设置,名称为:解除页面脚本限制(复制、右键菜单等)
1.*版本下载地址:http://www.ioage.com/cn/theworld_download.htm
2.*版本下载地址:http://www.ioage.com/download/TheWorld2.0Beta_cnxp
方法2:
就是在浏览器地址栏输入以下代码:

javascript:alert(document.onselectstart = document.oncontextmenu = document.onmousedown = document.onkeydown = function(){return true;});



嘿嘿,是不是可以选中内容可以复制了?神奇吧!

说到灵感来源,还要从前几天在发布的一特搞笑的技术说起(原文地址:http://www.dzhai.com/blog/article.asp?id=133),它是通过在地址栏输入javascript代码而使得网页中的图片满天飞舞,效果很是不错。虽然很容易明白其原理,但还是很佩服该作者的创意,呵呵。。于是便想这个小trick是否能有其他实用的用处呢。。。

说到这里,大家都明白了,就是用来解决网页能容无法复制的问题。

首先了解下常见的实现无法复制内容的javascript技术,如下:
分页: 8/22 第一页 上页 3 4 5 6 7 8 9 10 11 12 下页 最后页 [ 显示模式: 摘要 | 列表 ]