xmlplus
Version:
A JavaScript framwork for developing projects efficiently.
441 lines (331 loc) • 11.3 kB
Markdown
# 全局
## startup
```js
startup(object[,parent][,options])
```
- `object` : `XMLElement | SystemObject | String` 用于实例化的内容
- `parent` : `String | HTMLElement` 一个 `HTML` 元素 `ID` 或者一个 `HTML` 元素
- `options` : `PlainObject` 为目标组件提供初始输入值的普通对象
- `Returns` : `SystemObject` 实例化出的系统对象
该函数用于实例化一个组件,一般用于应用的初始化。更多内容,请查看 [组件的实例化](/docs#组件与空间-组件的实例化)。
```js
// 01-01
xmlplus("xp", function (xp, $_) {
$_().imports({
Example: {
xml: "<h1>hello, world</h1>"
}
});
}).ready(function() {
xp.startup("//xp/Example");
});
```
## create
```js
create(path[,options])
```
- `path` : `String` 组件的绝对路径
- `options` : `AnyType` 为目标组件提供初始输入值
- `Returns` : `AnyType` 实例化出的组件对象
该函数是一个用于创建轻量的组件对象的函数,它只是简单地调用组件的函数项来返回所需的对象。
```js
// 01-02
xmlplus("xp", function (xp, $_) {
$_().imports({
Example: {
fun: function(sys, items, opts) {
function sayHello() {
console.log(sys, items, "hello");
}
return { sayHello: sayHello };
}
}
});
});
xmlplus.create("//xp/Example").sayHello(); // null null hello
```
注意,用该函数创建的组件对象不会被加入组件树中,也就是说函数项中 `sys` 以及 `items` 均为空。用该函数创建的组件对象比用系统函数 `append`、`before` 以及 `replace` 创建的组件对象效率更高,然而功能却有限。
## guid
```js
guid()
```
- `Returns` : `String` 获取到的标识符
获取系统内唯一的全局标识符。该标识符的生成规则如下:刚开始是 `a,b,...z`,然后是 `aa,ab,...az`,以此类推。该标识符最先会由系统内部使用,所以你获取到的标识符一般不是从 `a` 开始。
```js
// 01-03
console.log(xp.guid()); // 一个标识符字符串
```
## ready
```js
ready(callback)
```
- `callback` : `Function` 在 DOM 准备就绪后执行的函数
该函数用于在 DOM 完全加载时执行指定的函数,该函数仅在浏览器端可见。这里指的 DOM 是广义的 DOM,它包含了我们的自定义组件。请看下面的一个 HTML 文件的 body 中的内容:
```html
<!-- 01-04 -->
<h1>hello, world</h1>
<i:Calendar xmlns:i='//xp'>custom</i:Calendar>
<script>
xp.ready(function () {
console.log("DOM is ready.")
});
</script>
```
上述的 `ready` 语句的回调函数开始执行,当且仅当 h1 元素和自定义组件 Calendar 均完成实例化后。
## type
```js
type(obj)
```
- `obj` : `AnyType`
该函数用于确定 JavaScript 内置对象的类型,并返回小写形式的类型名称。该函数源于新近版本的 jQuery,如需更详细的内容请参考 [jQuery.type](http://api.jquery.com/jQuery.type/)。
```js
// 01-05
console.log(xp.type("undefined")); // "undefined"
console.log(xp.type(true)); // "boolean"
console.log(xp.type(3)); // "number"
```
## isArray
```js
isArray(obj)
```
- `obj` : `Object` 用于测试是否是数组的对象
该函数用于确定给定对象是否为数组。
```js
// 01-07
console.log(xp.isArray([])); // true
console.log(xp.isArray({})); // false
```
## likeArray
```js
likeArray(obj)
```
- `obj` : `Object` 用于测试是否是伪数组的对象
该函数用于确定给定对象是否为伪数组。
## isWindow
```js
isWindow(obj)
```
- `obj` : `PlainObject` 用于测试是否是一个窗体的对象
该函数用于确定给定对象是否为窗体。
```js
// 01-06
console.log(xp.isWindow(window)); // true
```
## isFunction
```js
isFunction(obj)
```
- `obj` : `Object` 用于测试是否是函数的对象
该函数用于确定给定对象是否为函数。
```js
// 01-08
console.log(xp.isFunction(xp)); // true
console.log(xp.isFunction({})); // false
```
## isNumeric
```js
isNumeric(value)
```
- `value` : `AnyType` 要检测的值
确定给定参数是否可以看作一个 JavaScript 数值。
```js
// 01-09
console.log(xp.isNumeric(3)); // true
console.log(xp.isNumeric("3")); // true
console.log(xp.isNumeric({})); // false
```
## isPlainObject
```js
isPlainObject(object)
```
- `object` : `AnyType` 要检测的值
检查对象是否是普通对象(使用 `{}` 或 `new Object` 创建)。
```js
// 01-10
console.log(xp.isPlainObject({})); // true
console.log(xp.isPlainObject("3")); // false
console.log(xp.isPlainObject([])); // false
```
## isEmptyObject
```js
isEmptyObject(object)
```
- `object` : `Object` 用于被检查是否为空的对象
检查指定对象是否为空(即不包含可枚举的属性)。
```js
// 01-11
console.log(xp.isEmptyObject({})); // true
console.log(xp.isEmptyObject({key: "key"})); // false
console.log(xp.isEmptyObject([])); // true
```
## isSystemObject
```js
isSystemObject(obj)
```
- `obj` : `PlainObject` 将被检查以查看它是否是一个系统对象
检查对象是否为系统对象。
```js
// 01-12
Example: {
xml: "<h1 id='example'>hello, world</h1>",
fun: function (sys, items, opts) {
console.log(xp.isSystemObject({})); // false
console.log(xp.isSystemObject(this)); // true
console.log(xp.isSystemObject(sys.example)); // true
}
}
```
## extend
```js
extend([deep,]target[,object1][,objectN])
```
- `deep` : `Boolean` 如果为 true,则将进行递归合并(也称为深度复制)
- `target` : `Object` 新属性将被添加到的目标对象
- `object1` : `Object` 包含要合并的属性的第一个对象。
- `objectN` : `Object` 包含要合并的属性的其他对象。
将两个或多个对象的内容合并到第一个对象中。该函数来源于新近版本的 jQuery,如需更详细的内容请参考 [jQuery.extend](http://api.jquery.com/jQuery.extend/)。
```js
// 01-13
var result = xp.extend({key1: "hello"},{key2: "world"});
console.log(result); // {key1: "hello, key2: "world"};
```
## each
```js
each(object,callback)
```
- `array` : `Array | Object` 要迭代的数组或对象
- `callback` : `Function` 在每个对象上执行的函数
一个通用的迭代器函数,可以用来无缝地迭代对象和数组。其中,对于具有 length 属性的数组和数组类对象(例如函数的 arguments 对象),则通过数字索引(从 0 到长度 length - 1)进行迭代。而其他对象则通过它们的命名属性进行迭代。
```js
// 01-14
xp.each(['a','b','c'], function (index, value) {
console.log(index, value);
});
xp.each({a:1,b:2,c:3}, function (key, value) {
console.log(key, value);
});
```
## parseXML
```js
parseXML(data)
```
- `data` : `String` 一个格式正确的 XML 字符串
此函数将给定的字符串解析为 XML 文档。
```js
// 01-15
var xml = "<title>Title</title>";
var xmlDoc = xp.parseXML(xml);
console.log(xmlDoc.lastChild.nodeName); // title
```
## serialize
```js
serialize(node)
```
- `node` : `HTMLElement | XMLElement` DOM 节点
- `Returns` : `String` XML 字符串
序列化指定的 DOM 节点,序列化后的结果包含节点的子级。
```js
// 01-16
// <h1 xmlns="http://www.w3.org/1999/xhtml" id="h1">hello,world</h1>
console.log(xp.serialize(document.getElementById("h1")));
```
## hasNamespace
```js
hasNamespace(object)
```
- `object` : `String` 组件路径,比如 `//xp/Index`
- `Returns` : `Boolean` 布尔值
判定当前系统是否包含给定的命名空间,如果包含则返回 `true`,否则返回 `false`。
```js
// 01-17
console.log(xp.hasNamespace(null)); // false
console.log(xp.hasNamespace("div")); // false
console.log(xp.hasNamespace("//xp/Index")); // true 或者 false,这取决于实际的应用
```
## hasComponent
```js
hasComponent(object)
```
- `object` : `String` HTML 标签或者组件路径,比如 `div` 或 `//xp/Index`
- `Returns` : `Boolean | PlainObject` 布尔值或者组件的 JSON 描述
判定当前系统中是否包含给定的组件,如果不包含则返回 `false`;如果是 HTML 标签,则返回 `true`;否则返回组件的 JSON 描述。
```js
// 01-18
console.log(xp.hasComponent(null)); // false
console.log(xp.hasComponent("div")); // true
console.log(xp.hasComponent("//xp/Index")); // false 或者一个组件的 JSON 描述,这取决于实际的应用
```
## getElementById
```js
getElementById(id[,isGuid])
```
- `id` : `String` 对象标识符
- `isGuid` : `Boolean` 是否组件对象标识符
- `Returns` : `HTMLElement | SystemObject` HTML 元素对象或者系统对象
由给定的标识符获取相关对象。这需要分三种情况来看。如果 `isGuid` 为 `true`,那么将返回系统对象。请参考下面的示例。
```js
// 01-19
Example: {
xml: "<div id='example'/>",
fun: function (sys, items, opts) {
var guid = sys.index.guid();
console.log(sys.index == xp.getElementById(guid, true); // true
}
}
```
如果不提供 `isGuid` 参数,并且当前 HTML 文档中存在 `id` 值为给定值的元素,那么将返回 HTML 元素,这等效于浏览器自带的 `document.getElementById`。请参考下面的示例。
```html
// 01-20
<html>
<head>
<script src="xmlplus.js"></script>
</head>
<body>
<span id="text">text</span>
<script>
console.log(xp.getElementById("text") == document.getElementById("text")); // true
</script>
</body>
</html>
```
如果不提供 `isGuid` 参数,并且当前 HTML 文档中存在 `id` 值为给定值的自定义组件对象描述,那么将返回系统对象。请参考下面的示例。
```html
// 01-21
<html>
<head>
<script src="xmlplus.js"></script>
<script>
xmlplus("xp", function (xp, $_) {
$_().imports({
Index: {}
});
}).ready(function() {
console.log(xp.getElementById("index")); // SystemObject
});
</script>
</head>
<body>
<i:Index id="index" xmlns='//xp'></i:Index>
</body>
</html>
```
## exports
```js
exports(object)
```
- `object` : `Proxy` 代理对象
- `Returns` : `PlainObject` 转化得到的普通对象
将数据绑定后得到的代理对象转化成普通的 JSON 对象。
```html
// 01-22
Example: {
xml: "<div id='example'>\
<button id='item'/>\
</div>",
fun: function (sys, items, opts) {
let data = [1,2,3,4];
let proxy = sys.item.bind(data);
console.log(xp.exports(proxy.model)); // [1,2,3,4]
}
}
```