JavaScript的单线程性质以及同步ajax提交

本文转自:http://www.phpweblog.net/rainman/archive/2009/01/05/6267.html

How JavaScript Timers Work

从基础的层面来讲,理解JavaScript的定时器是如何工作的是非常重要的。计时器的执行常常和我们的直观想象不同,那是因为JavaScript引擎是单线程的。我们先来认识一下下面三个函数是如何控制计时器的。

  • var id = setTimeout(fn, delay); – 初始化一个计时器,然后在指定的时间间隔后执行。该函数返回一个唯一的标志ID(Number类型),我们可以使用它来取消计时器。
  • var id = setInterval(fn, delay); – 和setTimeout有些类似,但它是连续调用一个函数(时间间隔是delay参数)直到它被取消。
  • clearInterval(id);, clearTimeout(id); – 使用计时器ID(setTimeout 和 setInterval的返回值)来取消计时器回调的发生

为了理解计时器的内在执行原理,有一个重要的概念需要加以探讨:计时器的延迟(delay)是无法得到保障的。由于所有JavaScript代码是在一个线程里执行的,所有异步事件(例如,鼠标点击和计时器)只有拥有执行机会时才会执行。用一个很好的图表加以说明:

在这个图表中有许多信息需要理解,如果完全理解了它们,你会对JavaScript引擎如何实现异步事件有一个很好的认识。

继续阅读“JavaScript的单线程性质以及同步ajax提交”

使用js(kibo)监听浏览器键盘事件

在进行BS系统开发之时,总有客户提出某些按钮应该支持快捷键,甚至整个系统都采用快捷键来进行操作。如果没有一个有效的键盘事件处理的js框架,在每个界面处理不同的键盘事件,是一件非常可怕的事情。幸运的是,老外开发了一个有效的js框架,来监听浏览器中的键盘事件,并提供丰富的事件处理来让开发人员进行界面处理。那就是kibo,一个键盘处理js。
本文为kibo中文教程,直接从kibo官方教程翻译而来,不足之处望谅。

可以从以下网站下载最新的版本:https://github.com/marquete/kibo。整个文件才8k,足够的小,都不需要使用压缩了,而且与jquery也不冲突。它是一个简单地处理键盘事件的js library,没有其它依赖。

语法和使用
kibo主要提供了两个键盘事件的调用函数,down和up,分别表示按键的按下和弹起。这两个函数接收两个参数,一个参数为需要监听的键盘按键集合,包括一个或多个按键,以及表示指定类型的任意一个按键(如*),另一个参数则是处理这个事件的对应函数。kibo提供了像jquery一样的连续调用,你可以使用kibo.down(…).up(…)这样的调用。

可以使用的键盘包括我们普通使用的a-z这些普通按钮,以及特殊的alt,ctrl等控制按键,也包括表示方向键的"up,down,left等,也包括f1和f12这些功能按键。在调用方法时,可以传递一个或多个按键作为相对应的参数。

当处理按键的事件触发时,我们可以在函数中处理这个事件,也可以直接忽略这个事件。如果你想要调用浏览器默认的处理(如f5调用),则可以在回调函数时直接返回false即可。
在回调函数时,我们可以使用kibo.lastKey方法,来获取在键盘事件触发时所对应的按键信息。此方法将返回相对应的按键名称。或者当不识别这个按键时,将返回undefined。如果给这个方法传递一个按键,如kibo.lastKey("shift"),它将返回在这个按键中,是否按下了指定的键,返回true或false。

继续阅读“使用js(kibo)监听浏览器键盘事件”

解决使用jquery1.3以上版本时出现Malformed OGNL expression: f[] [ognl.ParseException: Encountered ” “]” “]的问题

    当使用jquery1.3以上版本时,进行ajax参数传值时,会出现以下的一个错误:

ognl.ExpressionSyntaxException: Malformed OGNL expression: f[] [ognl.ParseException: Encountered " "]" 
"] "" at line 1, column 3.

    这个错误是因为,jquery在传递数组类参数时,将不再遵循1.3时如f=x&f=y的参数传递了,而是采用了像php一样,带中括号的参数传递。js值 {f:["x","y"]},将被转化成f[]=x&f[]=y,而这种参数形式传递到后台时,使用struts2.1.8版本时,就会出现以上的错误形式。

    struts2一直能够识别的模式仅是f=x&f=y这样,当后台声明f为一个list或set时,就会把x,y分别加入到list或set中。而如果是f[]这种形式,则会报相应的转换错误。

    解决此问题的方法很简单,在进行ajax请求时,追加一条以下语句即可:

$.ajaxSettings.traditional=true;

    这是一个全局参数,故可以在引入jquery.js之后进行声明。此参数的意思在于,使用$.param时,将采用旧的jquery1.3版本的param生成方式进行处理。

继续阅读“解决使用jquery1.3以上版本时出现Malformed OGNL expression: f[] [ognl.ParseException: Encountered ” “]” “]的问题”

使用jsoup读取html文档结构并操纵数据结构(转)

    本文转自:http://www.ibm.com/developerworks/cn/java/j-lo-jsouphtml/index.html?ca=drs-
    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。本文主要介绍如何使用 jsoup 来进行常用的 HTML 解析。
    jsoup 的主要功能如下:
        1. 从一个 URL,文件或字符串中解析 HTML;
        2. 使用 DOM 或 CSS 选择器来查找、取出数据;
        3. 可操作 HTML 元素、属性、文本;
    jsoup 是基于 MIT 协议发布的,可放心使用于商业项目。

    文档输入
    jsoup 可以从包括字符串、URL 地址以及本地文件来加载 HTML 文档,并生成 Document 对象实例。下面是相关代码:

// 直接从字符串中输入 HTML 文档
 String html = "<html><head><title> 开源中国社区 </title></head>"
  + "<body><p> 这里是 jsoup 项目的相关文章 </p></body></html>"; 
 Document doc = Jsoup.parse(html); 

 // 从 URL 直接加载 HTML 文档
 Document doc = Jsoup.connect("http://www.oschina.net/").get(); 
 String title = doc.title(); 

 Document doc = Jsoup.connect("http://www.oschina.net/") 
  .data("query", "Java")   // 请求参数
  .userAgent("I ’ m jsoup") // 设置 User-Agent 
  .cookie("auth", "token") // 设置 cookie 
  .timeout(3000)           // 设置连接超时时间
  .post();                 // 使用 POST 方法访问 URL 

 // 从文件中加载 HTML 文档
 File input = new File("D:/test.html"); 
 Document doc = Jsoup.parse(input,"UTF-8","http://www.oschina.net/"); 

    请大家注意最后一种 HTML 文档输入方式中的 parse 的第三个参数,为什么需要在这里指定一个网址呢(虽然可以不指定,如第一种方法)?因为 HTML 文档中会有很多例如链接、图片以及所引用的外部脚本、css 文件等,而第三个名为 baseURL 的参数的意思就是当 HTML 文档使用相对路径方式引用外部文件时,jsoup 会自动为这些 URL 加上一个前缀,也就是这个 baseURL。
    例如 <a href=/project> 开源软件 </a> 会被转换成 <a href=http://www.oschina.net/project> 开源软件 </a>。

继续阅读“使用jsoup读取html文档结构并操纵数据结构(转)”