在这jquery横行的年代,自己也来凑个热闹,ShLib.js功能预览

 现在要是提到Ajax,就几乎不可避免的要提到jquery。但是说实话,我不喜欢jquery的代码风格,我还是比较倾向于面向对象风格的

我用过flex,于是参考了一些flex sdk的风格,就有了这个ShLib.js。

我也不是什么牛人,当然ShLib.js也无法与jquery这个成熟的框架相比,但还是因为代码风格的喜好问题,一直没用jquery来写,一直都是用自己的一套代码,这个ShLib也是经过很多次的修改优化了的。这里上几个例子,因为我没有自己的个人网站,所以没办法做ajax功能的演示,ajax功能也是参考flex,以Loader为命名的,主要也是为了与主流框架区别,以免冲突。其中所用到的ShLib.js上传到了cnblogs上了。计划还要做各种控件的,素材取自ExtJs。慢慢来吧。。。。

首先是布局功能 

<html>
<head>
    <title>Application布局</title>
    <script src="http://files.cnblogs.com/shice/ShLib-min.js" type="text/javascript"></script>
    <style type="text/css">
        body
        {
            margin:0;
            overflow:hidden;
        }
    </style>
</head>
<body>
    <div id="app">
        <!--改变这些div的顺序,会有不同的布局,规则就是按顺序计算布局的子项,会优先占用四个边角的位置-->
        <div dock="{dock:'top',size:50}" style="background-color:#ffdddd"> top </div>
        <div dock="{dock:'bottom',size:50}" style="background-color:#ffddff"> bottom </div>
        <div dock="{dock:'left',size:100}" style="background-color:#ffffdd"> left </div>
        <div dock="{dock:'right',size:100}" style="background-color:#ddffdd"> right </div>
        <div dock="{dock:'bottom',size:50}" style="background-color:#ddffff"> bottom2 </div>
        <div dock="{dock:'fill',size:50}" style="background-color:#ddddff"> fill 试试改变页面的大小?或每个区域的不同顺序,会得到不同的布局效果 </div>
    </div>
    <script language="javascript" type="text/javascript">
        //默认main是程序的入口,由window的onload事件触发
        //与window.οnlοad=function(){} 之类的代码不会发生冲突
        //也可以不要main,自己写windown.onload也一样
        function main() {
            var app = new Application("app");
            app.setLayout(new DockLayout());
        }
    </script>
</body>
</html>

 

其次是类的继承机制,事件机制

<html>
<head>
    <title>类的扩展机制</title>
    <script src="http://files.cnblogs.com/shice/ShLib-min.js" type="text/javascript"></script>
</head>
<body>
<input type="text" id="tbValue" size="40" />
<input type="button" οnclick="test()" value="修改" />
<script language="javascript" type="text/javascript">
    //创建一个类MyCls扩展自EventDispatcher,该类已经定义了事件制
    var MyCls = sh.Class.create(EventDispatcher,
    (function () {
        function init(name) {
            //与prototype.js的扩展机制类似,这里以init函数为初始化函数,创建对象时会被自动调用.
            this.name = name;
        }
        function setName(name) {
            this.name = name;
        }
        function showMe(){
            alert(this.name);
        }
        return {
            init: init,
            setName:setName,
            showMe: showMe
        };
    })());

    var MyClsExt = sh.Class.create(MyCls, (function () {
        function setName(name) {
            //在父类的基础上添加事件机制
            var eventData = { newName: name, oldName: this.name };
            //如果扩展了同名的方法,可通过callBase方法调用父类方法
            this.callBase("setName", name);

            //派发事件 Event 的第一个参数为事件源,第二个为事件数据
            this.dispatchEvent("nameChanged", new Event(this, eventData));
        }

        function init(name) {
            //init方法也需要调用父类方法,否则父类初始化方法不自动调用
            this.callBase("init", name);
            this.name += "(被子类附加的信息)";
        }
        return {
            init: init,
            setName: setName
        };
    })());

    var obj1 = new MyCls("父类实例");
    obj1.showMe();

    var obj2 = new MyClsExt("子类实例");
    obj2.showMe();
    //添加事件处理方法
    obj2.addEventListener("nameChanged", function (evn) {
        var src = evn.sender;   //获取事件添,其实就是obj2
        var data = evn.data;    //事件数据
        alert("对象的name属性发生变化:\r\n" + data.oldName + "->" + data.newName);
    });

    function main() {
        var tb = document.getElementById("tbValue");
        tb.value = obj2.name;
    }

    function test() {
        obj2.setName(document.getElementById("tbValue").value);
    }
