COSON - 以JSON形式编写的HTML

COSON是一种JSON格式,用于描述HTML。

众所周知当我们开发前端时,经常需要利用HTML来动态创建一些DOM元素。然而在前端以String的形式使用HTML是非常不方便的。尤其是当HTML的长度较大或者内部含有较多动态内容的时候。并且我们也很难在创建DOM元素的同时为其绑定事件。

COSON的目标便是让HTML在Javascript中变成更加结构化、更加灵活、更加容易控制。

使用COSON的最主要的两个方法是cola.xCreate()和cola.xRender()。

cola.xCreate()

xCreate方法的目的是通过COSON来定义HTML,以方便开发者在Javascript中创建DOM。

下面的示例都将以xCreate()为例来说明,具体请参考各个方法的API文档:xCreate

简单JSON

tagName表示DOM的节点名,content表示DOM节点的内容

var fragment = cola.xCreate({
    tagName: "div",
    content: "Hello World!"
});
$(document.body).append(fragment);

其输出为...

<div>Hello World!</div>

创建多个对象

如果要创建的某个DOM的tagName是DIV,那么相应的JSON对象的tagName是可以省略的。

$.xCreate([
    {
        content: "Hello World!"
    },
    {
        tagName: "input",
        value: "This is an input"
    }
]);

其输出为...

<div>Hello World!</div>
<input value="This is an input">

定义Style

Style既可以通过字符串定义,也可以通过子JSON来定义。

$.xCreate([
    {
        content: "Style by String",
        style: "color:red; font-weight:bold"
    },
    {
        content: "Style by JSON",
        style: {
            color: "blue",
            fontStyle: "italic"
        }
    }
]);

其输出为...

<div style="color:red; font-weight:bold">Style by String</div>
<div style="color:blue; font-style:italic">Style by JSON</div>

子对象

当content的值是子JSON对象或数组,就表示要定义DOM的子节点而不是文本内容。

$.xCreate([
    {
        content: {
            tagName: "input",
            type: "text"
        }
    },
    {
        content: [
            "Some text ",
            {
                tagName: "input",
                type: "checkbox"
            },
            {
                tagName: "input",
                type: "checkbox"
            }
        ]
    }
]);

其输出为...

<input type="text">
<div>Some text <input type="checkbox"><input type="checkbox"></div>

空节点的简写

有时我们只需要创建一个空的节点,那么只要利用“^”开头的字符串指定好节点名就可以了。

    $.xCreate([ "^input", "^hr", "^div" ]);

其输出为...

<input><hr><div><div>

创建Table

$.xCreate({
    tagName: "table",
    style: {
        width: 200
    },
    content: [
        {
            tagName: "tr",
            style: "height: 30px",
            content: ["^td", "^td"]
        },
        {
            tagName: "tr",
            style: "height: 30px",
            content: ["^td", "^td"]
        }
    ]
});

其输出为...

<table style="width:200px">
    <tbody>
        <tr style="height:30px">
            <td></td>
            <td></td>
        </tr>
        <tr style="height:30px">
            <td></td>
            <td></td>
        </tr>
    </tbody>
</table>

绑定事件

如果某个属性的值是一个Function则表示我们要绑定一个事件。

$.xCreate({
    tagName: "button",
    content: "Click Me",
    click: function() {
        alert("Hello World!");
    }
});

其输出为(事件绑定在HTML中无法表现)...

<button>Click Me</button>

jQuery扩展

为了方便搭配jQuery使用,Cola-UI利用cola.xCreate()扩展了jQuery并提供了如下接新的方法:

* $( ).xAppend()    -    jQuery扩展,根据JSON创建DOM元素并添加到当前jQuery包装的DOM中。
* $( ).xInsertBefore()    -    jQuery扩展,根据JSON创建DOM元素并添加到当前jQuery包装的DOM之前。
* $( ).xInsertAfter()    -    jQuery扩展,根据JSON创建DOM元素并添加到当前jQuery包装的DOM之后。

cola.xRender

cola.xRender()主要用于动态的对页面进行局部渲染。其支持很多种传入参数。

有些时候cola.xRender()的功能看起来很像cola.xCreate(),但其实cola.xCreate()只是cola.xRender()的基础。

cola.xCreate()只负责创建DOM元素,并不对这些元素进行解析,而cola.xRender()可以在创建DOM的同时解析其中的所有DOM指令,基本可以满足所有在运行时动态创建DOM元素和控件的需求。

利用最基本的COSON来创建DOM元素

以下的代码将会创建一个button,它看起来与cola.xCreate并没有什么差别。

cola(function (model) {
    var fragment = cola.xRender({
        tagName: "button"
        content: "测试按钮"
    }, model);
    $(document.body).append(fragment);
});

建立绑定

创建DOM元素并建立双向数据绑定,这是cola.xCreate()无法完成的。

cola.xRender([
    {
        tagName: "input",
        placeholder: "请尝试输入一些文字",
        "c-bind": "text"
    },
    {
        "c-bind": "text"
    }
], model);

使用迭代

cola.xRender({
    content: {
        tagName: "button",
        "c-repeat": "num in [1,2,3,4,5]",
        "c-bind": "num"
    }
}, model);

其输出为...

<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button>
<button>5</button>

渲染HTML字符串

cola.xRender("<button>Test Button</button>", model);

直接渲染现有的DOM对象

var domDiv = document.getElementById("domDiv");
domDiv.innerHTML = "<input c-bind='text' placeholder='请尝试输入一些文字'><br><label c-bind='text'>";
cola.xRender(domDiv, model);