Pure JS (5.3):pure.render 的实现(构造window对象,实现服务器端 JQuery Template)

[size=large][align=center][b]Pure JS (5.3):pure.render 的实现(构造window对象,实现服务器端 JQuery Template)[/b][/align][/size]
  pure.render() 的实现思路大致如下:
  1. 解析 HTML
  2. 构造 window 对象
  3. 在 window 对象上附加 jQuery 对象
  4. 调用传入的 func,修改 window.document
  5. 返回修改后的 document 中的 HTML

  解析 HTML 的部分是基于 Java 开源项目 NekoHTML 的。NekoHTML 可以解析 HTML 并尝试修复其中不符合 XML 标准的地方,解析的结果可以使用 XML 接口进行进一步操作和序列化。
[quote]  NekoHTML 项目主页:[url]http://nekohtml.sourceforge.net/[/url]
  另外,NekoHTML 依赖于 Xerces:[url]http://xerces.apache.org/mirrors.cgi[/url]
[/quote]
  接下来,我们就一起来看看在服务器端使用 JQuery DOM 和 JQuery Template ,以及 pure.render() 函数的实现。

[size=medium][align=center][b]pure.jquery()[/b][/align][/size]
  scripts/lib/pure.jquery.js 是在 jQuery 1.6 的基础上修改而成的,仅保留了 DOM 查询、DOM 操作和一些基本函数(each,map等)。
  pure.jquery.js 中定义了 pure.jquery() 函数:

var pure = pure || {};

pure.jquery = function( window, undefined ) {
// jQuery 实现代码,略

// 在 window 对象上附加 jQuery 对象
window.jQuery = jQuery;
};

  这里实际上在函数中构造了 jQuery 对象,并附加到 window 对象上。

  jQuery 实现代码的部分,由于所操作的实际上是 XML DOM Element,与浏览器中的 HTMLElement 有所不同,并且 Java 对象与JavaScript对象也不完全兼容,因此需要进行一些必要替换,比如用 pure.html(elem) 替换 elem.innerHTML,用 pure.childNodes(elem) 替换 elem.childNodes 等。

[size=medium][align=center][b]pure.tmpl()[/b][/align][/size]
  类似地,pure.tmpl.js 是在 jQuery Template 的基础上修改而成的,定义了 pure.tmpl() 对象:

var pure = pure || {};

pure.tmpl = function( window, undefined ) {
// 其他代码,略

// 扩展 jQuery 对象(实例方法)
jQuery.fn.extend({
tmpl: function( data, options, parentItem ) { ... },
template: function( name ) { ... },
domManip: function( args, table, callback, options ) { ... });
});


// 扩展 jQuery 对象(静态方法)
jQuery.extend({
tmpl: function( tmpl, data, options, parentItem ) { ... },
template: function( name, tmpl ) { ... },
encode: function( text ) { ... }
});

// 其他代码,略
};

  这里实际上对 window.jQuery 进行了扩展,在 jQuery 上附加了 tmpl 等函数。

[size=medium][align=center][b]pure.render() [/b][/align][/size]
  需要注意的是 pure.jquery() 和 pure.tmpl() 都需要一个 window 对象作为参数,因此构造 window 对象的方式很关键。我们是在 pure.render() 函数中借助 NekoHTML 解析 HTML 文件,从而构造出 window 对象的:


pure.render = function(partial, file, func) {
// 一些模拟函数重载的代码,略

// 创建用于解析 HTML 文件的 DOMParser
var parser = new DOMParser();

// 解析 HTML 文件
parser.parse(file);

// 构造 window 对象
var window = {
// 从 parser 中获取 document
document : parser.getDocument(),

// 由于不能直接在 Elemnt 上附加数据(因为实际上 Element 是 Java 对象)
// 因此我们用一个 HashMap 存放这些数据
//(Element作为 key,JavaScript 对象作为值)
cache : new HashMap()
};

// 依次调用 pure.jquery 和 pure.tmpl,
// 从而在 window 对象上附加 jQuery 对象
pure.jquery(window);
pure.tmpl(window);

// 调用传进的函数,以 window.jQuery 作为参数
// 这个函数实际上将修改 window.document
func(window.jQuery);

// 返回结果:代码片段或完整的 HTML
var doc = window.document.documentElement;
return partial ?
pure.html(doc.lastChild) :
pure.outerHtml(doc, true);
}


  这就是 pure.render() 的实现过程了。事实上现在的版本中 pure.jquery() 和 pure.templ() 还有许多冗余和不合理的代码,功能也比较有限(不能附加数据和事件),这些方面(或其他方面)的修改还是希望听听大家的意见。
  谢谢。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这段 Node.js 代码使用了 res.render 方法来渲染名为 "home.html" 的模板文件,并将一个对象作为第二个参数传递给模板。这个对象包含一个键值对,其中键为 "username",值为 req.session.username,即当前用户的用户名。在模板中,可以通过 {{username}} 来获取这个值并进行展示。 ### 回答2: 这段Node.js代码的作用是将一个名为"home.html"的视图文件渲染并发送给客户端,并同时向视图文件传递了一个对象{username: req.session.username}作为参数。 首先,Node.js平台是一种基于事件驱动和非阻塞I/O模型的服务器端JavaScript运行环境。它允许我们使用JavaScript编写服务器端应用程序,包括处理HTTP请求和响应等功能。 在这段代码中,我们可以看到res.render()方法的使用。这个方法是Express框架中用于渲染视图文件并发送给客户端的方法。它需要两个参数,第一个参数是要渲染的视图文件的路径或文件名,第二个参数是一个对象,存储了要传递给视图文件的数据或变量。 具体到这段代码的示例,"home.html"是要渲染的视图文件的路径或文件名。它可能是一个HTML文件,其中包含了页面的布局、样式和结构等内容。 而第二个参数{username: req.session.username}是一个对象,它包含了一个名为"username"的属性,属性的值为req.session.username。这里的req.session.username是从另外一个地方(可能是通过用户登录或其他逻辑设置的)传递过来的数据。这个对象会被传递给视图文件,在视图文件中可以通过对应的属性名来获取和使用这些数据。 总而言之,这段代码的作用是将名为"home.html"的视图文件渲染并发送给客户端,同时传递了一个包含了用户名信息的对象给视图文件,以便在视图文件中动态显示该用户名。 ### 回答3: 这段Node.js代码的作用是渲染名为"home.html"的模板,并将一个对象作为参数传递给模板。该对象包含一个键值对,键为"username",值为"req.session.username"的值。 res.render()是一个Express框架中的方法,用于渲染模板。它接受两个参数,第一个参数是要渲染的模板文件名,可以是一个相对路径或者是一个在设定的模板文件夹中的文件名。第二个参数是一个对象,用于向模板传递数据。 在这个例子中,"home.html"模板将被渲染,并且可以在模板中通过"{{ username }}"来访问"req.session.username"的值。"req.session.username"是从请求对象(req)的session属性中获取的,而这个session属性可能是在用户登录成功后设置的。 换句话说,这段代码的目的是将"home.html"模板渲染并展示给用户,同时将当前用户的用户名(req.session.username)传递给模板,以便在模板中展示用户的个性化信息。这样,模板就可以根据用户的信息生成动态的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值