<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/feedsky7.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/maxie" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/maxie" type="application/rss+xml"></fs:self_link><lastBuildDate>Sat, 06 Sep 2008 12:50:00 GMT</lastBuildDate><title>博客园-MaxIE</title><description>人生之路并不漫长，来来去去的都是那些狭窄的街巷。可是来时未曾相约，你才让我独自苦苦等候，遥遥无期的守望，险些凝固成历史的永恒。</description><link>http://www.cnblogs.com/MaxIE/</link><language>zh-cn</language><pubDate>Sat, 11 Oct 2008 13:10:22 GMT</pubDate><item><title>MySQL 服务器调优</title><link>http://item.feedsky.com/~feedsky/maxie/~5930961/121278556/4059375/1/item.html</link><wfw:comment>http://www.cnblogs.com/MaxIE/comments/1285783.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/MaxIE/comments/commentRss/1285783.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/MaxIE/services/trackbacks/1285783.html</trackback:ping><description>&lt;p&gt;最近帮人维护一个DZ论坛，总结如下几个调优技巧，让 MySQL 服务器飞速运行&lt;br /&gt;有 3 种方法可以加快 MySQL 服务器的运行速度，效率从低到高依次为：&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;1.替换有问题的硬件。&lt;br /&gt;2.对 MySQL 进程的设置进行调优。&lt;br /&gt;3.对查询进行优化。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;替换有问题的硬件通常是我们的第一考虑，主要原因是数据库会占用大量资源。不过这种解决方案也就仅限于此了。实际上，您通常可以让中央处理器（CPU）或磁盘速度加倍，也可以让内存增大 4 到 8 倍。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;第二种方法是对 MySQL 服务器（也称为 mysqld）进行调优。对这个进程进行调优意味着适当地分配内存，并让 mysqld 了解将会承受何种类型的负载。加快磁盘运行速度不如减少所需的磁盘访问次数。类似地，确保 MySQL 进程正确操作就意味着它花费在服务查询上的时间要多于花费在处理后台任务（如处理临时磁盘表或打开和关闭文件）上的时间。对 mysqld 进行调优是本文的重点。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;最好的方法是确保查询已经进行了优化。这意味着对表应用了适当的索引，查询是按照可以充分利用 MySQL 功能的方式来编写的。尽管本文并没有包含查询调优方面的内容（很多著作中已经针对这个主题进行了探讨），不过它会配置 mysqld 来报告可能需要进行调优的查询。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;虽然已经为这些任务指派了次序，但是仍然要注意硬件和 mysqld 的设置以利于适当地调优查询。机器速度慢也就罢了，我曾经见过速度很快的机器在运行设计良好的查询时由于负载过重而失败，因为 mysqld 被大量繁忙的工作所占用而不能服务查询。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;记录慢速查询&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在一个 SQL 服务器中，数据表都是保存在磁盘上的。索引为服务器提供了一种在表中查找特定数据行的方法，而不用搜索整个表。当必须要搜索整个表时，就称为表扫描。通常 来说，您可能只希望获得表中数据的一个子集，因此全表扫描会浪费大量的磁盘 I/O，因此也就会浪费大量时间。当必须对数据进行连接时，这个问题就更加复杂了，因为必须要对连接两端的多行数据进行比较。&lt;/p&gt;
&lt;p&gt;当然，表扫描并不总是会带来问题；有时读取整个表反而会比从中挑选出一部分数据更加有效（服务器进程中查询规划器用来作出这些决定）。如果索引 的使用效率很低，或者根本就不能使用索引，则会减慢查询速度，而且随着服务器上的负载和表大小的增加，这个问题会变得更加显著。执行时间超过给定时间范围 的查询就称为慢速查询。&lt;/p&gt;
&lt;p&gt;您可以配置 mysqld 将这些慢速查询记录到适当命名的慢速查询日志中。管理员然后会查看这个日志来帮助他们确定应用程序中有哪些部分需要进一步调查。清单 1 给出了要启用慢速查询日志需要在 my.cnf 中所做的配置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;清单 1. 启用 MySQL 慢速查询日志&lt;/strong&gt;&lt;/p&gt;
&lt;table style=&quot;font-size: 12px; width: 80%; border: #999999 1px solid;&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000; background-color: #a6a6a6;&quot;&gt;[mysqld] ; enable the slow query log, default 10 seconds log-slow-queries ; log queries taking longer than 5 seconds long_query_time = 5 ; log queries that don&amp;rsquo;t use indexes even if they take less than long_query_time ; MySQL 4.1 and newer only log-queries-not-using-indexes&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这三个设置一起使用，可以记录执行时间超过 5 秒和没有使用索引的查询。请注意有关 log-queries-not-using-indexes 的警告：您必须使用 MySQL 4.1 或更高版本。慢速查询日志都保存在 MySQL 数据目录中，名为 hostname-slow.log。如果希望使用一个不同的名字或路径，可以在 my.cnf 中使用 log-slow-queries = /new/path/to/file 实现此目的。&lt;/p&gt;
&lt;p&gt;阅读慢速查询日志最好是通过 mysqldumpslow 命令进行。指定日志文件的路径，就可以看到一个慢速查询的排序后的列表，并且还显示了它们在日志文件中出现的次数。一个非常有用的特性是 mysqldumpslow 在比较结果之前，会删除任何用户指定的数据，因此对同一个查询的不同调用被计为一次；这可以帮助找出需要工作量最多的查询。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;对查询进行缓存&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;很多 LAMP 应用程序都严重依赖于数据库，但却会反复执行相同的查询。每次执行查询时，数据库都必须要执行相同的工作 &amp;mdash;&amp;mdash; 对查询进行分析，确定如何执行查询，从磁盘中加载信息，然后将结果返回给客户机。MySQL 有一个特性称为查询缓存，它将（后面会用到的）查询结果保存在内存中。在很多情况下，这会极大地提高性能。不过，问题是查询缓存在默认情况下是禁用的。&lt;/p&gt;
&lt;p&gt;将 query_cache_size = 32M 添加到 /etc/my.conf 中可以启用 32MB 的查询缓存。&lt;/p&gt;
&lt;p&gt;监视查询缓存&lt;/p&gt;
&lt;p&gt;在启用查询缓存之后，重要的是要理解它是否得到了有效的使用。MySQL 有几个可以查看的变量，可以用来了解缓存中的情况。清单 2 给出了缓存的状态。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;清单 2. 显示查询缓存的统计信息&lt;/strong&gt;&lt;br /&gt;mysql&amp;gt; SHOW STATUS LIKE &amp;lsquo;qcache%&amp;rsquo;;&lt;br /&gt;&lt;span style=&quot;background-color: #767676;&quot;&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;+&lt;br /&gt;| Variable_name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Value&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;+&lt;br /&gt;| Qcache_free_blocks&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 5216&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;| Qcache_free_memory&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 14640664&amp;nbsp;&amp;nbsp; |&lt;br /&gt;| Qcache_hits&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 2581646882 |&lt;br /&gt;| Qcache_inserts&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 360210964&amp;nbsp; |&lt;br /&gt;| Qcache_lowmem_prunes&amp;nbsp;&amp;nbsp;&amp;nbsp; | 281680433&amp;nbsp; |&lt;br /&gt;| Qcache_not_cached&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 79740667&amp;nbsp;&amp;nbsp; |&lt;br /&gt;| Qcache_queries_in_cache | 16927&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;| Qcache_total_blocks&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 47042&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;+&lt;br /&gt;8 rows in set (0.00 sec)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;这些项的解释如表 1 所示。&lt;/p&gt;
&lt;p&gt;表 1. MySQL 查询缓存变量变量名&amp;nbsp;说明&lt;br /&gt;Qcache_free_blocks &amp;nbsp;缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE 会对缓存中的碎片进行整理，从而得到一个空闲块。&lt;br /&gt;Qcache_free_memory &amp;nbsp;缓存中的空闲内存。&lt;br /&gt;Qcache_hits &amp;nbsp;每次查询在缓存中命中时就增大。&lt;br /&gt;Qcache_inserts &amp;nbsp;每次插入一个查询时就增大。命中次数除以插入次数就是不中比率；用 1 减去这个值就是命中率。在上面这个例子中，大约有 87% 的查询都在缓存中命中。&lt;br /&gt;Qcache_lowmem_prunes &amp;nbsp;缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看；如果这个数字在不断增长，就表示可能碎片非常严重，或者内 存很少。（上面的 free_blocks 和 free_memory 可以告诉您属于哪种情况）。&lt;br /&gt;Qcache_not_cached &amp;nbsp;不适合进行缓存的查询的数量，通常是由于这些查询不是 SELECT 语句。&lt;br /&gt;Qcache_queries_in_cache &amp;nbsp;当前缓存的查询（和响应）的数量。&lt;br /&gt;Qcache_total_blocks &amp;nbsp;缓存中块的数量。&lt;br /&gt;通常，间隔几秒显示这些变量就可以看出区别，这可以帮助确定缓存是否正在有效地使用。运行 FLUSH STATUS 可以重置一些计数器，如果服务器已经运行了一段时间，这会非常有帮助。&lt;/p&gt;
&lt;p&gt;使用非常大的查询缓存，期望可以缓存所有东西，这种想法非常诱人。由于 mysqld 必须要对缓存进行维护，例如当内存变得很低时执行剪除，因此服务器可能会在试图管理缓存时而陷入困境。作为一条规则，如果 FLUSH QUERY CACHE 占用了很长时间，那就说明缓存太大了。&lt;/p&gt;
&lt;p&gt;强制限制&lt;/p&gt;
&lt;p&gt;您可以在 mysqld 中强制一些限制来确保系统负载不会导致资源耗尽的情况出现。清单 3 给出了 my.cnf 中与资源有关的一些重要设置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;清单 3. MySQL 资源设置&lt;/strong&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #767676;&quot;&gt;set-variable=max_connections=500&lt;br /&gt;set-variable=wait_timeout=10&lt;br /&gt;max_connect_errors = 100&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;连接最大个数是在第一行中进行管理的。与 Apache 中的 MaxClients 类似，其想法是确保只建立服务允许数目的连接。要确定服务器上目前建立过的最大连接数，请执行 SHOW STATUS LIKE &amp;lsquo;max_used_connections&amp;rsquo;。&lt;/p&gt;
&lt;p&gt;第 2 行告诉 mysqld 终止所有空闲时间超过 10 秒的连接。在 LAMP 应用程序中，连接数据库的时间通常就是 Web 服务器处理请求所花费的时间。有时候，如果负载过重，连接会挂起，并且会占用连接表空间。如果有多个交互用户或使用了到数据库的持久连接，那么将这个值设 低一点并不可取！&lt;/p&gt;
&lt;p&gt;最后一行是一个安全的方法。如果一个主机在连接到服务器时有问题，并重试很多次后放弃，那么这个主机就会被锁定，直到 FLUSH HOSTS 之后才能运行。默认情况下，10 次失败就足以导致锁定了。将这个值修改为 100 会给服务器足够的时间来从问题中恢复。如果重试 100 次都无法建立连接，那么使用再高的值也不会有太多帮助，可能它根本就无法连接。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;缓冲区和缓存&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;MySQL 支持超过 100 个的可调节设置；但是幸运的是，掌握少数几个就可以满足大部分需要。查找这些设置的正确值可以通过 SHOW STATUS 命令查看状态变量，从中可以确定 mysqld 的运作情况是否符合我们的预期。给缓冲区和缓存分配的内存不能超过系统中的现有内存，因此调优通常都需要进行一些妥协。&lt;/p&gt;
&lt;p&gt;MySQL 可调节设置可以应用于整个 mysqld 进程，也可以应用于单个客户机会话。&lt;/p&gt;
&lt;p&gt;服务器端的设置&lt;/p&gt;
&lt;p&gt;每个表都可以表示为磁盘上的一个文件，必须先打开，后读取。为了加快从文件中读取数据的过程，mysqld 对这些打开文件进行了缓存，其最大数目由 /etc/mysqld.conf 中的 table_cache 指定。清单 4 给出了显示与打开表有关的活动的方式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;清单 4. 显示打开表的活动&lt;/strong&gt;&lt;br /&gt;mysql&amp;gt; SHOW STATUS LIKE &amp;lsquo;open%tables&amp;rsquo;;&lt;br /&gt;&lt;span style=&quot;background-color: #a6a6a6;&quot;&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;+&amp;mdash;&amp;mdash;-+&lt;br /&gt;| Variable_name | Value |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;+&amp;mdash;&amp;mdash;-+&lt;br /&gt;| Open_tables&amp;nbsp;&amp;nbsp; | 5000&amp;nbsp; |&lt;br /&gt;| Opened_tables | 195&amp;nbsp;&amp;nbsp; |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;+&amp;mdash;&amp;mdash;-+&lt;br /&gt;2 rows in set (0.00 sec)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;清单 4 说明目前有 5,000 个表是打开的，有 195 个表需要打开，因为现在缓存中已经没有可用文件描述符了（由于统计信息在前面已经清除了，因此可能会存在 5,000 个打开表中只有 195 个打开记录的情况）。如果 Opened_tables 随着重新运行 SHOW STATUS 命令快速增加，就说明缓存命中率不够。如果 Open_tables 比 table_cache 设置小很多，就说明该值太大了（不过有空间可以增长总不是什么坏事）。例如，使用 table_cache = 5000 可以调整表的缓存。&lt;/p&gt;
&lt;p&gt;与表的缓存类似，对于线程来说也有一个缓存。 mysqld 在接收连接时会根据需要生成线程。在一个连接变化很快的繁忙服务器上，对线程进行缓存便于以后使用可以加快最初的连接。&lt;/p&gt;
&lt;p&gt;清单 5 显示如何确定是否缓存了足够的线程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;清单 5. 显示线程使用统计信息&lt;/strong&gt;&lt;br /&gt;mysql&amp;gt; SHOW STATUS LIKE &amp;lsquo;threads%&amp;rsquo;;&lt;br /&gt;&lt;span style=&quot;background-color: #a6a6a6;&quot;&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;&amp;ndash;+&lt;br /&gt;| Variable_name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Value&amp;nbsp; |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;&amp;ndash;+&lt;br /&gt;| Threads_cached&amp;nbsp;&amp;nbsp;&amp;nbsp; | 27&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;| Threads_connected | 15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;| Threads_created&amp;nbsp;&amp;nbsp; | 838610 |&lt;br /&gt;| Threads_running&amp;nbsp;&amp;nbsp; | 3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;&amp;ndash;+&lt;br /&gt;4 rows in set (0.00 sec)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;此处重要的值是 Threads_created，每次 mysqld 需要创建一个新线程时，这个值都会增加。如果这个数字在连续执行 SHOW STATUS 命令时快速增加，就应该尝试增大线程缓存。例如，可以在 my.cnf 中使用 thread_cache = 40 来实现此目的。&lt;/p&gt;
&lt;p&gt;关键字缓冲区保存了 MyISAM 表的索引块。理想情况下，对于这些块的请求应该来自于内存，而不是来自于磁盘。清单 6 显示了如何确定有多少块是从磁盘中读取的，以及有多少块是从内存中读取的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;清单 6. 确定关键字效率&lt;/strong&gt;&lt;br /&gt;mysql&amp;gt; show status like &amp;lsquo;%key_read%&amp;rsquo;;&lt;br /&gt;&lt;span style=&quot;background-color: #a6a6a6;&quot;&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;+&lt;br /&gt;| Variable_name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Value&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;+&lt;br /&gt;| Key_read_requests | 163554268 |&lt;br /&gt;| Key_reads&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 98247&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;+&lt;br /&gt;2 rows in set (0.00 sec)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Key_reads 代表命中磁盘的请求个数， Key_read_requests 是总数。命中磁盘的读请求数除以读请求总数就是不中比率 &amp;mdash;&amp;mdash; 在本例中每 1,000 个请求，大约有 0.6 个没有命中内存。如果每 1,000 个请求中命中磁盘的数目超过 1 个，就应该考虑增大关键字缓冲区了。例如，key_buffer = 384M 会将缓冲区设置为 384MB。&lt;/p&gt;
&lt;p&gt;临时表可以在更高级的查询中使用，其中数据在进一步进行处理（例如 GROUP BY 字句）之前，都必须先保存到临时表中；理想情况下，在内存中创建临时表。但是如果临时表变得太大，就需要写入磁盘中。清单 7 给出了与临时表创建有关的统计信息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;清单 7. 确定临时表的使用&lt;/strong&gt;&lt;br /&gt;mysql&amp;gt; SHOW STATUS LIKE &amp;lsquo;created_tmp%&amp;rsquo;;&lt;br /&gt;&lt;span style=&quot;background-color: #a6a6a6;&quot;&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;-+&lt;br /&gt;| Variable_name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Value |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;-+&lt;br /&gt;| Created_tmp_disk_tables | 30660 |&lt;br /&gt;| Created_tmp_files&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;| Created_tmp_tables&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 32912 |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;-+&lt;br /&gt;3 rows in set (0.00 sec)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;每次使用临时表都会增大 Created_tmp_tables；基于磁盘的表也会增大 Created_tmp_disk_tables。对于这个比率，并没有什么严格的规则，因为这依赖于所涉及的查询。长时间观察 Created_tmp_disk_tables 会显示所创建的磁盘表的比率，您可以确定设置的效率。 tmp_table_size 和 max_heap_table_size 都可以控制临时表的最大大小，因此请确保在 my.cnf 中对这两个值都进行了设置。&lt;/p&gt;
&lt;p&gt;每个会话的设置&lt;/p&gt;
&lt;p&gt;下面这些设置针对于每个会话。在设置这些数字时要十分谨慎，因为它们在乘以可能存在的连接数时候，这些选项表示大量的内存！您可以通过代码修改会话中的这些数字，或者在 my.cnf 中为所有会话修改这些设置。&lt;/p&gt;
&lt;p&gt;当 MySQL 必须要进行排序时，就会在从磁盘上读取数据时分配一个排序缓冲区来存放这些数据行。如果要排序的数据太大，那么数据就必须保存到磁盘上的临时文件中，并再 次进行排序。如果 sort_merge_passes 状态变量很大，这就指示了磁盘的活动情况。清单 8 给出了一些与排序相关的状态计数器信息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;清单 8. 显示排序统计信息&lt;/strong&gt;&lt;br /&gt;mysql&amp;gt; SHOW STATUS LIKE &amp;ldquo;sort%&amp;rdquo;;&lt;br /&gt;&lt;span style=&quot;background-color: #a6a6a6;&quot;&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;&amp;mdash;+&lt;br /&gt;| Variable_name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Value&amp;nbsp;&amp;nbsp; |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;&amp;mdash;+&lt;br /&gt;| Sort_merge_passes | 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;| Sort_range&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 79192&amp;nbsp;&amp;nbsp; |&lt;br /&gt;| Sort_rows&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 2066532 |&lt;br /&gt;| Sort_scan&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 44006&amp;nbsp;&amp;nbsp; |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-+&amp;mdash;&amp;mdash;&amp;mdash;+&lt;br /&gt;4 rows in set (0.00 sec)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如果 sort_merge_passes 很大，就表示需要注意 sort_buffer_size。例如， sort_buffer_size = 4M 将排序缓冲区设置为 4MB。&lt;/p&gt;
&lt;p&gt;MySQL 也会分配一些内存来读取表。理想情况下，索引提供了足够多的信息，可以只读入所需要的行，但是有时候查询（设计不佳或数据本性使然）需要读取表中大量数 据。要理解这种行为，需要知道运行了多少个 SELECT 语句，以及需要读取表中的下一行数据的次数（而不是通过索引直接访问）。实现这种功能的命令如清单 9 所示。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;清单 9. 确定表扫描比率&lt;/strong&gt;&lt;br /&gt;mysql&amp;gt; SHOW STATUS LIKE &amp;ldquo;com_select&amp;rdquo;;&lt;br /&gt;&lt;span style=&quot;background-color: #767676;&quot;&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;+&amp;mdash;&amp;mdash;&amp;ndash;+&lt;br /&gt;| Variable_name | Value&amp;nbsp; |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;+&amp;mdash;&amp;mdash;&amp;ndash;+&lt;br /&gt;| Com_select&amp;nbsp;&amp;nbsp;&amp;nbsp; | 318243 |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;+&amp;mdash;&amp;mdash;&amp;ndash;+&lt;br /&gt;1 row in set (0.00 sec)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;mysql&amp;gt; SHOW STATUS LIKE &amp;ldquo;handler_read_rnd_next&amp;rdquo;;&lt;br /&gt;&lt;span style=&quot;background-color: #a6a6a6;&quot;&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;+&lt;br /&gt;| Variable_name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Value&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;+&lt;br /&gt;| Handler_read_rnd_next | 165959471 |&lt;br /&gt;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;+&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;+&lt;br /&gt;1 row in set (0.00 sec)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Handler_read_rnd_next / Com_select 得出了表扫描比率 &amp;mdash;&amp;mdash; 在本例中是 521:1。如果该值超过 4000，就应该查看 read_buffer_size，例如 read_buffer_size = 4M。如果这个数字超过了 8M，就应该与开发人员讨论一下对这些查询进行调优了！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3 个必不可少的工具&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;尽管在了解具体设置时，SHOW STATUS 命令会非常有用，但是您还需要一些工具来解释 mysqld 所提供的大量数据。我发现有 3 个工具是必不可少的；在 参考资料 一节中您可以找到相应的链接。&lt;/p&gt;
&lt;p&gt;大部分系统管理员都非常熟悉 top 命令，它为任务所消耗的 CPU 和内存提供了一个不断更新的视图。 mytop 对 top 进行了仿真；它为所有连接上的客户机以及它们正在运行的查询提供了一个视图。mytop 还提供了一个有关关键字缓冲区和查询缓存效率的实时数据和历史数据，以及有关正在运行的查询的统计信息。这是一个很有用的工具，可以查看系统中（比如 10 秒钟之内）的状况，您可以获得有关服务器健康信息的视图，并显示导致问题的任何连接。&lt;/p&gt;
&lt;p&gt;mysqlard 是一个连接到 MySQL 服务器上的守护程序，负责每 5 分钟搜集一次数据，并将它们存储到后台的一个 Round Robin Database 中。有一个 Web 页面会显示这些数据，例如表缓存的使用情况、关键字效率、连接上的客户机以及临时表的使用情况。尽管 mytop 提供了服务器健康信息的快照，但是 mysqlard 则提供了长期的健康信息。作为奖励，mysqlard 使用自己搜集到的一些信息针对如何对服务器进行调优给出一些建议。&lt;/p&gt;
&lt;p&gt;搜集 SHOW STATUS 信息的另外一个工具是 mysqlreport。其报告要远比 mysqlard 更加复杂，因为需要对服务器的每个方面都进行分析。这是对服务器进行调优的一个非常好的工具，因为它对状态变量进行适当计算来帮助确定需要修正哪些问题。&lt;/p&gt;&lt;img src =&quot;http://www.cnblogs.com/MaxIE/aggbug/1285783.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/42945/&quot; target=&quot;_blank&quot;&gt;[新闻]Google股价跌破329美元 61%员工期权价值归零&lt;/a&gt;&lt;br/&gt;&lt;a href=&quot;http://www.cnblogs.com&quot; target=&quot;_blank&quot;&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com&quot; target=&quot;_blank&quot;&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://news.cnblogs.com&quot; target=&quot;_blank&quot;&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/group.htm&quot; target=&quot;_blank&quot;&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/q&quot; target=&quot;_blank&quot;&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://wz.cnblogs.com/&quot; target=&quot;_blank&quot;&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/ing&quot; target=&quot;_blank&quot;&gt;闪存&lt;/a&gt;&lt;br /&gt;&lt;!-- Feedsky flare --&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=e549723ea861a4329e2d98587f3f9f2c&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=e549723ea861a4329e2d98587f3f9f2c&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=13b4cd72f1ca7662206ddd1d162f27ec&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=13b4cd72f1ca7662206ddd1d162f27ec&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=5e3bd64d54fcf40d9beee7ddd9ce3ba7&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=5e3bd64d54fcf40d9beee7ddd9ce3ba7&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=008b9f8a0023e854cb117bd590980196&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=008b9f8a0023e854cb117bd590980196&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=491e6f249ad4a984c50a2e63c51b5ceb&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=491e6f249ad4a984c50a2e63c51b5ceb&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;!-- /Feedsky flare --&gt;</description><pubDate>Sat, 06 Sep 2008 20:50:00 +0800</pubDate><author>MaxIE</author><comments>http://www.cnblogs.com/MaxIE/archive/2008/09/06/1285783.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/MaxIE/archive/2008/09/06/1285783.html</guid><dc:creator>MaxIE</dc:creator><fs:srclink>http://www.cnblogs.com/MaxIE/archive/2008/09/06/1285783.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/MaxIE/rss.aspx</fs:srcfeed><fs:itemid>feedsky/maxie/~5930961/121278556/4059375</fs:itemid></item><item><title>IIS如何启用Gzip压缩功能</title><link>http://item.feedsky.com/~feedsky/maxie/~5930961/121278561/4059375/1/item.html</link><wfw:comment>http://www.cnblogs.com/MaxIE/comments/1267226.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/MaxIE/comments/commentRss/1267226.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/MaxIE/services/trackbacks/1267226.html</trackback:ping><description>&lt;div&gt;
&lt;div class=&quot;content_head&quot;&gt;&lt;span class=&quot;log_Title&quot;&gt;&lt;strong&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;启用IIS的Gzip压缩功能&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;content_main&quot;&gt;
&lt;p&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;现代的浏览器IE6和Firefox都支持客户端Gzip，也就是说，在服务器上的网页，传输之前，先使用Gzip压缩再传输给客户端，客户端接收之后由浏览器解压显示，这样虽然稍微占用了一些服务器和客户端的CPU，但是换来的是更高的带宽利用率。对于纯文本来讲，压缩率是相当可观的。如果每个用户节约50%的带宽，那么你租用来的那点带宽就可以服务多一倍的客户了。&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;wbr&gt;&lt;/p&gt;
&lt;p&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;IIS6已经内建了Gzip压缩的支持，可惜，没有设置更好的管理界面。所以要打开这个选项，还要费些功夫。&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;wbr&gt;&lt;/p&gt;
&lt;p&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;首先，如果你需要压缩静态文件（HTML），需要在硬盘上建一个目录，并给它&amp;#8220;IUSR_机器名&amp;#8221;这个用户的写权限。如果压缩动态文件（PHP，asp，aspx）就不需要了，因为它的页面是每次都动态生成的，压缩完就放弃。然后在IIS管理器中，&amp;#8220;网站&amp;#8221;上面右键－属性，不是下面的某个站点，而是整个网站。进入&amp;#8220;服务&amp;#8221;标签，选上启用动态内容压缩，静态内容压缩。&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;wbr&gt;&lt;/p&gt;
&lt;p&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;然后选中网站下面那个服务器扩展，新建一个服务器扩展。名字无所谓，下面的添加文件的路径是：&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;c:\windows\system32\inetsrv\gzip.dll，然后启用这个扩展。&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;这时候静态内容是可以压缩的，但是对于动态内容，aspx文件却不在压缩范围内。因为默认的可压缩文件并没有这个扩展名。而管理界面中你又找不到可以增加扩展名的地方，这时候只能去修改它的配置文件了。&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;在c:\windows\system32\inetsrv\下面有个MetaBase.xml文件，可以用记事本打开，找到IIsCompressionScheme，有三个相同名字的段，&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;分别是&lt;/font&gt;&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;&lt;font face=&quot;Verdana&quot;&gt;&amp;lt;IIsCompressionScheme&amp;nbsp;Location =&quot;/LM/W3SVC/Filters/Compression/deflate&quot;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;&lt;font face=&quot;Verdana&quot;&gt;&amp;lt;IIsCompressionScheme&amp;nbsp;Location =&quot;/LM/W3SVC/Filters/Compression/gzip&quot;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;&lt;font face=&quot;Verdana&quot;&gt;&amp;lt;IIsCompressionSchemes&amp;nbsp;Location =&quot;/LM/W3SVC/Filters/Compression/Parameters&quot;&lt;/font&gt;&lt;/font&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;第三段不用管它，前两段有基本相同的参数，在这两段的参数HcScriptFileExtensions下面都加上一行aspx，如果你有其它的动态程序要压缩，也加在这里。HcDynamicCompressionLevel改成9，（0－10，9是性价比最高的一个）。&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;注：&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;strong&gt;HcFileExtensions&lt;/strong&gt;&lt;/font&gt;指定压缩方案支持的文件扩展名。IIS 只压缩使用指定文件扩展名的静态文件。该设置为空时，不压缩静态文件。&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;HcScriptFileExtensions&lt;/strong&gt;&lt;/noloc&gt; 指出压缩方案支持的文件扩展名。IIS 将压缩使用该属性指定的文件扩展名的动态文件输出。&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;HcDynamicCompressionLevel&lt;/noloc&gt; &lt;/strong&gt;属性指定压缩动态内容时压缩方案的压缩级别。低压缩级别生成稍大一些的压缩文件，但对 CPU 和内存资源的总体影响较小。高压缩级别通常会生成较小的压缩文件，但会占用较多的 CPU 时间和内存。&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;HcOnDemandCompLevel&lt;/noloc&gt; &lt;/strong&gt;属性指定对静态内容进行按需压缩时，压缩方案的压缩级别。低压缩级别生成稍大一些的压缩文件，但对 CPU 和内存资源的总体影响较小。高压缩级别通常生成较小的压缩文件，但是 CPU 和内存的占用率较高。&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;HcPriority&lt;/noloc&gt; &lt;/strong&gt;属性指定分配给特定压缩方案的优先级。如果您在安装 IIS 时安装了多个压缩方案，并且客户端浏览器在 Accept-Encoding 标头中注明可以处理多个压缩方案，IIS 将使用 &lt;strong&gt;&lt;noloc&gt;HcPriority&lt;/noloc&gt;&lt;/strong&gt; 指定的优先级数字来决定为请求使用哪个方案。这种情况下，IIS 会使用具有最高优先级数字的匹配方案。 有效的优先级数字范围从 1 到 10。一般来说，如果在 IIS 上安装了多个压缩方案，您应该为每个压缩方案指派一个不同的优先级数字。 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;wbr&gt;&lt;/p&gt;
&lt;p&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;然后需要重启一下IIS服务，就可以体会到压缩后的速度了。不过通常可能不会有太明显的感觉，可以用&lt;/font&gt;&lt;a href=&quot;http://www.port80software.com/tools/compresscheck.asp&quot;&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;http://www.port80software.com/tools/compresscheck.asp&lt;/font&gt;&lt;/a&gt;(英文)&lt;font face=&quot;Verdana&quot;&gt;&lt;a href=&quot;http://gzip.zzbaike.com/&quot;&gt;&lt;font face=&quot;Verdana&quot;&gt;http://gzip.zzbaike.com/&lt;/font&gt;&lt;/a&gt;（中文）&lt;/font&gt;&lt;font style=&quot;font-size: 14px&quot;&gt;这个页面来检查你的网页是否压缩过了，以及压缩比和加快的速度。整个过程对CPU的占用基本上感觉不出来。&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src =&quot;http://www.cnblogs.com/MaxIE/aggbug/1267226.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/42944/&quot; target=&quot;_blank&quot;&gt;[新闻]十年祭:昔日明星软件今何在?&lt;/a&gt;&lt;br/&gt;&lt;a href=&quot;http://www.cnblogs.com&quot; target=&quot;_blank&quot;&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com&quot; target=&quot;_blank&quot;&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://news.cnblogs.com&quot; target=&quot;_blank&quot;&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/group.htm&quot; target=&quot;_blank&quot;&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/q&quot; target=&quot;_blank&quot;&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://wz.cnblogs.com/&quot; target=&quot;_blank&quot;&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/ing&quot; target=&quot;_blank&quot;&gt;闪存&lt;/a&gt;&lt;br /&gt;&lt;!-- Feedsky flare --&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=6de081fd0f1371d9dcf5482654fe7e9c&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=6de081fd0f1371d9dcf5482654fe7e9c&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=42683e5a8f1fbb9cf2e926a1d5f0f5a0&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=42683e5a8f1fbb9cf2e926a1d5f0f5a0&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=8346f7d4da164057c1d9ddc6ac3b28f0&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=8346f7d4da164057c1d9ddc6ac3b28f0&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=f552395ce27cfadca445c4a92516eb71&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=f552395ce27cfadca445c4a92516eb71&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=394c438809c571c50d3176971e2c30f3&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=394c438809c571c50d3176971e2c30f3&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;!-- /Feedsky flare --&gt;</description><pubDate>Wed, 13 Aug 2008 19:01:00 +0800</pubDate><author>MaxIE</author><comments>http://www.cnblogs.com/MaxIE/archive/2008/08/13/1267226.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/MaxIE/archive/2008/08/13/1267226.html</guid><dc:creator>MaxIE</dc:creator><fs:srclink>http://www.cnblogs.com/MaxIE/archive/2008/08/13/1267226.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/MaxIE/rss.aspx</fs:srcfeed><fs:itemid>feedsky/maxie/~5930961/121278561/4059375</fs:itemid></item><item><title>再谈iframe自适应高度</title><link>http://item.feedsky.com/~feedsky/maxie/~5930961/121278565/4059375/1/item.html</link><wfw:comment>http://www.cnblogs.com/MaxIE/comments/1266597.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/MaxIE/comments/commentRss/1266597.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/MaxIE/services/trackbacks/1266597.html</trackback:ping><description>&lt;p&gt;通过Google搜索iframe 自适应高度，结果5W多条，搜索iframe 高度自适应，结果2W多条。&lt;br /&gt;
我翻了前面的几十条，刨去大量的转载，有那么三五篇是原创的。而这几篇原创里面，基本上只谈到如何自适应静的东西，就是没有考虑到JS操作DOM之后，如何做动态同步的问题。另外，在兼容性方面，也研究的不彻底。&lt;/p&gt;
&lt;p&gt;这篇文章，希望在这两个方面再做一些深入。&lt;/p&gt;
&lt;p&gt;可能有人还没接触到这个问题过，先说明一下，什么是自适应高度吧。所谓iframe自适应高度，就是，基于界面美观和交互的考虑，隐藏了iframe的border和scrollbar，让人看不出它是个iframe。如果iframe始终调用同一个固定高度的页面，我们直接写死iframe高度就可以了。而如果iframe要切换页面，或者被包含页面要做DOM动态操作，这时候，就需要程序去同步iframe高度和被包含页的实际高度了。&lt;/p&gt;
&lt;p&gt;顺便说下，iframe在迫不得已的时候才去用，它会给前端开发带来太多的麻烦。&lt;/p&gt;
&lt;p&gt;传统做法大致有两个：&lt;br /&gt;
方法一，在每个被包含页在本身内容加载完毕之后，执行JS取得本页面的高度，然后去同步父页面的iframe高度。&lt;br /&gt;
方法二，在主页面iframe的onload事件中执行JS，去取得被包含页的高度内容，然后去同步高度。&lt;br /&gt;
在代码维护角度考虑，方法二是优于方法一的，因为方法一，每个被包含页都要去引入一段相同的代码来做这个事情，创建了好多副本。&lt;/p&gt;
&lt;p&gt;两个方法都只处理了静的东西，就是只在内容加载的时候执行，如果JS去操作DOM引起的高度变化，都不太方便。&lt;/p&gt;
&lt;p&gt;如果在主窗口做一个Interval，不停的来获取被包含页的高度，然后做同步，是不是即方便，又解决了JS操作DOM的问题了呢？答案是肯定的。&lt;/p&gt;
&lt;p&gt;Demo页面：主页面 &lt;a title=&quot;iframe_a.html&quot; href=&quot;http://ued.koubei.com/wp-content/iframe_a.html&quot;&gt;iframe_a.html&lt;/a&gt; ，被包含页面 &lt;a title=&quot;iframe_b.html&quot; href=&quot;http://ued.koubei.com/wp-content/iframe_b.html&quot;&gt;iframe_b.htm&lt;/a&gt; 和 &lt;a title=&quot;iframe_c.html&quot; href=&quot;http://ued.koubei.com/wp-content/iframe_c.html&quot;&gt;iframe_c.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;主页面代码示例：&lt;/p&gt;
&lt;pre&gt;&amp;lt;iframe id=&quot;frame_content&quot; src=&quot;iframe_b.html&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
function reinitIframe(){
var iframe = document.getElementById(&quot;frame_content&quot;);
try{
iframe.height =  iframe.contentWindow.document.documentElement.scrollHeight;
}catch (ex){}
}
window.setInterval(&quot;reinitIframe()&quot;, 200);
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;一直执行，效率会不会有问题？&lt;br /&gt;
我做了测试，同时开5个窗口（IE6、IE7、FF、Opera、Safari）执行这个代码，不会对CPU有什么影响，甚至调整到2ms，也没影响（基本维持在0%占用率）。&lt;/p&gt;
&lt;p&gt;下面谈谈各浏览器的兼容性问题，如何获取到正确的高度，主要是对body.scrollHeight和documentElement.scrollHeight两个值得比较。注意本文用的是这个doctype，不同的doctype应该不会影响结果，但是假如你的页面没有申明doctype，那还是先去加一个吧。&lt;/p&gt;
&lt;pre&gt;&amp;lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; &quot;http://www.w3.org/TR/html4/strict.dtd&quot;&amp;gt;&lt;/pre&gt;
&lt;p&gt;在主页面追加以下测试代码，以输出这两个值，代码示例：&lt;/p&gt;
&lt;pre&gt;&amp;lt;div&amp;gt;&amp;lt;button onclick=&quot;checkHeight()&quot;&amp;gt;Check Height&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
function checkHeight() {
var iframe = document.getElementById(&quot;frame_content&quot;);
var bHeight = iframe.contentWindow.document.body.scrollHeight;
var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;
alert(&quot;bHeight:&quot; + bHeight + &quot;, dHeight:&quot; + dHeight);
}
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;被加载页面，可以切换一个绝对定位的层，来使页面高度动态改变。如果层展开，则会撑高页面高度。代码示例：&lt;/p&gt;
&lt;pre&gt;&amp;lt;div&amp;gt;&amp;lt;button onclick=&quot;toggleOverlay()&quot;&amp;gt;Toggle Overlay&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;height:160px;position:relative&quot;&amp;gt;
&amp;lt;div id=&quot;overlay&quot; style=&quot;position:absolute;width:280px;height:280px;display:none;&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
function toggleOverlay() {
var overlay = document.getElementById('overlay');
overlay.style.display = (overlay.style.display == 'none') ? 'block' : 'none';
}
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;下面列出以上代码在各浏览器的测试值：&lt;br /&gt;
（bHeight = body.scrollHeight, dHeight = documentElement.scrollHeight, 红色 = 错误值, 绿色 = 正确值）&lt;/p&gt;
&lt;table cellspacing=&quot;0&quot; width=&quot;100%&quot; border=&quot;1&quot;&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th rowspan=&quot;2&quot;&gt;/&lt;/th&gt;
            &lt;th colspan=&quot;2&quot;&gt;层隐藏时&lt;/th&gt;
            &lt;th colspan=&quot;2&quot;&gt;层展开时&lt;/th&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;th&gt;bHeight&lt;/th&gt;
            &lt;th&gt;dHeight&lt;/th&gt;
            &lt;th&gt;bHeight&lt;/th&gt;
            &lt;th&gt;dHeight&lt;/th&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;IE6&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;184&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;184&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: red; text-align: center&quot;&gt;184&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;303&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;IE7&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;184&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;184&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: red; text-align: center&quot;&gt;184&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;303&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;FF&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;184&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;184&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: red; text-align: center&quot;&gt;184&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;303&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Opera&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;181&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;181&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;300&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;300&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Safari&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;184&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;184&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: green; text-align: center&quot;&gt;303&lt;/td&gt;
            &lt;td style=&quot;font-size: larger; color: red; text-align: center&quot;&gt;184&lt;/td&gt;
        &lt;/tr&gt;
        &lt;/table&gt;
    &lt;p&gt;暂且无视Opera比别人少3像素的问题&amp;#8230;可以看出，如果没有绝对定位的东西，两个值是相等的，取哪个都无所谓。&lt;br /&gt;
    但是如果有，那么各个浏览器的表现不太相同，单取哪个值都不对。但可以找到了一条规律，那就是取两个值得最大值可以兼容各浏览器。所以我们的主页面代码就要改造成这样了：&lt;/p&gt;
    &lt;pre&gt;function reinitIframe(){var iframe = document.getElementById(&quot;frame_content&quot;);
    try{
    var bHeight = iframe.contentWindow.document.body.scrollHeight;
    var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;
    var height = Math.max(bHeight, dHeight);
    iframe.height =  height;
    }catch (ex){}
    }
    window.setInterval(&quot;reinitIframe()&quot;, 200);&lt;/pre&gt;
    &lt;p&gt;这样子，基本解决了兼容性问题。顺便说下，不光绝对定位的层会影响到值，float也会导致两个值的差异。&lt;/p&gt;
    &lt;p&gt;如果你演示Demo后，会发现，除了IE，其他浏览器中，当层展开后再隐藏，取到的高度值还是维持在展开的高度303，而非隐藏回去的真正值184，就是说长高了之后缩不回去了。这个现象在不同被包含页面之间做切换也会发生，当从高的页面切换到矮页面的时候，取到的高度还是那个高的值。&lt;br /&gt;
    可以归纳为，当iframe窗体高度高于文档实际高度的时候，高度取的是窗体高度，而当窗体高度低于实际文档高度时，取的是文档实际高度。因此，要想办法在同步高度之前把高度设置到一个比实际文档低的值。所以，在iframe的添加 onload=&amp;#8221;this.height=100&amp;#8243;，让页面加载的时候先缩到足够矮，然后再同步到一样的高度。&lt;br /&gt;
    这个值，在实际应用中决定，足够矮但又不能太矮，否则在FF等浏览器里会有很明显的闪烁。DOM操作的时候主页面无法监听到，只能DOM操作完了之后把高度变小了。&lt;br /&gt;
    在我的一个实际项目中，在成本和收益之间权衡，我并没有做这个事情，因为每个DOM函数中都要插入这个代码，代价太高，其实层缩回去不缩掉也不是那么致命。包括Demo里，也没有去做这个事情。如果读者有更好的方法，请告诉我。&lt;/p&gt;
    &lt;p&gt;这是最终的主页面的代码：&lt;/p&gt;
    &lt;pre&gt;&amp;lt;iframe id=&quot;frame_content&quot; src=&quot;iframe_b.html&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; onload=&quot;this.height=100&quot;&amp;gt;&amp;lt;/iframe&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    function reinitIframe(){
    var iframe = document.getElementById(&quot;frame_content&quot;);
    try{
    var bHeight = iframe.contentWindow.document.body.scrollHeight;
    var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;
    var height = Math.max(bHeight, dHeight);
    iframe.height =  height;
    }catch (ex){}
    }
    window.setInterval(&quot;reinitIframe()&quot;, 200);
    &amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;img src =&quot;http://www.cnblogs.com/MaxIE/aggbug/1266597.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/42944/&quot; target=&quot;_blank&quot;&gt;[新闻]十年祭:昔日明星软件今何在?&lt;/a&gt;&lt;br/&gt;&lt;a href=&quot;http://www.cnblogs.com&quot; target=&quot;_blank&quot;&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com&quot; target=&quot;_blank&quot;&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://news.cnblogs.com&quot; target=&quot;_blank&quot;&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/group.htm&quot; target=&quot;_blank&quot;&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/q&quot; target=&quot;_blank&quot;&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://wz.cnblogs.com/&quot; target=&quot;_blank&quot;&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/ing&quot; target=&quot;_blank&quot;&gt;闪存&lt;/a&gt;&lt;br /&gt;&lt;!-- Feedsky flare --&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=b770422c46cacc496d1c5dd56002ab50&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=b770422c46cacc496d1c5dd56002ab50&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=11bf2fcab7cab7e8e352c3218a2a609e&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=11bf2fcab7cab7e8e352c3218a2a609e&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=33ae94bb747c8d6809d75c1b8055b858&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=33ae94bb747c8d6809d75c1b8055b858&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=9a72d23764fdee2e596b7a2090098a56&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=9a72d23764fdee2e596b7a2090098a56&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=7104d9a667d3fe25508af6e7858aa398&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=7104d9a667d3fe25508af6e7858aa398&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;!-- /Feedsky flare --&gt;</description><pubDate>Wed, 13 Aug 2008 10:37:00 +0800</pubDate><author>MaxIE</author><comments>http://www.cnblogs.com/MaxIE/archive/2008/08/13/1266597.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/MaxIE/archive/2008/08/13/1266597.html</guid><dc:creator>MaxIE</dc:creator><fs:srclink>http://www.cnblogs.com/MaxIE/archive/2008/08/13/1266597.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/MaxIE/rss.aspx</fs:srcfeed><fs:itemid>feedsky/maxie/~5930961/121278565/4059375</fs:itemid></item><item><title>判断读者浏览器类型和屏幕分辨率，自动调用不同CSS</title><link>http://item.feedsky.com/~feedsky/maxie/~5930961/121278569/4059375/1/item.html</link><wfw:comment>http://www.cnblogs.com/MaxIE/comments/1247051.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/MaxIE/comments/commentRss/1247051.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/MaxIE/services/trackbacks/1247051.html</trackback:ping><description>我们在设计网页的时候一个比较头痛的问题是究竟我们的浏览者的分辨率是多少？如果使我们的浏览者能够更好的去浏览到我的网页，这个是我们设计前必须思考的问题。所以Leying在设计网页的时候第一个想的是兼容现在大多数浏览者的屏幕分辨率，这里头有几种最常用的方法：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1、硬行把网页先用表格框起来，框的分辨率应该是在760－780象素，其余的空间可以给一个背景图或者空白.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2、用自动缩放的方法也可以实现，这种方法比较古老，而且很简单，这个不多说了；&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3、用自动判断的方法。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;今天，就第三种方法来说说，如何来判断出浏览者的屏幕分辨率，根据不同的分辨率给予读者不同的浏览内容：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;网络上也有一些能自动判断出你的浏览器是什么类型或者什么版本的代码，集成过来。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;strong&gt;一、既判断分辨率，也判断浏览器，使之成为判断浏览器类型屏幕分辨率自动调用不同CSS的代码。&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;UBBPanel&quot;&gt;