</script>
</body>
</html>


数据绑定机制

<html>
<head>
    <title>数据绑定</title>
    <style type="text/css">
        body,span,a,table,th,td,input,div
        {
            font-size:12px;
        }
        a
        {
            color:#7585F2;
        }
    </style>
    <script src="http://files.cnblogs.com/shice/ShLib-min.js" type="text/javascript"></script>
</head>
<body>
<!--
    绑定表达式{property:"标签属性",field:"数据字段",read:读取函数,write:保存函数}
    property省略时,会自动根据绑定对象的类型获取默认属性,如input则为value,span为innerHTML等常用属性
-->
    <h2>单个数据绑定</h2>
    <!-- 在数据模板中,任意复杂的结构都可以,但必须以某一个标签为根,在此就是 <div id="userInfo"> -->
    <div id="userInfo">
        用户ID:<span bind="{field:'userID'}"></span><br />
        用户名:<span bind="{field:'userName'}"></span><br />
        性 别:<span bind="{read:showSex}"></span><br />
    </div>

    <h2>简单列表绑定</h2>
    <div id="userList">
        <!-- 列表的唯一一个标签作为数据模板,这个模板定义了数据显示界面 -->
        <div style="float:left; width:300px; height:50px; background-color:#eeeeff; margin-left:5px; margin-top:5px;">
            用户ID:<span bind="{field:'userID'}"></span><br />
            用户名:<span bind="{field:'userName'}"></span><br />
            性 别:<span bind="{read:showSex}"></span><br />
        </div>
    </div>
    <div style="clear:both;"></div>

    <h2>简单表格绑定</h2>
    <!--
    在SimpleGrid中,表格的唯一一个tbody作为显示数据区,所以表头要放在thead中以区别开
    tbody中的唯一一行,作为数据模板
    -->
    <table id="userGrid" style="border-collapse:collapse;" border="1">
        <thead>
            <tr>
                <th>用户ID</th>
                <th>用户名</th>
                <th>性别</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td bind="{field:'userID'}"></td>
                <td bind="{field:'userName'}"></td>
                <td bind="{read:showSex}"></td>
                <td><a href="javascript:;" οnclick="viewData(this)">查看</a></td>
            </tr>
        </tbody>
    </table>

    <script language="javascript" type="text/javascript">
        //一条用户数据
        var user = { userID: "0", userName: "用户名称", sex: "M" };

        //一组数据
        var users = [
            { userID: "0", userName: "用户A", sex: "M" },
            { userID: "1", userName: "用户B", sex: "F" },
            { userID: "2", userName: "用户C", sex: "F" },
            { userID: "3", userName: "用户D", sex: "M" },
            { userID: "4", userName: "用户E", sex: "M" },
            { userID: "5", userName: "用户F", sex: "X" }  //人妖?
        ];

        //显示性别的函数。在某些情况下需要自定义的显示方式
        function showSex(data) {
            var sex = data.sex;
            switch (sex) {
                case "M":
                    this.innerHTML = "男";
                    break;
                case "F":
                    this.innerHTML = "女";
                    break;
                default:
                    this.innerHTML = "人妖?";
                    break;
            }
        }

        //查看数据的函数。在SimpleGrid的实现中,每个tr对应一个数据
        function viewData(link) {
            var tr = link.parentNode.parentNode;    //取到tr
            var data = tr.data;     //每个tr被SimpleGrid赋值一个data属性,即为该行的数据
            alert(data.userName);   //在此仅做显示操作
        }

        function main() {
            var db = new DataBinder("userInfo");    //声明一个绑定对象
            db.setData(user);                       //设置数据源
            db.read();                              //读取数据,也有相应保存数据的方法write

            var list = new SimpleList("userList");
            list.setDataSource(users);

            var grid = new SimpleGrid("userGrid");
            grid.setDataSource(users);
        }
    </script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值