&lt;div class=&quot;UBBTitle&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;UBBContent&quot;&gt;&amp;lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
if (window.navigator.userAgent.indexOf(&quot;MSIE&quot;)&amp;gt;=1)&lt;br /&gt;
{&lt;br /&gt;
var IE1024=&quot;&quot;;&lt;br /&gt;
var IE800=&quot;&quot;;&lt;br /&gt;
var IE1152=&quot;&quot;;&lt;br /&gt;
var IEother=&quot;&quot;;&lt;br /&gt;
&lt;br /&gt;
ScreenWidth(IE1024,IE800,IE1152,IEother)&lt;br /&gt;
}else{&lt;br /&gt;
if (window.navigator.userAgent.indexOf(&quot;Firefox&quot;)&amp;gt;=1)&lt;br /&gt;
{&lt;br /&gt;
//如果浏览器为Firefox&lt;br /&gt;
var Firefox1024=&quot;&quot;;&lt;br /&gt;
var Firefox800=&quot;&quot;;&lt;br /&gt;
var Firefox1152=&quot;&quot;;&lt;br /&gt;
var Firefoxother=&quot;&quot;;&lt;br /&gt;
&lt;br /&gt;
ScreenWidth(Firefox1024,Firefox800,Firefox1152,Firefoxother)&lt;br /&gt;
}else{&lt;br /&gt;
//如果浏览器为其他&lt;br /&gt;
var Other1024=&quot;&quot;;&lt;br /&gt;
var Other800=&quot;&quot;;&lt;br /&gt;
var Other1152=&quot;&quot;;&lt;br /&gt;
var Otherother=&quot;&quot;;&lt;br /&gt;
ScreenWidth(Other1024,Other800,Other1152,Otherother)&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function ScreenWidth(CSS1,CSS2,CSS3,CSS4){&lt;br /&gt;
if ((screen.width == 1024) &amp;amp;&amp;amp; (screen.height == 768)){&lt;br /&gt;
setActiveStyleSheet(CSS1);&lt;br /&gt;
}else{&lt;br /&gt;
if ((screen.width == 800) &amp;amp;&amp;amp; (screen.height == 600)){&lt;br /&gt;
setActiveStyleSheet(CSS2);&lt;br /&gt;
}else{&lt;br /&gt;
if ((screen.width == 1152) &amp;amp;&amp;amp; (screen.height == 864)){&lt;br /&gt;
setActiveStyleSheet(CSS3);&lt;br /&gt;
}else{&lt;br /&gt;
setActiveStyleSheet(CSS4);&lt;br /&gt;
}}}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setActiveStyleSheet(title){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;document.getElementsByTagName(&quot;link&quot;)[0].href=&quot;style/&quot;+title; &lt;br /&gt;
}&lt;br /&gt;
//--&amp;gt;&lt;br /&gt;
&amp;lt;/SCRIPT&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;为了大家明白，这里简单解析一下：&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;UBBPanel&quot;&gt;
&lt;div class=&quot;UBBTitle&quot;&gt;&lt;img style=&quot;margin: 0px 2px -3px 0px&quot; alt=&quot;引用内容&quot; src=&quot;http://www.leying.org/images/quote.gif&quot; /&gt; 引用内容&lt;/div&gt;
&lt;div class=&quot;UBBContent&quot;&gt;&lt;br /&gt;
var IE1024=&quot;&quot;;&lt;br /&gt;
&lt;br /&gt;
var IE800=&quot;&quot;;&lt;br /&gt;
&lt;br /&gt;
var IE1152=&quot;&quot;;&lt;br /&gt;
&lt;br /&gt;
var IEother=&quot;&quot;;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;引号里面分别填写，用户使用IE的时候并且分辨率为1024*768,800*600,1152*864要使用的css文件名。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;UBBPanel&quot;&gt;
&lt;div class=&quot;UBBTitle&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;UBBContent&quot;&gt;&lt;br /&gt;
var Firefox1024=&quot;&quot;;&lt;br /&gt;
&lt;br /&gt;
var Firefox800=&quot;&quot;;&lt;br /&gt;
&lt;br /&gt;
var Firefox1152=&quot;&quot;;&lt;br /&gt;
&lt;br /&gt;
var Firefoxother=&quot;&quot;;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;引号里面分别填写，用户使用FireFox（一个也很流行的浏览器）的时候并且分辨率为1024*768,800*600,1152*864要使用的css文件名。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;UBBPanel&quot;&gt;
&lt;div class=&quot;UBBContent&quot;&gt;&lt;br /&gt;
var Other1024=&quot;&quot;;&lt;br /&gt;
&lt;br /&gt;
var Other800=&quot;&quot;;&lt;br /&gt;
&lt;br /&gt;
var Other1152=&quot;&quot;;&lt;br /&gt;
&lt;br /&gt;
var Otherother=&quot;&quot;;&lt;br /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;引号里面分别填写，用户使用其他浏览器的时候并且分辨率为1024*768,800*600,1152*864要使用的css文件名。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;strong&gt;二、不判断分辨率，只判断浏览器实现根据浏览器类型自动调用不同CSS。&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;UBBPanel&quot;&gt;
&lt;div class=&quot;UBBTitle&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;UBBContent&quot;&gt;&amp;lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
if (window.navigator.userAgent.indexOf(&quot;MSIE&quot;)&amp;gt;=1)&lt;br /&gt;
{&lt;br /&gt;
//如果浏览器为IE&lt;br /&gt;
setActiveStyleSheet(&quot;default.css&quot;);&lt;br /&gt;
}else{&lt;br /&gt;
if (window.navigator.userAgent.indexOf(&quot;Firefox&quot;)&amp;gt;=1)&lt;br /&gt;
{&lt;br /&gt;
//如果浏览器为Firefox&lt;br /&gt;
setActiveStyleSheet(&quot;default2.css&quot;);&lt;br /&gt;
}else{&lt;br /&gt;
//如果浏览器为其他&lt;br /&gt;
setActiveStyleSheet(&quot;newsky.css&quot;);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setActiveStyleSheet(title){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;document.getElementsByTagName(&quot;link&quot;)[0].href=&quot;style/&quot;+title; &lt;br /&gt;
}&lt;br /&gt;
//--&amp;gt;&lt;br /&gt;
&amp;lt;/SCRIPT&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;解释：（和前面的差不多）&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;如果浏览器为IE，则调用default.css&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;如果浏览器为Firefox，则调用default2.css&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;如果浏览器为其他，则调用newsky.css&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;使用方法：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;很简单，放在 &amp;#8220;&amp;lt;/head&amp;gt;&amp;#8221; 前面即可。&lt;br /&gt;
&lt;img src =&quot;http://www.cnblogs.com/MaxIE/aggbug/1247051.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/42943/&quot; target=&quot;_blank&quot;&gt;[新闻]六大可能出售IT企业名单：SUN领头或被猎走&lt;/a&gt;&lt;br/&gt;&lt;a href=&quot;http://www.cnblogs.com&quot; target=&quot;_blank&quot;&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com&quot; target=&quot;_blank&quot;&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://news.cnblogs.com&quot; target=&quot;_blank&quot;&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/group.htm&quot; target=&quot;_blank&quot;&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/q&quot; target=&quot;_blank&quot;&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://wz.cnblogs.com/&quot; target=&quot;_blank&quot;&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/ing&quot; target=&quot;_blank&quot;&gt;闪存&lt;/a&gt;&lt;br /&gt;&lt;!-- Feedsky flare --&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=5d31d94d510412f8f635ec0e08f675c8&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=5d31d94d510412f8f635ec0e08f675c8&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=a2834232fb6a99cc21459ba03b71ec4d&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=a2834232fb6a99cc21459ba03b71ec4d&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=8bcc6ee18739a8edd5d1273110bc649e&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=8bcc6ee18739a8edd5d1273110bc649e&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=79fe29a92c62ec8672c0a65b13233bc6&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=79fe29a92c62ec8672c0a65b13233bc6&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=39e299a605e914a123e99b1e111b18b7&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=39e299a605e914a123e99b1e111b18b7&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;!-- /Feedsky flare --&gt;</description><pubDate>Sun, 20 Jul 2008 15:34:00 +0800</pubDate><author>MaxIE</author><comments>http://www.cnblogs.com/MaxIE/archive/2008/07/20/1247051.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/MaxIE/archive/2008/07/20/1247051.html</guid><dc:creator>MaxIE</dc:creator><fs:srclink>http://www.cnblogs.com/MaxIE/archive/2008/07/20/1247051.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/MaxIE/rss.aspx</fs:srcfeed><fs:itemid>feedsky/maxie/~5930961/121278569/4059375</fs:itemid></item><item><title>ajaxed - free classic ASP Ajax Library (VBScript)</title><link>http://item.feedsky.com/~feedsky/maxie/~5930961/121278572/4059375/1/item.html</link><wfw:comment>http://www.cnblogs.com/MaxIE/comments/1245571.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/MaxIE/comments/commentRss/1245571.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/MaxIE/services/trackbacks/1245571.html</trackback:ping><description>&lt;table style=&quot;table-layout: fixed;&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;
            &lt;div id=&quot;blog_text&quot;&gt;&lt;a href=&quot;http://www.webdevbros.net/ajaxed/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#ff0000&quot;&gt;ajaxed&lt;/font&gt;&lt;/a&gt;： free classic ASP Ajax
            Library (VBScript)。一个为ASP编写的ajax类库，类似于php下的&lt;a href=&quot;http://www.xajaxproject.org/&quot; target=&quot;_blank&quot;&gt;xajax&lt;/a&gt;
            ，包括了prototype,json还封装了数据库操作，非常优秀！&lt;br /&gt;
            &lt;br /&gt;
            &lt;div&gt;
            &lt;ul&gt;
                &lt;li&gt;Do you think classic ASP is old and not up to date?
                &lt;/li&gt;
                &lt;li&gt;Do you think there is no recent development done anymore with classic ASP?
                &lt;/li&gt;
                &lt;li&gt;Do you think recent technologies like Ajax are a mission to implement within
                classic ASP? &lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;That is all not completely true. Read on&amp;#8230;&lt;/p&gt;
            &lt;p&gt;&lt;strong&gt;DEMO:&lt;/strong&gt; &lt;a href=&quot;http://www.grafix.at/ajaxed/demo.asp&quot;&gt;Adding
            up two numbers&lt;/a&gt;, &lt;a href=&quot;http://www.grafix.at/webdevbros/RSS/&quot;&gt;Simple RSS
            reading&lt;/a&gt;&lt;/p&gt;
            &lt;p&gt;The ajaxed Library comes up with an unique Ajax technique which can be used
            within your classic ASP applications. You will be able to create Rich Web
            Applications with not much effort.&lt;/p&gt;
            &lt;blockquote&gt;
            &lt;p&gt;&lt;strong&gt;The magic behind ajaxed:&lt;/strong&gt; ajaxed lets you call server side
            VBScript code directly from client side. In other words it means that you are
            able to bind e.g. an &lt;em&gt;click&lt;/em&gt; event of a button directly to a server side
            function.&lt;/p&gt;
            &lt;/blockquote&gt;
            &lt;blockquote&gt;
            &lt;p&gt;You call a server side function and the functions return value(s) are passed
            to a JavaScript functions. Thats it!&lt;/p&gt;
            &lt;/blockquote&gt;
            &lt;ul&gt;
                &lt;li&gt;Easy installation in less than 3 minutes
                &lt;/li&gt;
                &lt;li&gt;Short learning curve (about 20 minutes)
                &lt;/li&gt;
                &lt;li&gt;Uses one of the most popular JavaScript Libraries: &lt;a href=&quot;http://www.prototypejs.org/&quot;&gt;Prototype&lt;/a&gt;
                &lt;/li&gt;
                &lt;li&gt;Object Oriented (OO) Approach
                &lt;/li&gt;
                &lt;li&gt;Works with Internet Explorer and Mozilla Firefox (the only tested yet)
                &lt;/li&gt;
                &lt;li&gt;No low level Ajax skills required
                &lt;/li&gt;
                &lt;li&gt;Includes a complete &lt;a href=&quot;http://www.webdevbros.net/2007/04/26/generate-json-from-asp-datatypes/&quot;&gt;ASP
                JSON generator&lt;/a&gt;. This is useful if you are using other JavaScript libraries
                such as &lt;a href=&quot;http://www.extjs.org/&quot; target=&quot;_blank&quot;&gt;EXT&lt;/a&gt; or &lt;a href=&quot;http://script.aculo.us/&quot; target=&quot;_blank&quot;&gt;script.aculo.us&lt;/a&gt;
                &lt;/li&gt;
                &lt;li&gt;Additionally it includes a handful of useful and conventient server side
                functions which are needed in everyday ASP development
                &lt;/li&gt;
                &lt;li&gt;It includes a lot additional &amp;amp; useful ASP functionality
                &lt;/li&gt;
                &lt;li&gt;Free for use (LGPL license) &lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;&lt;strong&gt;Download latest version:&lt;/strong&gt;&lt;/p&gt;
            &lt;ul&gt;
                &lt;li&gt;&lt;a title=&quot;ajaxed 0.3&quot; href=&quot;http://www.webdevbros.net/wp-content/uploads/2007/12/ajaxed03.zip&quot;&gt;ajaxed
                0.3&lt;/a&gt; (released 18 December 2007 - &lt;a href=&quot;http://www.webdevbros.net/2007/12/18/asp-json-utility-class-14-released/&quot;&gt;see
                changes&lt;/a&gt;)
                &lt;/li&gt;
                &lt;li&gt;&lt;a title=&quot;ajaxed 0.2&quot; href=&quot;http://www.webdevbros.net/wp-content/uploads/2007/07/ajaxed02.zip&quot;&gt;ajaxed
                0.2&lt;/a&gt; (released 16 July 2007) &lt;a title=&quot;ajaxed changes&quot; href=&quot;http://www.webdevbros.net/wp-content/uploads/2007/07/changes.txt&quot;&gt;changes&lt;/a&gt;
                &lt;/li&gt;
                &lt;li&gt;&lt;a title=&quot;ajaxed 0.1&quot; href=&quot;http://www.webdevbros.net/wp-content/uploads/2007/07/ajaxed01.zip&quot;&gt;ajaxed
                0.1&lt;/a&gt; (released 2 July 2007) &lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;&lt;strong&gt;Documentation:&lt;/strong&gt; included with the download&lt;/p&gt;
            &lt;ul&gt;
                &lt;li&gt;&lt;a href=&quot;http://www.webdevbros.net/2007/07/02/ajaxed-calling-server-side-%20-procedures-from-client-side-equivalent-to-php-xajax/&quot;&gt;Getting
                started with ajaxed&lt;/a&gt;
                &lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;http://www.webdevbros.net/category/classic-asp/ajaxed/&quot;&gt;more
                tutorials&lt;/a&gt; &lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;&lt;strong&gt;Feature requests (please post as comments):&lt;/strong&gt;&lt;/p&gt;
            &lt;ul&gt;
                &lt;li&gt;no yet. &lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;&lt;strong&gt;Similar library in PHP:&lt;/strong&gt; &lt;a href=&quot;http://www.xajaxproject.org/&quot; target=&quot;_blank&quot; aiotarget=&quot;true&quot; aiotitle=&quot;xajax&quot;&gt;xajax&lt;/a&gt;&lt;/p&gt;
            &lt;/div&gt;
            &lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;img src =&quot;http://www.cnblogs.com/MaxIE/aggbug/1245571.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/42942/&quot; target=&quot;_blank&quot;&gt;[新闻]Linux内核2.6.27正式到来&lt;/a&gt;&lt;br/&gt;&lt;a href=&quot;http://www.cnblogs.com&quot; target=&quot;_blank&quot;&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com&quot; target=&quot;_blank&quot;&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://news.cnblogs.com&quot; target=&quot;_blank&quot;&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/group.htm&quot; target=&quot;_blank&quot;&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/q&quot; target=&quot;_blank&quot;&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://wz.cnblogs.com/&quot; target=&quot;_blank&quot;&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/ing&quot; target=&quot;_blank&quot;&gt;闪存&lt;/a&gt;&lt;br /&gt;&lt;!-- Feedsky flare --&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=5e98b5c1df53ae6af06989c953e848d8&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=5e98b5c1df53ae6af06989c953e848d8&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=08e19bd6100645a4da94cc6027253d38&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=08e19bd6100645a4da94cc6027253d38&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=013812597b2a3b0cdc8ddfe19d9ff0b7&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=013812597b2a3b0cdc8ddfe19d9ff0b7&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=a82b31613bc19d0340284595542ce4f9&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=a82b31613bc19d0340284595542ce4f9&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=4beaef2cb50bd8dd783293cbb9c13cad&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=4beaef2cb50bd8dd783293cbb9c13cad&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;!-- /Feedsky flare --&gt;</description><pubDate>Fri, 18 Jul 2008 00:32:00 +0800</pubDate><author>MaxIE</author><comments>http://www.cnblogs.com/MaxIE/archive/2008/07/18/1245571.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/MaxIE/archive/2008/07/18/1245571.html</guid><dc:creator>MaxIE</dc:creator><fs:srclink>http://www.cnblogs.com/MaxIE/archive/2008/07/18/1245571.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/MaxIE/rss.aspx</fs:srcfeed><fs:itemid>feedsky/maxie/~5930961/121278572/4059375</fs:itemid></item><item><title>Javascript代码压缩、加密算法的破解分析及工具实现</title><link>http://item.feedsky.com/~feedsky/maxie/~5930961/121278574/4059375/1/item.html</link><wfw:comment>http://www.cnblogs.com/MaxIE/comments/1245570.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/MaxIE/comments/commentRss/1245570.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/MaxIE/services/trackbacks/1245570.html</trackback:ping><description>&lt;div id=&quot;blog_text&quot;&gt;
&lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;现在网上很多Javascript都进行了压缩，同时代码变得不可直接阅读，也相当于一种简单的加密了，本文对其中一种典型的算法进行分析，介绍如何解密代码以及重新实现的压缩工具算法。&lt;br /&gt;
典型代码如下：&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;JavaScript代码&lt;/div&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;span&gt;eval(function(E,I,A,D,J,K,L,H){ function C(A){ return&lt;span&gt;
    A&amp;lt;62?String.fromCharCode(A+=A&amp;lt;26?65:A&amp;lt;52?71:-4):A&amp;lt;63?&lt;/span&gt;'_':A &amp;lt; 64?'':C(A&amp;gt;&amp;gt;6)+C(A&amp;amp;63)} while(A&amp;gt;0)K[C(D--)]=I[--A];function N(A){return&lt;span&gt;
    K[A]==L[A]?A:K[A]}&lt;/span&gt;if(''.replace(/^/,String)){&lt;span&gt;
    var&lt;/span&gt; M=E.match(J),B=M[0],F=E.split(J),G=0; if(E.indexOf(F[0]))F=[''].concat(F);do{H[A++]=F[G++];H[A++]=N(B)} while(B=M[G]);H[A++]=F[G]||'';return&lt;span&gt;
    H.join(&lt;/span&gt;'')} return E.replace(J,N)}(&lt;span&gt;'Bl
    Bm=Bn;Bo(Bl Bp=Bq;Bp&amp;lt;Bn;Bp++){
    Br.Bs(Bm+Bp+&quot;&amp;lt;Bt&amp;gt;&quot;);}'&lt;/span&gt;,&lt;span&gt;'var|index|100|for|a|0|
    document|write|br'&lt;/span&gt;.split('|'),9,109,/[&quot;w&quot;]+/g, {}, {}, []))&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
一、代码解密&lt;br /&gt;
对于这类压缩的代码，无非是把js程序采用某种算法进行压缩，然后自行用提供的函数还原，采用eval(SCRIPT)的方式执行来完成调用，那么还原的方法就很简单了，那前面的eval(和后面的)去掉，然后显示出来就完成了，例如下面的页面就可以实现代码的还原：&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;JavaScript代码&lt;/div&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;span&gt;&amp;lt;!DOCTYPE HTML PUBLIC &lt;span&gt;&quot;-//W3C//DTD HTML 4.0
    Transitional//EN&quot;&lt;/span&gt;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;&amp;lt;HTML&amp;gt;&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&amp;lt;HEAD&amp;gt;&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&amp;lt;TITLE&amp;gt; 代码还原 &amp;lt;/TITLE&amp;gt;&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&amp;lt;META NAME=&lt;span&gt;&quot;Generator&quot;&lt;span&gt;
    CONTENT=&lt;/span&gt;&quot;EditPlus&quot;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;&amp;lt;META NAME=&lt;span&gt;&quot;Author&quot;&lt;span&gt;
    CONTENT=&lt;/span&gt;&quot;&quot;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;&amp;lt;META NAME=&lt;span&gt;&quot;Keywords&quot;&lt;span&gt;
    CONTENT=&lt;/span&gt;&quot;&quot;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;&amp;lt;META NAME=&lt;span&gt;&quot;Description&quot;&lt;span&gt;
    CONTENT=&lt;/span&gt;&quot;&quot;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;&amp;lt;/HEAD&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&amp;lt;BODY&amp;gt;&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&amp;lt;TEXTAREA NAME=&lt;span&gt;&quot;tx1&quot;&lt;span&gt;
    ROWS=&lt;/span&gt;&quot;10&quot; COLS=&quot;100&quot;&amp;gt;&amp;lt;/TEXTAREA&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;&amp;lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&amp;gt;&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;document.all.tx1.value =&lt;span&gt;function(E,I,A,D,J,K,L,H){function C(A){return&lt;span&gt;
    A&amp;lt;62?String.fromCharCode(A+=A&amp;lt;26?65:A&amp;lt;52?71:-4):A &amp;lt;63?&lt;/span&gt;'_':A&amp;lt;64?'':C(A&amp;gt;&amp;gt;6)+C(A&amp;amp;63)}while(A&amp;gt;0)K[C(D--)]=I[--A]; function N(A){return K[A]==L[A]?A:K[A]}if(''.replace(/^/,String)){&lt;span&gt;
    var&lt;/span&gt; M=E.match(J),B=M[0],F=E.split(J),G=0; if(E.indexOf(F[0]))F=[''].concat(F); do{H[A++]=F[G++];H[A++]=N(B)}while(B=M[G]);H[A++]=F[G]||''; return&lt;span&gt;
    H.join(&lt;/span&gt;'')}return E.replace(J,N)}(&lt;span&gt;'Bl
    Bm=Bn;Bo(Bl Bp=Bq;Bp&amp;lt;Bn;Bp++) { Br.Bs(Bm+Bp+&quot;&amp;lt;Bt&amp;gt;&quot;);}'&lt;/span&gt;&lt;span&gt;,
    &lt;/span&gt;'var|index|100|for|a|0|document|write|br'.split('|'),9,109,/[&quot;w&quot;]+/g, {}, {}, [])&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;&amp;lt;/SCRIPT&amp;gt;&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&amp;lt;/BODY&amp;gt;&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&amp;lt;/HTML&amp;gt;&amp;nbsp;&amp;nbsp; &lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;br /&gt;
通过上面方式运行，就可以在文本框中看到代码了，实际的代码是：&lt;br /&gt;
var
index=100;for(var a=0;a&amp;lt;100;a++){
document.write(index+a+&quot;&amp;lt;br&amp;gt;&quot;);}&lt;br /&gt;
很简单，不是吗&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;二、算法研究&lt;br /&gt;
由于代码全部在一行中，不便于阅读，可以通过格式化软件格式化，本文这里使用Intellij
IDEA格式化，代码如下&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;div&gt;JavaScript代码&lt;/div&gt;
&lt;ol&gt;
    &lt;li&gt;eval(function(E, I, A, D, J, K, L, H) {&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;function C(A) {&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;return&lt;span&gt; A &amp;lt; 62 ?
    String.fromCharCode(A += A &amp;lt; 26 ? 65 : A &amp;lt; 52 ? 71 : -4) : A &amp;lt; 63 ?
    &lt;/span&gt;'_' : A &amp;lt; 64 ? '' : C(A &amp;gt;&amp;gt; 6) + C(A &amp;amp; 63)&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;while&lt;span&gt; (A &amp;gt; 0)K[C(D--)] =
    I[--A];&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;function N(A) {&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;return&lt;span&gt; K[A] == L[A] ? A :
    K[A]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;if (''.replace(/^/, String)) {&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;var&lt;span&gt; M = E.match(J),B = M[0],F =
    E.split(J),G = 0;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;if&lt;span&gt; (E.indexOf(F[0]))F =
    [&lt;/span&gt;''].concat(F);&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;do{&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;H[A++] = F[G++];&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;H[A++] = N(B)&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;} &lt;span&gt;while&lt;span&gt; (B =
    M[G]);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;H[A++] = F[G] || '';&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;return H.join('')&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;return&lt;span&gt; E.replace(J,
    N)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}(&lt;span&gt;'Bl Bm=Bn;Bo(Bl Bp=Bq;Bp&amp;lt;Bn;Bp++){
    Br.Bs(Bm+Bp+&quot;&amp;lt;Bt&amp;gt;&quot;);}'&lt;/span&gt;,&lt;span&gt;
    'var|index|100|for|a|0|document|write|br'&lt;/span&gt;.split('|'), 9, 109, /[&quot;w&quot;]+/g, {}, {}, []))&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;Step
1：首先我们可以看出这是一个函数定义与调用合并在一起的，因此可以如下分解:(不再考虑eval)&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;JavaScript代码&lt;/div&gt;
&lt;ol&gt;
    &lt;li&gt;//E:加密压缩后的script信息&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;//I:字符串数组,可以理解为解密需要字典&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;//A:int 9&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;//D:int 109&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span&gt;//J:regexpr
    正则表达式&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;//K:object&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;//L:object&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;//H:array&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;function decode(E, I, A, D, J, K, L, H) {&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;function C(A) {&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;return&lt;span&gt; A &amp;lt; 62 ?
    String.fromCharCode(A += A &amp;lt; 26 ? 65 : A &amp;lt; 52 ? 71 : -4) : A &amp;lt; 63 ?
    &lt;/span&gt;'_' : A &amp;lt; 64 ? '' : C(A &amp;gt;&amp;gt; 6) + C(A &amp;amp; 63)&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;while&lt;span&gt; (A &amp;gt; 0)K[C(D--)] =
    I[--A];&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;function N(A) {&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;return&lt;span&gt; K[A] == L[A] ? A :
    K[A]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;if (''.replace(/^/, String)) {&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;var&lt;span&gt; M = E.match(J),B = M[0],F =
    E.split(J),G = 0;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;if&lt;span&gt; (E.indexOf(F[0]))F =
    [&lt;/span&gt;''].concat(F);&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;do{&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;H[A++] = F[G++];&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;H[A++] = N(B)&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;} &lt;span&gt;while&lt;span&gt; (B =
    M[G]);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;H[A++] = F[G] || '';&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;return H.join('')&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;return&lt;span&gt; E.replace(J,
    N)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;var decode_str=decode(&lt;span&gt;'Bl Bm=Bn;Bo(Bl
    Bp=Bq;Bp&amp;lt;Bn;Bp++){ Br.Bs(Bm+Bp+&quot;&amp;lt;Bt&amp;gt;&quot;);}'&lt;/span&gt;,'var|index|100|for|a|0|document|write|br'.split('|'), 9, 109, /[&quot;w&quot;]+/g, {}, {}, []));&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;br /&gt;
Step 2：其中对于函数function
C(A)采用多重3元表达式处理的方式，可以用if/else如下分解 &lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;JavaScript代码&lt;/div&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;span&gt;function&lt;span&gt;
    C(A){&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;var res;&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;if&lt;span&gt; (A &amp;lt; 62)
    {&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;var r = null;&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;if&lt;span&gt; (A &amp;lt; 26) r = 65;
    &lt;/span&gt;//'A'-'Z'&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;else {&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;if&lt;span&gt; (A &amp;lt; 52) r = 71;
    &lt;/span&gt;//'z'=122 控制以下&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;else r = -4;&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;res = String.fromCharCode(A + r);&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;else {&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;if&lt;span&gt; (A &amp;lt; 63) res =
    &lt;/span&gt;'_'; //即A=62&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;else {&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;if&lt;span&gt; (A &amp;lt; 64) res =
    &lt;/span&gt;'';//即A=63&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;span&gt;else&lt;span&gt; res = C(A &amp;gt;&amp;gt; 6) + C(A
    &amp;amp; 63); &lt;/span&gt;//如果A&amp;gt;63,进行64进制的高低位分解为2部分&amp;nbsp;&amp;nbsp;&lt;/span&gt;
    &lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;return res;&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp; &lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;br /&gt;
更加深刻的理解上面算法，就是一个仿base64编码变换的算法，可以参见文章:Base64相关&lt;br /&gt;
变换的码表是将0-63的数字变换为&lt;br /&gt;
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_&lt;br /&gt;
对应序列位置的字母.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;font face=&quot;Verdana&quot;&gt;Step 3：代码while (A &amp;gt; 0)K[C(D--)] =
I[--A];的分析&lt;br /&gt;
实际上这里就是将字典内容与序号值进行对照，记录到Object对象中，运算顺序如下表：&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;font face=&quot;Verdana&quot;&gt;JavaScript代码&lt;/font&gt;&lt;/div&gt;
&lt;ol&gt;&lt;font face=&quot;Verdana&quot;&gt;
    &lt;li&gt;D=109,A=9,K[&quot;Bt&quot;]=br&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;D=108,A=8,K[&quot;Bs&quot;]=write&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;D=107,A=7,K[&quot;Br&quot;]=document&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;D=106,A=6,K[&quot;Bq&quot;]=0&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;D=105,A=5,K[&quot;Bp&quot;]=a&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;D=104,A=4,K[&quot;Bo&quot;]=for&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;D=103,A=3,K[&quot;Bn&quot;]=100&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;D=102,A=2,K[&quot;Bm&quot;]=index&amp;nbsp;&amp;nbsp;
    &lt;/li&gt;
    &lt;li&gt;D=101,A=1,K[&quot;Bl&quot;]=var&amp;nbsp;&amp;nbsp; &lt;/li&gt;
    &lt;/font&gt;&lt;/ol&gt;
    &lt;/div&gt;
    &lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;br /&gt;
    Step 4：代码if (''.replace(/^/, String))
    分析&lt;br /&gt;
    看起来很高深的一个代码，你想空字符串无论怎么替换,还是空字符串，在javascript中，空字符串=false,非空字符串=true&lt;br /&gt;
    所以这个if语句怎么都不会执行，这里是一个混淆视听的代码，呵呵，你如果想，也可以写上更多乱七八糟的代码来达到同样效果。&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;font face=&quot;Verdana&quot;&gt;Step5：关键代码return E.replace(J, N)，这里用到了函数N:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
    &lt;div&gt;
    &lt;div&gt;&lt;font face=&quot;Verdana&quot;&gt;JavaScript代码&lt;/font&gt;&lt;/div&gt;
    &lt;ol&gt;&lt;font face=&quot;Verdana&quot;&gt;
        &lt;li&gt;&lt;span&gt;function&lt;span&gt; N(A)
        {&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
        &lt;/li&gt;
        &lt;li&gt;&lt;span&gt;return&lt;span&gt; K[A] == L[A] ? A :
        K[A]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
        &lt;/li&gt;
        &lt;li&gt;}&amp;nbsp;&amp;nbsp; &lt;/li&gt;
        &lt;/font&gt;&lt;/ol&gt;
        &lt;/div&gt;
        &lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;br /&gt;
        注意L对象从来没有赋值，所以L[A]返回的应该是undefined,所以可以翻译为&lt;br /&gt;
        &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
        &lt;div&gt;
        &lt;div&gt;&lt;font face=&quot;Verdana&quot;&gt;JavaScript代码&lt;/font&gt;&lt;/div&gt;
        &lt;ol&gt;&lt;font face=&quot;Verdana&quot;&gt;
            &lt;li&gt;&lt;span&gt;function&lt;span&gt; N(A)
            {&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
            &lt;/li&gt;
            &lt;li&gt;&lt;span&gt;return&lt;span&gt; K[A] == undefined ? A :
            K[A]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
            &lt;/li&gt;
            &lt;li&gt;}&amp;nbsp;&amp;nbsp; &lt;/li&gt;
            &lt;/font&gt;&lt;/ol&gt;
            &lt;/div&gt;
            &lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;font face=&quot;Verdana&quot;&gt;这下看起来就很好理解，关键代码就下面这些&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
            &lt;div&gt;
            &lt;div&gt;&lt;font face=&quot;Verdana&quot;&gt;JavaScript代码&lt;/font&gt;&lt;/div&gt;
            &lt;ol&gt;&lt;font face=&quot;Verdana&quot;&gt;
                &lt;li&gt;&lt;span&gt;&lt;span&gt;function decode(E, I, A, D, J, K, L, H)
                {&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
                &lt;/li&gt;
                &lt;li&gt;function C(A) {&amp;nbsp;&amp;nbsp;
                &lt;/li&gt;
                &lt;li&gt;&lt;span&gt;return&lt;span&gt; A &amp;lt; 62 ?
                String.fromCharCode(A += A &amp;lt; 26 ? 65 : A &amp;lt; 52 ? 71 : -4) : A &amp;lt; 63 ?
                &lt;/span&gt;'_' : A &amp;lt; 64 ? '' : C(A &amp;gt;&amp;gt; 6) + C(A &amp;amp; 63)&amp;nbsp;&amp;nbsp;&lt;/span&gt;
                &lt;/li&gt;
                &lt;li&gt;}&amp;nbsp;&amp;nbsp;
                &lt;/li&gt;
                &lt;li&gt;&lt;span&gt;while&lt;span&gt; (A &amp;gt; 0)K[C(D--)] =
                I[--A];&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
                &lt;/li&gt;
                &lt;li&gt;function N(A) {&amp;nbsp;&amp;nbsp;
                &lt;/li&gt;
                &lt;li&gt;&lt;span&gt;return&lt;span&gt; K[A] == undefined ?
                A : K[A]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
                &lt;/li&gt;
                &lt;li&gt;}&amp;nbsp;&amp;nbsp;
                &lt;/li&gt;
                &lt;li&gt;&lt;span&gt;return&lt;span&gt; E.replace(J,
                N)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
                &lt;/li&gt;
                &lt;li&gt;}&amp;nbsp;&amp;nbsp; &lt;/li&gt;
                &lt;/font&gt;&lt;/ol&gt;
                &lt;/div&gt;
                &lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;br /&gt;
                综上分析，该算法的原理就是从脚本文件中提取单词，存入字典表中，这里使用|分割的字符串，然后将单词对应的序号(仿base64编码值)写入原来代码的地方，&lt;br /&gt;
                就构成了该算法的核心了，所以实现该压缩算法的代码也不难了&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
                &lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;font face=&quot;Verdana&quot;&gt;三、工具实现&lt;br /&gt;
                具体实现采用java，代码就不介绍，写完代码之后才发现这是JSA(http://sourceforge.net/project/showfiles.php?group_id=175776)的压缩算法的再实现,该工具对jquery-1.2.3.min.js压缩测试调用运行成功，压缩率为40%。&lt;/font&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;br /&gt;
                &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
                &lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;font face=&quot;Verdana&quot;&gt;【运行方法】&lt;br /&gt;
                ====================================&lt;br /&gt;
                命令提示符下面运行，要求JRE
                1.5+&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
                &lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;font face=&quot;Verdana&quot;&gt;Usage:java JSEncoder.jar jsfile outputfile
                [offset].&lt;br /&gt;
                jsfile:待压缩的文件&lt;br /&gt;
                outputfile:输入的文件&lt;br /&gt;
                offset:可选整数值，&amp;gt;=&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
                &lt;/div&gt;
&lt;img src =&quot;http://www.cnblogs.com/MaxIE/aggbug/1245570.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/42942/&quot; target=&quot;_blank&quot;&gt;[新闻]Linux内核2.6.27正式到来&lt;/a&gt;&lt;br/&gt;&lt;a href=&quot;http://www.cnblogs.com&quot; target=&quot;_blank&quot;&gt;博客园首页&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com&quot; target=&quot;_blank&quot;&gt;社区&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://news.cnblogs.com&quot; target=&quot;_blank&quot;&gt;新闻频道&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/group.htm&quot; target=&quot;_blank&quot;&gt;小组&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/q&quot; target=&quot;_blank&quot;&gt;博问&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://wz.cnblogs.com/&quot; target=&quot;_blank&quot;&gt;网摘&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://space.cnblogs.com/ing&quot; target=&quot;_blank&quot;&gt;闪存&lt;/a&gt;&lt;br /&gt;&lt;!-- Feedsky flare --&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=14fe30c01f3739ac0e1a477522123c5d&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=14fe30c01f3739ac0e1a477522123c5d&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=2c3ee4bd44cb33902f3bc6d7591e40cf&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=2c3ee4bd44cb33902f3bc6d7591e40cf&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=3a30e74bb6e4bed1b71cc237e5ae9d16&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=3a30e74bb6e4bed1b71cc237e5ae9d16&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=e0f494959d9d5700085b4d9b11ec85e9&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=e0f494959d9d5700085b4d9b11ec85e9&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://feed.feedsky.com/~flare/maxie?a=efc287acb6b22e124c950ace7aedc3f2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~flare/maxie?i=efc287acb6b22e124c950ace7aedc3f2&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;!-- /Feedsky flare --&gt;</description><pubDate>Fri, 18 Jul 2008 00:23:00 +0800</pubDate><author>MaxIE</author><comments>http://www.cnblogs.com/MaxIE/archive/2008/07/18/1245570.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/MaxIE/archive/2008/07/18/1245570.html</guid><dc:creator>MaxIE</dc:creator><fs:srclink>http://www.cnblogs.com/MaxIE/archive/2008/07/18/1245570.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/MaxIE/rss.aspx</fs:srcfeed><fs:itemid>feedsky/maxie/~5930961/121278574/4059375</fs:itemid></item><item><title>jQuery Ajax 全解析</title><link>http://item.feedsky.com/~feedsky/maxie/~5930961/121278575/4059375/1/item.html</link><wfw:comment>http://www.cnblogs.com/MaxIE/comments/1245552.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/MaxIE/comments/commentRss/1245552.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/MaxIE/services/trackbacks/1245552.html</trackback:ping><description>&lt;div class=&quot;cnt&quot; id=&quot;blog_text&quot;&gt;
&lt;p&gt;jQuery确实是一个挺好的轻量级的JS框架，能帮助我们快速的开发JS应用，并在一定程度上改变了我们写JavaScript代码的习惯。&lt;/p&gt;
&lt;p&gt;废话少说，直接进入正题，我们先来看一些简单的方法，这些方法都是对jQuery.ajax()进行封装以方便我们使用的方法，当然，如果要处理复杂的逻辑，还是需要用到jQuery.ajax()的(这个后面会说到).&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;font color=&quot;#bb0000&quot;&gt;&lt;strong&gt;1. load&lt;/strong&gt;( url, [data],
[callback] ) ：载入远程 HTML 文件代码并插入至 DOM 中。&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;url &lt;/strong&gt;(String) : 请求的HTML页的URL地址。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;data &lt;/strong&gt;(Map) : (可选参数) 发送至服务器的 key/value 数据。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;callback &lt;/strong&gt;(Callback) : (可选参数) 请求完成时(&lt;font color=&quot;#bb0000&quot;&gt;不需要是success的&lt;/font&gt;)的回调函数。&lt;/p&gt;
&lt;p&gt;这个方法默认使用 GET 方式来传递的，如果[data]参数有传递数据进去，就会自动转换为POST方式的。jQuery 1.2
中，可以指定选择符，来筛选载入的 HTML 文档，DOM 中将仅插入筛选出的 HTML 代码。语法形如 &quot;url #some &amp;gt;
selector&quot;。&lt;/p&gt;
&lt;p&gt;这个方法可以很方便的动态加载一些HTML文件，例如表单。&lt;/p&gt;
&lt;p&gt;示例代码：&lt;/p&gt;
&lt;pre&gt;$(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;.ajax.load&lt;/span&gt;&quot;).load(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;http://www.cnblogs.com/QLeelulu/archive/2008/03/30/1130270.html .post&lt;/span&gt;&quot;,&lt;br /&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt; (responseText, textStatus, XMLHttpRequest){&lt;br /&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;;&lt;span style=&quot;color: #008000;&quot;&gt;//在这里this指向的是当前的DOM对象，即$(&quot;.ajax.load&quot;)[0]&lt;/span&gt; &lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//alert(responseText);//请求返回的内容&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//alert(textStatus);//请求状态：success，error&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//alert(XMLHttpRequest);//XMLHttpRequest对象&lt;/span&gt;&lt;br /&gt;
});&lt;/pre&gt;
&lt;div class=&quot;ajax load&quot;&gt;这里将显示结果。&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;font color=&quot;#bb0000&quot;&gt;注：&lt;/font&gt;&lt;/strong&gt;不知道为什么URL写绝对路径在FF下会出错，知道的麻烦告诉下。下面的get()和post()示例使用的是绝对路径，所以在FF下你将会出错并不会看到返回结果。&lt;font color=&quot;#ff00ff&quot;&gt;还有get()和post()示例都是跨域调用的，发现传上来后没办法获取结果，所以把运行按钮去掉了。&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;font color=&quot;#bb0000&quot;&gt;&lt;strong&gt;2. jQuery.get&lt;/strong&gt;( url, [data],
[callback] )：使用GET方式来进行异步请求&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参数：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;url &lt;/strong&gt;(String) : 发送请求的URL地址.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;data &lt;/strong&gt;(Map) : (可选) 要发送给服务器的数据，以 Key/value
的键值对形式表示，会做为QueryString附加到请求URL中。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;callback &lt;/strong&gt;(Function) : (可选)
载入成功时回调函数(只有当Response的返回状态是success才是调用该方法)。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是一个简单的 GET 请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数，请使用 $.ajax。示例代码：&lt;/p&gt;
&lt;pre&gt;$.get(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;./Ajax.aspx&lt;/span&gt;&quot;, {Action:&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;get&lt;/span&gt;&quot;,Name:&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;lulu&lt;/span&gt;&quot;}, &lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt; (data, textStatus){&lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//返回的 data 可以是 xmlDoc, jsonObj, html, text, 等等.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;; &lt;span style=&quot;color: #008000;&quot;&gt;// 在这里this指向的是Ajax请求的选项配置信息，请参考下图&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;alert&lt;/span&gt;(data);&lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//alert(textStatus);//请求状态：success，error等等。&lt;br /&gt;
当然这里捕捉不到error，因为error的时候根本不会运行该回调函数&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//alert(this);&lt;/span&gt;&lt;br /&gt;
});&lt;/pre&gt;
&lt;p&gt;点击发送请求：&lt;/p&gt;
&lt;p&gt;jQuery.get()回调函数里面的 this ，指向的是Ajax请求的选项配置信息：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/jQueryAjax_B934/image_4.png&quot; fade=&quot;200177915&quot; jquery1211438251140=&quot;20&quot;&gt;&lt;img style=&quot;border-width: 0px;&quot; alt=&quot;image&quot; src=&quot;http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/jQueryAjax_B934/image_thumb_1.png&quot; border=&quot;0&quot; height=&quot;289&quot; width=&quot;466&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;font color=&quot;#bb0000&quot;&gt;&lt;strong&gt;3. jQuery.post&lt;/strong&gt;( url,
[data], [callback], [type] ) ：使用POST方式来进行异步请求&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参数：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;url &lt;/strong&gt;(String) : 发送请求的URL地址.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;data &lt;/strong&gt;(Map) : (可选) 要发送给服务器的数据，以 Key/value 的键值对形式表示。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;callback &lt;/strong&gt;(Function) : (可选)
载入成功时回调函数(只有当Response的返回状态是success才是调用该方法)。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt; (String) : (可选)官方的说明是：Type of data to be
sent。其实应该为客户端请求的类型(JSON,XML,等等)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是一个简单的 POST 请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数，请使用 $.ajax。示例代码：&lt;/p&gt;
&lt;p&gt;Ajax.aspx：&lt;/p&gt;
&lt;pre&gt;Response.ContentType = &quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;application/json&lt;/span&gt;&quot;;&lt;br /&gt;
Response.Write(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;{result: '&lt;/span&gt;&quot; + Request[&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;Name&lt;/span&gt;&quot;] + &quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;,你好！(这消息来自服务器)'}&lt;/span&gt;&quot;);&lt;/pre&gt;
jQuery
代码：
&lt;pre&gt;$.post(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;Ajax.aspx&lt;/span&gt;&quot;, { Action: &quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;post&lt;/span&gt;&quot;, Name: &quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;lulu&lt;/span&gt;&quot; },&lt;br /&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt; (data, textStatus){&lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;// data 可以是 xmlDoc, jsonObj, html, text, 等等.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//this; // 这个Ajax请求的选项配置信息，请参考jQuery.get()说到的this&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;alert&lt;/span&gt;(data.result);&lt;br /&gt;
}, &quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;json&lt;/span&gt;&quot;);&lt;/pre&gt;
&lt;p&gt;点击提交：&lt;/p&gt;
&lt;p&gt;这里设置了请求的格式为&quot;json&quot;：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/jQueryAjax_B934/image_6.png&quot; fade=&quot;200178002&quot; jquery1211438251140=&quot;21&quot;&gt;&lt;img style=&quot;border-width: 0px;&quot; alt=&quot;image&quot; src=&quot;http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/jQueryAjax_B934/image_thumb_2.png&quot; border=&quot;0&quot; height=&quot;125&quot; width=&quot;440&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果你设置了请求的格式为&quot;json&quot;，此时你没有设置Response回来的ContentType 为：Response.ContentType =
&quot;application/json&quot;; 那么你将无法捕捉到返回的数据。&lt;/p&gt;
&lt;p&gt;注意一下，&lt;span style=&quot;color: #0000ff;&quot;&gt;alert&lt;/span&gt;(data.result);
由于设置了Accept报头为&amp;#8220;json&amp;#8221;，这里返回的data就是一个对象，并不需要用eval()来转换为对象。&lt;/p&gt;
&lt;p&gt;&lt;font color=&quot;#bb0000&quot;&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;4. jQuery.getScript&lt;/strong&gt;( url,
[callback] ) : 通过 GET 方式请求载入并执行一个 JavaScript 文件&lt;/font&gt;。&lt;/font&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4&gt;参数&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;url &lt;/strong&gt;(String) : 待载入 JS 文件地址。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;callback &lt;/strong&gt;(Function) : (可选) 成功载入后回调函数。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;jQuery 1.2 版本之前，getScript 只能调用同域 JS 文件。 1.2中，您可以跨域调用 JavaScript 文件。注意：Safari
2 或更早的版本不能在全局作用域中同步执行脚本。如果通过 getScript 加入脚本，请加入延时函数。&lt;/p&gt;
&lt;p&gt;这个方法可以用在例如当只有编辑器focus()的时候才去加载编辑器需要的JS文件.下面看一些示例代码：&lt;/p&gt;
加载并执行 test.js。
&lt;p&gt;&lt;strong&gt;jQuery 代码:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;$.getScript(&quot;test.js&quot;);&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;加载并执行 AjaxEvent.js ，成功后显示信息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;jQuery 代码:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;$.getScript(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;AjaxEvent.js&lt;/span&gt;&quot;, &lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;(){&lt;br /&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;alert&lt;/span&gt;(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;AjaxEvent.js 加载完成并执行完成.你再点击上面的Get或Post按钮看看有什么不同？&lt;/span&gt;&quot;);&lt;br /&gt;
});&lt;/pre&gt;
&lt;p&gt;加载完后请重新点击一下上面的 Load 请求看看有什么不同。&lt;/p&gt;
&lt;p&gt;&lt;font color=&quot;#bb0000&quot; size=&quot;4&quot;&gt;&lt;strong&gt;jQuery Ajax 事件&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Ajax请求会产生若干不同的事件，我们可以订阅这些事件并在其中处理我们的逻辑。在jQuery这里有两种Ajax事件：局部事件 和 全局事件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;局部事件&lt;/strong&gt;就是在每次的Ajax请求时在方法内定义的，例如：&lt;/p&gt;
&lt;pre&gt;$.ajax({&lt;br /&gt;
beforeSend: &lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;(){&lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;// Handle the beforeSend event&lt;/span&gt;&lt;br /&gt;
},&lt;br /&gt;
complete: &lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;(){&lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;// Handle the complete event&lt;/span&gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;// ...&lt;/span&gt;&lt;br /&gt;
});&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;全局事件&lt;/strong&gt;是每次的Ajax请求都会触发的，它会向DOM中的所有元素广播，在上面 getScript()
示例中加载的脚本就是全局Ajax事件。全局事件可以如下定义：&lt;/p&gt;
&lt;pre&gt;$(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;#loading&lt;/span&gt;&quot;).bind(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;ajaxSend&lt;/span&gt;&quot;, &lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;(){&lt;br /&gt;
$(&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;).show();&lt;br /&gt;
}).bind(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;ajaxComplete&lt;/span&gt;&quot;, &lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;(){&lt;br /&gt;
$(&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;).hide();&lt;br /&gt;
});&lt;/pre&gt;
&lt;p&gt;或者：&lt;/p&gt;
&lt;pre&gt;$(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;#loading&lt;/span&gt;&quot;).ajaxStart(&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;(){&lt;br /&gt;
$(&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;).show();&lt;br /&gt;
});&lt;/pre&gt;
&lt;p&gt;我们可以在特定的请求将全局事件禁用，只要设置下 global 选项就可以了：&lt;/p&gt;
&lt;pre&gt;$.ajax({&lt;br /&gt;
url: &quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;test.html&lt;/span&gt;&quot;,&lt;br /&gt;
global: &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;,&lt;span style=&quot;color: #008000;&quot;&gt;// 禁用全局Ajax事件.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;// ...&lt;/span&gt;&lt;br /&gt;
});&lt;/pre&gt;
&lt;p&gt;下面是jQuery官方给出的完整的Ajax事件列表：&lt;/p&gt;
&lt;li&gt;&lt;strong&gt;ajaxStart&lt;/strong&gt; (Global Event)&lt;br /&gt;
This event is broadcast if an
Ajax request is started and no other Ajax requests are currently running.
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;beforeSend&lt;/strong&gt; (Local Event)&lt;br /&gt;
    This event, which is triggered
    before an Ajax request is started, allows you to modify the XMLHttpRequest
    object (setting additional headers, if need be.)
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;ajaxSend&lt;/strong&gt; (Global Event)&lt;br /&gt;
    This global event is also
    triggered before the request is run.
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;success&lt;/strong&gt; (Local Event)&lt;br /&gt;
    This event is only called if the
    request was successful (no errors from the server, no errors with the data).
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;ajaxSuccess&lt;/strong&gt; (Global Event)&lt;br /&gt;
    This event is also only
    called if the request was successful.
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;error&lt;/strong&gt; (Local Event)&lt;br /&gt;
    This event is only called if an
    error occurred with the request (you can never have both an error and a success
    callback with a request).
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;ajaxError&lt;/strong&gt; (Global Event)&lt;br /&gt;
    This global event behaves the
    same as the local error event.
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;complete&lt;/strong&gt; (Local Event)&lt;br /&gt;
    This event is called regardless
    of if the request was successful, or not. You will always receive a complete
    callback, even for synchronous requests.
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;ajaxComplete&lt;/strong&gt; (Global Event)&lt;br /&gt;
    This event behaves the same
    as the complete event and will be triggered every time an Ajax request finishes.
    &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ajaxStop&lt;/strong&gt; (Global Event)&lt;br /&gt;
This global event is triggered
if there are no more Ajax requests being processed.
&lt;p&gt;具体的全局事件请参考API文档。&lt;br /&gt;
好了，下面开始说jQuery里面功能最强的Ajax请求方法 $.ajax();&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;font color=&quot;#bb0000&quot;&gt;&lt;strong&gt;jQuery.ajax&lt;/strong&gt;( options ) : 通过
HTTP 请求加载远程数据&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;这个是jQuery 的底层 AJAX 实现。简单易用的高层实现见 $.get, $.post 等。&lt;/p&gt;
&lt;p&gt;$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该对象，但特殊情况下可用于手动终止请求。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 如果你指定了 dataType 选项，请确保服务器返回正确的 MIME 信息，(如 xml 返回
&quot;text/xml&quot;)。错误的 MIME 类型可能导致不可预知的错误。见 &lt;a href=&quot;http://docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests&quot; jquery1211438251140=&quot;22&quot;&gt;Specifying the Data Type for AJAX Requests&lt;/a&gt; 。&lt;br /&gt;
当设置
datatype 类型为 'script' 的时候，所有的远程(不在同一个域中)POST请求都回转换为GET方式。&lt;/p&gt;
&lt;p&gt;$.ajax() 只有一个参数：参数 key/value 对象，包含各配置及回调函数信息。详细参数选项见下。&lt;/p&gt;
&lt;p&gt;jQuery 1.2 中，您可以跨域加载 JSON 数据，使用时需将数据类型设置为 &lt;a href=&quot;http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/&quot; jquery1211438251140=&quot;23&quot;&gt;JSONP&lt;/a&gt;。使用 &lt;a href=&quot;http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/&quot; jquery1211438251140=&quot;24&quot;&gt;JSONP&lt;/a&gt; 形式调用函数时，如 &quot;myurl?callback=?&quot; jQuery 将自动替换 ?
为正确的函数名，以执行回调函数。数据类型设置为 &quot;jsonp&quot; 时，jQuery 将自动调用回调函数。(这个我不是很懂)&lt;/p&gt;
&lt;p&gt;参数列表：&lt;/p&gt;
&lt;p&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; width=&quot;600&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;font color=&quot;#bb0000&quot;&gt;参数名&lt;/font&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;&lt;font color=&quot;#bb0000&quot;&gt;类型&lt;/font&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;&lt;font color=&quot;#bb0000&quot;&gt;描述&lt;/font&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;url &lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;String&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;(默认: 当前页地址) 发送请求的地址。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;String&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;(默认: &quot;GET&quot;) 请求方式 (&quot;POST&quot; 或 &quot;GET&quot;)， 默认为 &quot;GET&quot;。注意：其它 HTTP
            请求方法，如 PUT 和 DELETE 也可以使用，但仅部分浏览器支持。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;timeout&lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Number&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;设置请求超时时间（毫秒）。此设置将覆盖全局设置。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;async &lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Boolean&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;(默认: true) 默认设置下，所有请求均为异步请求。如果需要发送同步请求，请将此选项设置为
            false。注意，同步请求将锁住浏览器，用户其它操作必须等待请求完成才可以执行。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;beforeSend &lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Function&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;发送请求前可修改 XMLHttpRequest 对象的函数，如添加自定义 HTTP
            头。XMLHttpRequest 对象是唯一的参数。&lt;br /&gt;
            &lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt; (XMLHttpRequest) {&lt;br /&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;; &lt;span style=&quot;color: #008000;&quot;&gt;// the options for this ajax request&lt;/span&gt;&lt;br /&gt;
            }&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;cache &lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Boolean&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;(默认: true) jQuery 1.2 新功能，设置为 false
            将不会从浏览器缓存中加载请求信息。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;complete &lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Function&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;请求完成后回调函数 (请求成功或失败时均调用)。参数： XMLHttpRequest
            对象，成功信息字符串。&lt;br /&gt;
            &lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt; (XMLHttpRequest, textStatus) {&lt;br /&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;; &lt;span style=&quot;color: #008000;&quot;&gt;// the options for this ajax request&lt;/span&gt;&lt;br /&gt;
            }&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;contentType &lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;String&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;(默认: &quot;application/x-www-form-urlencoded&quot;)
            发送信息至服务器时内容编码类型。默认值适合大多数应用场合。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;data &lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Object,&lt;br /&gt;
            String&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看
            processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组，jQuery 将自动为不同值对应同一个名称。如
            {foo:[&quot;bar1&quot;, &quot;bar2&quot;]} 转换为 '&amp;amp;foo=bar1&amp;amp;foo=bar2'。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;dataType &lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;String&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;
            &lt;p&gt;预期服务器返回的数据类型。如果不指定，jQuery 将自动根据 HTTP 包 MIME 信息返回 responseXML 或
            responseText，并作为回调函数参数传递，可用值:&lt;/p&gt;
            &lt;p&gt;&quot;xml&quot;: 返回 XML 文档，可用 jQuery 处理。&lt;/p&gt;
            &lt;p&gt;&quot;html&quot;: 返回纯文本 HTML 信息；包含 script 元素。&lt;/p&gt;
            &lt;p&gt;&quot;script&quot;: 返回纯文本 JavaScript 代码。不会自动缓存结果。&lt;/p&gt;
            &lt;p&gt;&quot;json&quot;: 返回 JSON 数据 。&lt;/p&gt;
            &lt;p&gt;&quot;jsonp&quot;: &lt;a href=&quot;http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/&quot; jquery1211438251140=&quot;25&quot;&gt;JSONP&lt;/a&gt; 格式。使用 &lt;a href=&quot;http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/&quot; jquery1211438251140=&quot;26&quot;&gt;JSONP&lt;/a&gt; 形式调用函数时，如 &quot;myurl?callback=?&quot; jQuery 将自动替换 ?
            为正确的函数名，以执行回调函数。&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;error &lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Function&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;(默认: 自动判断 (xml 或 html))
            请求失败时将调用此方法。这个方法有三个参数：XMLHttpRequest 对象，错误信息，（可能）捕获的错误对象。&lt;br /&gt;
            &lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt; (XMLHttpRequest, textStatus, errorThrown) {&lt;br /&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;// 通常情况下textStatus和errorThown只有其中一个有值 &lt;/span&gt;&lt;br /&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;; &lt;span style=&quot;color: #008000;&quot;&gt;// the options for this ajax request&lt;/span&gt;&lt;br /&gt;
            }&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;global &lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Boolean&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;(默认: true) 是否触发全局 AJAX 事件。设置为 false 将不会触发全局 AJAX 事件，如
            ajaxStart 或 ajaxStop 。可用于控制不同的Ajax事件&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;ifModified &lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Boolean&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;(默认: false) 仅在服务器数据改变时获取新数据。使用 HTTP 包 Last-Modified
            头信息判断。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;processData &lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Boolean&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;(默认: true) 默认情况下，发送的数据将被转换为对象(技术上讲并非字符串) 以配合默认内容类型
            &quot;application/x-www-form-urlencoded&quot;。如果要发送 DOM 树信息或其它不希望转换的信息，请设置为
            false。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; width=&quot;90&quot;&gt;&lt;strong&gt;success &lt;/strong&gt;&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Function&lt;/td&gt;
            &lt;td valign=&quot;top&quot; width=&quot;419&quot;&gt;请求成功后回调函数。这个方法有两个参数：服务器返回数据，返回状态&lt;br /&gt;
            &lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt; (data, textStatus) {&lt;br /&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;// data could be xmlDoc, jsonObj, html, text, etc...&lt;/span&gt;&lt;br /&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;; &lt;span style=&quot;color: #008000;&quot;&gt;// the options for this ajax request&lt;/span&gt;&lt;br /&gt;
            }&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;这里有几个Ajax事件参数：&lt;strong&gt;beforeSend &lt;/strong&gt;，&lt;strong&gt;success
&lt;/strong&gt;，&lt;strong&gt;complete ，error
。&lt;/strong&gt;我们可以定义这些事件来很好的处理我们的每一次的Ajax请求。注意一下，这些Ajax事件里面的 &lt;font color=&quot;#0000ff&quot;&gt;this&lt;/font&gt; 都是指向Ajax请求的选项信息的(请参考说 get()
方法时的this的图片)。&lt;br /&gt;
请认真阅读上面的参数列表，如果你要用jQuery来进行Ajax开发，那么这些参数你都必需熟知的。&lt;/p&gt;
&lt;h4&gt;示例代码，获取博客园首页的文章题目：&lt;/h4&gt;
&lt;pre&gt;$.ajax({&lt;br /&gt;
type: &quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;get&lt;/span&gt;&quot;,&lt;br /&gt;
url: &quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;http://www.cnblogs.com/rss&lt;/span&gt;&quot;,&lt;br /&gt;
beforeSend: &lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;(XMLHttpRequest){&lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//ShowLoading();&lt;/span&gt;&lt;br /&gt;
},&lt;br /&gt;
success: &lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;(data, textStatus){&lt;br /&gt;
$(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;.ajax.ajaxResult&lt;/span&gt;&quot;).html(&quot;&quot;);&lt;br /&gt;
$(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;item&lt;/span&gt;&quot;,data).each(&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;(i, domEle){&lt;br /&gt;
$(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;.ajax.ajaxResult&lt;/span&gt;&quot;).append(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&quot;+$(domEle).children(&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;title&lt;/span&gt;&quot;).text()+&quot;&lt;span style=&quot;color: #8b0000;&quot;&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&quot;);&lt;br /&gt;
});&lt;br /&gt;
},&lt;br /&gt;
complete: &lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;(XMLHttpRequest, textSt