好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Day 3 - 编写ORM

在一个Web App中,所有数据,包括用户信息、发布的日志、评论等,都存储在数据库中。在awesome-python3-webapp中,我们选择MySQL作为数据库。

Web App里面有很多地方都要访问数据库。访问数据库需要创建数据库连接、游标对象,然后执行SQL语句,最后处理异常,清理资源。这些访问数据库的代码如果分散到各个函数中,势必无法维护,也不利于代码复用。

所以,我们要首先把常用的SELECT、INSERT、UPDATE和DELETE操作用函数封装起来。

由于Web框架使用了基于asyncio的aiohttp,这是基于协程的异步模型。在协程中,不能调用普通的同步IO操作,因为所有用户都是由一个线程服务的,协程的执行速度必须非常快,才能处理大量用户的请求。而耗时的IO操作不能在协程中以同步的方式调用,否则,等待一个IO操作时,系统无法响应任何其他用户。

这就是异步编程的一个原则:一旦决定使用异步,则系统每一层都必须是异步,“开弓没有回头箭”。

幸运的是 aiomysql 为MySQL数据库提供了异步IO的驱动。

创建连接池

我们需要创建一个全局的连接池,每个HTTP请求都可以从连接池中直接获取数据库连接。使用连接池的好处是不必频繁地打开和关闭数据库连接,而是能复用就尽量复用。

连接池由全局变量 __pool 存储,缺省情况下将编码设置为 utf8 ,自动提交事务:

 @asyncio.coroutine
def create_pool(loop, **kw):
    logging.info('create database connection pool...')
    global __pool
    __pool = yield from aiomysql.create_pool(
        host=kw.get('host', 'localhost'),
        port=kw.get('port', 3306),
        user=kw['user'],
        password=kw['password'],
        db=kw['db'],
        charset=kw.get('charset', 'utf8'),
        autocommit=kw.get('autocommit', True),
        maxsize=kw.get('maxsize', 10),
        minsize=kw.get('minsize', 1),
        loop=loop
    )
 

Select

要执行SELECT语句,我们用 select 函数执行,需要传入SQL语句和SQL参数:

 @asyncio.coroutine
def select(sql, args, size=None):
    log(sql, args)
    global __pool
    with (yield from __pool) as conn:
        cur = yield from conn.cursor(aiomysql.DictCursor)
        yield from cur.execute(sql.replace('?', '%s'), args or ())
        if size:
            rs = yield from cur.fetchmany(size)
        else:
            rs = yield from cur.fetchall()
        yield from cur.close()
        logging.info('rows returned: %s' % len(rs))
        return rs
 

SQL语句的占位符是 ? ,而MySQL的占位符是 %s , select() 函数在内部自动替换。注意要始终坚持使用带参数的SQL,而不是自己拼接SQL字符串,这样可以防止SQL注入攻击。

注意到 yield from 将调用一个子协程(也就是在一个协程中调用另一个协程)并直接获得子协程的返回结果。

如果传入 size 参数,就通过 fetchmany() 获取最多指定数量的记录,否则,通过 fetchall() 获取所有记录。

Insert, Update, Delete

要执行INSERT、UPDATE、DELETE语句,可以定义一个通用的 execute() 函数,因为这3种SQL的执行都需要相同的参数,以及返回一个整数表示影响的行数:

 @asyncio.coroutine
def execute(sql, args):
    log(sql)
    with (yield from __pool) as conn:
        try:
            cur = yield from conn.cursor()
            yield from cur.execute(sql.replace('?', '%s'), args)
            affected = cur.rowcount
            yield from cur.close()
        except BaseException as e:
            raise
        return affected
 

execute() 函数和 select() 函数所不同的是,cursor对象不返回结果集,而是通过 rowcount 返回结果数。

ORM

有了基本的 select() 和 execute() 函数,我们就可以开始编写一个简单的ORM了。

设计ORM需要从上层调用者角度来设计。

我们先考虑如何定义一个 User 对象,然后把数据库表 users 和它关联起来。

 from orm import Model, StringField, IntegerField

class User(Model):
    __table__ = 'users'

    id = IntegerField(primary_key=True)
    name = StringField()
 

注意到定义在 User 类中的 __table__ 、 id 和 name 是类的属性,不是实例的属性。所以,在类级别上定义的属性用来描述 User 对象和表的映射关系,而实例属性必须通过 __init__() 方法去初始化,所以两者互不干扰:

 # 创建实例:
user = User(id=123, name='Michael')
# 存入数据库:
user.insert()
# 查询所有User对象:
users = User.findAll()
 

定义Model

首先要定义的是所有ORM映射的基类 Model :

 class Model(dict, metaclass=ModelMetaclass):

    def __init__(self, **kw):
        super(Model, self).__init__(**kw)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'Model' object has no attribute '%s'" % key)

    def __setattr__(self, key, value):
        self[key] = value

    def getValue(self, key):
        return getattr(self, key, None)

    def getValueOrDefault(self, key):
        value = getattr(self, key, None)
        if value is None:
            field = self.__mappings__[key]
            if field.default is not None:
                value = field.default() if callable(field.default) else field.default
                logging.debug('using default value for %s: %s' % (key, str(value)))
                setattr(self, key, value)
        return value
 

Model 从 dict 继承,所以具备所有 dict 的功能,同时又实现了特殊方法 __getattr__() 和 __setattr__() ,因此又可以像引用普通字段那样写:

 >>> user['id']
123
>>> user.id
123
 

以及 Field 和各种 Field 子类:

 class Field(object):

    def __init__(self, name, column_type, primary_key, default):
        self.name = name
        self.column_type = column_type
        self.primary_key = primary_key
        self.default = default

    def __str__(self):
        return '<%s, %s:%s>' % (self.__class__.__name__, self.column_type, self.name)
 

映射 varchar 的 StringField :

 class StringField(Field):

    def __init__(self, name=None, primary_key=False, default=None, ddl='varchar(100)'):
        super().__init__(name, ddl, primary_key, default)
 

注意到 Model 只是一个基类,如何将具体的子类如 User 的映射信息读取出来呢?答案就是通过metaclass: ModelMetaclass :

 class ModelMetaclass(type):

    def __new__(cls, name, bases, attrs):
        # 排除Model类本身:
        if name=='Model':
            return type.__new__(cls, name, bases, attrs)
        # 获取table名称:
        tableName = attrs.get('__table__', None) or name
        logging.info('found model: %s (table: %s)' % (name, tableName))
        # 获取所有的Field和主键名:
        mappings = dict()
        fields = []
        primaryKey = None
        for k, v in attrs.items():
            if isinstance(v, Field):
                logging.info('  found mapping: %s ==> %s' % (k, v))
                mappings[k] = v
                if v.primary_key:
                    # 找到主键:
                    if primaryKey:
                        raise RuntimeError('Duplicate primary key for field: %s' % k)
                    primaryKey = k
                else:
                    fields.append(k)
        if not primaryKey:
            raise RuntimeError('Primary key not found.')
        for k in mappings.keys():
            attrs.pop(k)
        escaped_fields = list(map(lambda f: '`%s`' % f, fields))
        attrs['__mappings__'] = mappings # 保存属性和列的映射关系
        attrs['__table__'] = tableName
        attrs['__primary_key__'] = primaryKey # 主键属性名
        attrs['__fields__'] = fields # 除主键外的属性名
        # 构造默认的SELECT, INSERT, UPDATE和DELETE语句:
        attrs['__select__'] = 'select `%s`, %s from `%s`' % (primaryKey, ', '.join(escaped_fields), tableName)
        attrs['__insert__'] = 'insert into `%s` (%s, `%s`) values (%s)' % (tableName, ', '.join(escaped_fields), primaryKey, create_args_string(len(escaped_fields) + 1))
        attrs['__update__'] = 'update `%s` set %s where `%s`=?' % (tableName, ', '.join(map(lambda f: '`%s`=?' % (mappings.get(f).name or f), fields)), primaryKey)
        attrs['__delete__'] = 'delete from `%s` where `%s`=?' % (tableName, primaryKey)
        return type.__new__(cls, name, bases, attrs)
 

这样,任何继承自Model的类(比如User),会自动通过ModelMetaclass扫描映射关系,并存储到自身的类属性如 __table__ 、 __mappings__ 中。

然后,我们往Model类添加class方法,就可以让所有子类调用class方法:

 class Model(dict):

    ...

    @classmethod
    @asyncio.coroutine
    def find(cls, pk):
        ' find object by primary key. '
        rs = yield from select('%s where `%s`=?' % (cls.__select__, cls.__primary_key__), [pk], 1)
        if len(rs) == 0:
            return None
        return cls(**rs[0])
 

User类现在就可以通过类方法实现主键查找:

 user = yield from User.find('123')
 

往Model类添加实例方法,就可以让所有子类调用实例方法:

 class Model(dict):

    ...

    @asyncio.coroutine
    def save(self):
        args = list(map(self.getValueOrDefault, self.__fields__))
        args.append(self.getValueOrDefault(self.__primary_key__))
        rows = yield from execute(self.__insert__, args)
        if rows != 1:
            logging.warn('failed to insert record: affected rows: %s' % rows)
 

这样,就可以把一个User实例存入数据库:

 user = User(id=123, name='Michael')
yield from user.save()
 

最后一步是完善ORM,对于查找,我们可以实现以下方法:

findAll() - 根据WHERE条件查找;

findNumber() - 根据WHERE条件查找,但返回的是整数,适用于 select count(*) 类型的SQL。

以及 update() 和 remove() 方法。

所有这些方法都必须用 @asyncio.coroutine 装饰,变成一个协程。

调用时需要特别注意:

 user.save()
 

没有任何效果,因为调用 save() 仅仅是创建了一个协程,并没有执行它。一定要用:

 yield from user.save()
 

才真正执行了INSERT操作。

最后看看我们实现的ORM模块一共多少行代码?累计不到300多行。用Python写一个ORM是不是很容易呢?

参考源码

day-03

查看更多关于Day 3 - 编写ORM的详细内容...

  阅读:41次

上一篇

下一篇

第1节:select里动态添加option    第2节:JS/JQuery获取当前元素的上一个/下一个兄弟级元素等元素的方法    第3节:在js中怎样获得checkbox里选中的多个值?(jQuery)    第4节:子节点修改父节点样式(原生js和jquery)    第5节:JS与jQuery给元素添加样式的方法    第6节:利用jquery库来设计设置滚动条个性化样式    第7节:JQuery的jCarousellite插件打造超炫左右滚动效果    第8节:jQuery.Validate常用的一些验证规则    第9节:jquery实现密码强度验证    第10节:jQuery kinMaxShow焦点图代码适用于全屏    第11节:JQuery.slideBox图片滚动焦点图    第12节:jquery页面引导提示用户操作    第13节:jQuery全屏滚动插件fullPage.js    第14节:jquery fullPage.js制作搜狐快站页面效果    第15节:jQuery hover事件    第16节:jQuery页面侧边固定悬浮导航代码(带关闭按钮)    第17节:jQuery中 trigger() & bind() 使用    第18节:Jquery学习笔记:typeof的使用    第19节:HDHCMS收集整理通过JQUERY实现输字符入过滤Select选项    第20节:jquery 多个元素绑定同时绑定多个事件    第21节:Jquery脚本获取兄弟节点,父节点,子节点    第22节:php+mysql+jquery实现简易的检索自动补全提示功能    第23节:php使用gzip压缩传输js和css文件    第24节:如何利用PHP生成二维码    第25节:PHP加jQuery实现找回密码    第26节:MySQLSchema设计(四)一个MySQL里的JQuery:common_sc    第27节:Dedecms实现tags云标签随机颜色与字体大小方法总结    第28节:jquery autocomplete和thinkphp开发 - Thinkphp    第29节:Dwz+thinkphp整合下的数据导出到Excel - Thinkphp    第30节:thinkPHP实现瀑布流 - Thinkphp    第31节:PHP/Javascript/CSS/jQuery常用知识大全详细整理(原创    第32节:jquery 无刷新评论    第33节:php文件管理,可以点击按照时间,大小,名称排    第34节:WordPress侧边栏关闭/显示设置方法 - WordPress    第35节:WordPress利用jquery实现动态下拉菜单 - WordPress    第36节:jQuery实现WordPress读者墙、排行榜图片放大效果    第37节:WordPress增加返回顶部效果代码 - WordPress    第38节:Wordpress中将选中内容分享到新浪腾讯微博 - Word    第39节:WordPress 调用 jQuery一些方法小结 - WordPress    第40节:WordPress文章图片自动添加原图url链接 - WordPress    第41节:wordpress中调用自带juqery库的方法与注意事项 - W    第42节:常用的JQuery数字类型验证正则表达式整理_正则表    第43节:jQuery中的正则表达式分析 正则基础_正则表达式    第44节:XSS with $(location.hash) - 网站安全 - 自学php    第45节:grails的安全策略 - 网站安全 - 自学php    第46节:PHPWind flash xss 0day [2] - 网站安全 - 自学php    第47节:jQuery(<=1.6.2) DOMXSS 分析 - 网站安全 - 自学php    第48节:乐视MySQL盲注、callback反射型XSS及一处绝对路径泄    第49节:Paypal的一个Dom型XSS漏洞分析 - 网站安全 - 自学p    第50节:PHPCMS V9文章内容页点击量如何调用_phpcms_CMS教程    第51节:Win7中打开chm文件内容无法显示问题 - Windows操作系    第52节:js代码另类劫持登录表单 - Windows操作系统 - 自学    第53节:jQuery实现简单的轮播图效果    第54节:jquery基础知识    第55节:jquery插件lazyload简单使用教程    第56节:videojs中文文档详解    第57节:video实现浏览器打开自动播放    第58节:Jquery中的$.cookie()方法    第59节:jQuery.fn和jQuery.prototype区别介绍    第60节:浅谈JQUERY的each方法    第61节:基于jQuery实现列表循环滚动小技巧(超简单)    第62节:jquery标签选择器应用示例详解    第63节:关于img的onload事件兼容ie下的bug问题    第64节:手把手教大家编写Jquery日历插件制作    第65节:Jquery使用小技巧汇总    第66节:jquery实现的3D旋转木马特效代码分享    第67节:jquery实现在网页指定区域显示自定义右键菜单效果    第68节:jquery分页实现原理详解    第69节:JavaScript如何调试有哪些建议和技巧附五款有用的调试工具    第70节:jquery如何判断当前浏览器的实现代码    第71节:jQuery插件开发精品教程(让你的jQuery更上一个台阶)【转】    第72节:我们谈一谈jQuery核心架构设计    第73节:jquery使用小技巧    第74节:解决IE中img.onload失效的方法    第75节:jQuery封装一个动态加载js和css插件    第76节:js图片等比例缩放    第77节:生成二维码的 jQuery 插件:jquery.qrcode.js    第78节:Jquery操作textarea,input,select,checkbox详解    第79节:带来一款JQUERY动画库tween.js可生成平滑动画    第80节:jquery图片滚动放大代码分享    第81节:jQuery处理XML数据解析方法详解    第82节:jquery方法之remove()方法详解    第83节:jquery实现滑动特效代码slide...方法详解    第84节:jquery右下角旋转环状菜单特效代码详解    第85节:jquery实现点击展开列表同时隐藏其他列表方法    第86节:jquery实现文件上传进度条特效    第87节:jquery+css3实现网页背景花瓣随机飘落特效    第88节:jquery实现动静态条形统计图    第89节:jquery地图map悬停显示省市详解    第90节:jquery Easyui快速开发详解    第91节:SyntaxHighlighter自动换行彻底解决办法    第92节:jquery如何实现点击滑动小图放效果    第93节:jQuery实现html元素拖拽    第94节:jqueryCtrl+Enter提交表单的方法    第95节:PHP结合jQuery如何实现投票功能    第96节:推荐一个jquery统计图效果网站    第97节:简单的jquery入门指引讲解    第98节:jquery append 动态添加的元素事件on 不起作用的解决方案    第99节:PHP接受文件并获得其后缀名的方法    第100节:jquery实现选中单选按钮下拉伸缩效果    第101节:jquery实现点击查看更多内容控制段落文字展开折叠效果    第102节:jquery星星评分效果实现方法    第103节:jquery实现页面虚拟键盘教程    第104节:[转载]jquery实现的div窗口震动效果实例    第105节:jquery弹窗层效果讲解    第106节:jquery 判断图片是否加载完成方法汇总    第107节:jQuery uploadify在非IE核心浏览器下无法上传    第108节:jquery如何继承主类自定义方法    第109节:jquery如何获取网页URL    第110节:jquery的bind方法详解    第111节:jQuery如何实现平滑滚动页面到指定锚点链接的方法    第112节:jquery验证密码强度    第113节:js的json字符串转换为对象    第114节:JQuery中如何阻止表单的提交动作    第115节:如何使用Jquery获取Form表单中被选中的radio值    第116节:jquery.map()方法的使用详解    第117节:jquery 获取页面源码    第118节:jQuery实现鼠标点击弹出渐变层的方法    第119节:jQuery中$this和$(this)的区别介绍    第120节:jquery操作复选框(checkbox)大全    第121节:jquery如何实现图片上传预览    第122节:jQuery怎么检测返回值的数据类型    第123节:jQuery最常用的方法集    第124节:jquery.fn.extend与jquery.extend区别    第125节:jQuery中extend函数详解    第126节:jQuery实现文字滚动marquee标签效果    第127节:jquery模拟select下拉效果    第128节:jQuery的end()详解    第129节:jquery的$(document)和$(window)的区别    第130节:jQuery插件boxScroll实现图片轮播特效    第131节:JQUERY获取当前页面的URL信息    第132节:jQuery实现Twitter的自动文字补齐特效_jquery_自学p    第133节:分享一个Jquery实现中国地图插件    第134节:jQuery插件原来如此简单 jQuery插件的机制及实战    第135节:jquery弹出层插件下载_jquery图片弹出    第136节:区别jQuery中height与width    第137节:jQuery插件的开发包括两种方式    第138节:推荐25个超炫的jQuery网格插件_jquery    第139节:jquery+php实现搜索框自动提示_jquery    第140节:jQuery操作cookie方法实例教程_jquery    第141节:基于jQuery实现文本框缩放以及上下移动功能_jqu    第142节:jQuery实现统计复选框选中数量_jquery    第143节:jQuery实现隔行背景色变色_jquery    第144节:使表格的标题列可左右拉伸jquery插件封装_jquery    第145节:jQuery事件绑定和委托实例_jquery    第146节:jquery中push()的用法(数组添加元素)_jquery    第147节:jquery提示效果实例分析_jquery    第148节:浅谈jQuery中对象遍历.eq().first().last().slice()方法    第149节:jquery操作对象数组元素方法详解_jquery    第150节:jquery选择器需要注意的问题_jquery    第151节:jQuery的ready方法详解_jquery    第152节:jQuery实现多按钮单击变色_jquery    第153节:jquery 操作css样式、位置、尺寸方法汇总_jquery_自    第154节:Jquery焦点图实例代码_jquery    第155节:基于jQuery实现复选框的全选 全不选 反选功能_j    第156节:理解jQuery stop()方法_jquery    第157节:jQuery验证插件 Validate详解_jquery    第158节:jQuery提示效果代码分享_jquery    第159节:jQuery 中$(this).index与$.each的使用指南_jquery_自学    第160节:Jquery对象和Dom对象的区别分析_jquery    第161节:常见的jQuery选择器汇总_jquery    第162节:jQuery选择器全集详解_jquery    第163节:jQuery简单实现网页选项卡特效_jquery    第164节:基于jQuery实现下拉框_jquery    第165节:基于jQuery实现表单提交验证_jquery    第166节:如何在MVC应用程序中使用Jquery_jquery    第167节:jQuery带箭头提示框tooltips插件集锦_jquery    第168节:jQuery Masonry瀑布流插件使用详解_jquery    第169节:超棒的响应式布局jQuery插件Freetile.js_jquery_自学    第170节:Jquery实现仿腾讯微博发表广播_jquery    第171节:jquery 实现返回顶部功能_jquery    第172节:jquery ui bootstrap 实现自定义风格_jquery    第173节:z-blog SyntaxHighlighter 长代码无法换行解决办法(jq    第174节:jQuery $命名冲突解决方案汇总_jquery    第175节:详谈jQuery中的this和$(this)_jquery    第176节:JQuery表单验证插件EasyValidator用法分析_jquery_自学    第177节:jquery中append()与appendto()用法分析_jquery    第178节:jQuery 插件开发指南_jquery    第179节:jquery checkbox 勾选的bug问题解决方案与分析_jquer    第180节:完美兼容各大浏览器的jQuery仿新浪图文淡入淡出    第181节:推荐8款jQuery轻量级树形Tree插件_jquery    第182节:推荐10个2014年最佳的jQuery视频插件_jquery_自学ph    第183节:浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异_jqu    第184节:超炫的jquery仿flash导航栏特效_jquery    第185节:jQuery 动态云标签插件_jquery    第186节:jquery插件推荐浏览器嗅探userAgent_jquery    第187节:jquery插件推荐 jquery.cookie_jquery    第188节:JSON格式化输出_jquery    第189节:前端必备神器 Snap.svg 弹动效果_jquery    第190节:jQuery函数map()和each()介绍及异同点分析_jquery_自学    第191节:jquery的总体架构分析及实现示例详解_jquery_自学    第192节:jquery常用方法及使用示例汇总_jquery    第193节:JQuery遍历json数组的3种方法_jquery    第194节:jQuery修改li下的样式以及li下的img的src的值的方法    第195节:一款基jquery超炫的动画导航菜单可响应单击事件    第196节:加载列表时jquery获取ul中第一个li的属性_jquery_自    第197节:jQuery遍历对象、数组、集合实例_jquery    第198节:JQuery中使用.each()遍历元素学习笔记_jquery_自学p    第199节:jquery处理json对象_jquery    第200节:jQuery遍历之next()、nextAll()方法使用实例_jquery_自学    第201节:使用JQ来编写最基本的淡入淡出效果附演示动画    第202节:jQuery中parents()和parent()的区别分析_jquery    第203节:鼠标悬浮显示二级菜单效果的jquery实现_jquery_自学    第204节:JQuery 实现在同一页面锚点链接之间的平滑滚动    第205节:jquery 获取 outerHtml 包含当前节点本身的代码_jqu    第206节:jQuery获取对象简单实现方法小结_jquery    第207节:Jquery修改页面标题title其它JS失效的解决方法_jq    第208节:基于jquery固定于顶部的导航响应浏览器滚动条事    第209节:用jquery模仿的a的title属性的例子_jquery    第210节:jQuery实现响应浏览器缩放大小并改变背景颜色_    第211节:深入分析JQuery和JavaScript的异同_jquery    第212节:运用jQuery定时器的原理实现banner图片切换_jquery    第213节:用简洁的jQuery方法toggleClass实现隔行换色_jquery_自    第214节:jQuery实现的导航条切换可显示隐藏_jquery_自学ph    第215节:jquery实现导航固定顶部的效果仿蘑菇街_jquery_自学    第216节:jquery中post方法用法实例_jquery    第217节:用Jquery.load载入页面后样式没了页面混乱的解决方    第218节:利用jquery操作Radio方法小结_jquery    第219节:jquery获取radio值实例_jquery    第220节:JQuery判断radio是否选中并获取选中值的示例代码    第221节:jQuery实现点击该行即可删除HTML表格行_jquery_自学    第222节:iframe里面的元素触发父窗口元素事件的jquery代码    第223节:Jquery解析Json格式数据过程代码_jquery    第224节:ie8模式下click无反应点击option无反应的解决方法    第225节:jquery动态加载js/css文件方法(自写小函数)_jquery_自    第226节:jquery实现多行文字图片滚动效果示例代码_jquery    第227节:jQuery获取iframe的document对象的方法_jquery    第228节:Jquery $.getJSON 在IE下的缓存问题解决方法_jquery_自    第229节:打造个性化的功能强大的Jquery虚拟键盘(VirtualKe    第230节:JQuery 使用attr方法实现下拉列表选中_jquery_自学    第231节:jquery幻灯片插件bxslider样式改进实例_jquery_自学    第232节:jquery引用方法时传递参数原理分析_jquery_自学ph    第233节:兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码    第234节:jQuery 实现自动填充邮箱功能(带下拉提示)_jq    第235节:两种方法基于jQuery实现IE浏览器兼容placeholder效果    第236节:分享20款美化网站的 jQuery Lightbox 灯箱插件_jquer    第237节:Json实现异步请求提交评论无需跳转其他页面_jq    第238节:jQuery固定浮动侧边栏实现思路及代码_jquery_自学    第239节:jQuery对val和atrr("value")赋值的区别介绍_jquery_自学    第240节:jquery和js实现对div的隐藏和显示方法_jquery_自学    第241节:javascript 自定义回调函数示例代码_jquery    第242节:jQuery判断当前点击的是第几个li的代码_jquery_自学    第243节:一个jquery实现的不错的多行文字图片滚动效果_    第244节:Javascript中封装window.open解决不兼容问题_jquery_自学    第245节:使用jQuery将多条数据插入模态框的实现代码_jqu    第246节:使用jQuery.wechat构建微信WEB应用_jquery    第247节:分享一款基于jQuery的视频播放插件_jquery_自学ph    第248节:jquery uploadify 在FF下无效的解决办法_jquery_自学p    第249节:jquery中使用循环下拉菜单示例代码_jquery_自学ph    第250节:Jquery设置attr的disabled属性控制某行显示或者隐藏    第251节:javascript trim函数在IE下不能用的解决方法_jquery_自    第252节:一款由jquery实现的整屏切换特效_jquery    第253节:jquery实现类似淘宝星星评分功能有截图_jquery_自学    第254节:jQuery移除tr无效的解决方法(tr是动态添加)_jquery    第255节:基于jquery的文字向上跑动类似跑马灯的效果_jqu    第256节:常用的jquery模板插件——jQuery Boilerplate介绍_jqu    第257节:jquery实现一个简单好用的弹出框_jquery    第258节:jQuery将多条数据插入模态框的示例代码_jquery_自学    第259节:jQuery如何获取同一个类标签的所有值(默认无法获    第260节:$("").click与onclick的区别示例介绍_jquery    第261节:jquery 实现两Select 标签项互调示例代码_jquery_自学    第262节:jquery获得同源iframe内body下标签的值的方法_jquer    第263节:jquery得到iframe src属性值的方法_jquery    第264节:jquery动态分页效果堪比时光网_jquery    第265节:JQuery拖动表头边框线调整表格列宽效果代码_jqu    第266节:使用JQuery库提供的扩展功能实现自定义方法_jqu    第267节:三种取消选中单选框radio的方法_jquery    第268节:jQuery 浮动导航菜单适合购物商品类型的网站_jq    第269节:jQuery CSS()方法改变现有的CSS样式表_jquery_自学ph    第270节:jquery取子节点及当前节点属性值的方法_jquery_自学    第271节:jQuery通过点击行来删除HTML表格行的实现示例_jq    第272节:JQuery 给元素绑定click事件多次执行的解决方法_    第273节:在css加载完毕后自动判断页面是否加入css或js文件    第274节:使用js dom和jquery分别实现简单增删改_jquery_自学    第275节:jQuery 复合选择器应用的几个例子_jquery    第276节:无限树Jquery插件zTree的常用功能特性总结_jquery_自    第277节:jquery实现类似淘宝星星评分功能实例_jquery_自学    第278节:JQuery实现当鼠标停留在某区域3秒后自动执行_jq    第279节:使用jquery解析XML示例代码_jquery    第280节:jquery学习总结(超级详细)_jquery    第281节:jquery.idTabs 选项卡使用示例代码_jquery    第282节:jQuery之Deferred对象详解_jquery    第283节:jQuery动态创建html元素的常用方法汇总_jquery_自学    第284节:jQuery中index()的用法分析_jquery    第285节:jQuery表格插件datatables用法总结_jquery    第286节:jquery向上向下取整适合分页查询_jquery    第287节:jquery用offset()方法获得元素的xy坐标_jquery_自学p    第288节:jquery实现html页面 div 假分页有原理有代码_jquery    第289节:10分钟学会写Jquery插件实例教程_jquery    第290节:一个实用的图片切换支持点击切换和自动轮播_    第291节:jQuery 1.9移除了$.browser可以使用$.support来替代_jq    第292节:jQuery源码分析之jQuery中的循环技巧详解_jquery_自学    第293节:使用jquery实现放大镜效果_jquery    第294节:Enter回车切换输入焦点实现思路与代码兼容各大浏    第295节:jQuery淡入淡出元素让其效果更为生动_jquery_自学    第296节:jquery和css3实现的炫酷时尚的菜单导航_jquery_自学    第297节:jQuery级联操作绑定事件实例_jquery    第298节:Iframe实现跨浏览器自适应高度解决方法_jquery_自学    第299节:js/jquery判断浏览器的方法小结_jquery    第300节:解决jquery版本冲突的有效方法_jquery    第301节:事件委托与阻止冒泡阻止其父元素事件触发_jqu    第302节:jquery实现个人中心导航菜单效果和美观都非常不    第303节:jquery制作select列表双向选择示例代码_jquery_自学    第304节:jQuery表格列宽可拖拽改变且兼容firfox_jquery_自学    第305节:jQuery实现倒计时按钮功能代码分享_jquery_自学ph    第306节:jquery delay()介绍及使用指南_jquery    第307节:jQuery自带的一些常用方法总结_jquery    第308节:浅析JQuery中的html(),text(),val()区别_jquery    第309节:用jquery实现动画跳到顶部和底部(这个比较简单    第310节:JQuery $.each遍历JavaScript数组对象实例_jquery_自学    第311节:Jquery实现兼容各大浏览器的Enter回车切换输入焦点    第312节:自编jQuery插件实现模拟alert和confirm_jquery_自学ph    第313节:使用jquery.validate自定义方法实现"手机号码或者固    第314节:一个简单的动态加载js和css的jquery代码_jquery_自学    第315节:JQuery中的html()、text()、val()区别示例介绍_jquery_自    第316节:JQuery表格拖动调整列宽效果(自己动手写的)_jque    第317节:影响jQuery使用的14个方面_jquery    第318节:分享一个自己动手写的jQuery分页插件_jquery_自学    第319节:超级好用的jQuery圆角插件 Corner速成_jquery_自学p    第320节:jquery 取子节点及当前节点属性值的方法_jquery_自    第321节:一个支持任意尺寸的图片上下左右滑动效果_jqu    第322节:在JavaScript中重写jQuery对象的方法实例教程_jquer    第323节:jQuery中的read和JavaScript中的onload函数的区别_jque    第324节:jQuery焦点图切换简易插件制作过程全纪录_jquery    第325节:jQuery标签替换函数replaceWith()的使用例子_jquery_自    第326节:原生javascript实现的分页插件pagenav_jquery    第327节:jQuery实用函数用法总结_jquery    第328节:jQuery动画特效实例教程_jquery    第329节:jQuery事件用法实例汇总_jquery    第330节:Html5的placeholder属性(IE兼容)实现代码_jquery_自学    第331节:jQuery针对各类元素操作基础教程_jquery    第332节:jQuery异步加载数据并添加事件示例_jquery_自学ph    第333节:Jquery通过JSON字符串创建JSON对象_jquery    第334节:Jquery中扩展方法extend使用技巧_jquery    第335节:jquery使用$(element).is()来判断获取的tagName_jquery_自    第336节:jQuery响应鼠标事件并隐藏与显示input默认值_jque    第337节:字段太多jquey快速清空表单内容方法_jquery_自学    第338节:用jquery修复在iframe下的页面锚点失效问题_jquery    第339节:JQuery实现动态表格点击按钮表格增加一行_jquery    第340节:Jquery仿IGoogle实现可拖动窗口示例代码_jquery_自学    第341节:jQuery实现列表自动滚动循环滚动展示新闻_jquery    第342节:jquery操作HTML5 的data-*的用法实例分享_jquery_自学    第343节:JQuery Tips相关(1)----关于$.Ready()_jquery    第344节:JQuery EasyUI 加载两次url的原因分析及解决方案_j    第345节:jquery中$(#form :input)与$(#form input)的区别_jquery_自学    第346节:通过jquery 获取URL参数并进行转码_jquery    第347节:jQuery实现返回顶部功能适合不支持js的浏览器_j    第348节:推荐10款最热门jQuery UI框架[原创]_jquery    第349节:jQuery CSS()方法改变现有的CSS样式_jquery    第350节:jQuery添加/改变/移除CSS类及判断是否已经存在CS    第351节:使用jQuery设置disabled属性与移除disabled属性_jquer    第352节:简单的jquery左侧导航栏和页面选中效果_jquery_自学    第353节:jquery实现的下拉和收缩效果示例_jquery    第354节:jQuery截取指定长度字符串代码_jquery    第355节:jQuery控制TR显示隐藏的三种常用方法_jquery_自学    第356节:jQuery .tmpl() 用法示例介绍_jquery    第357节:jquery实现在页面加载的时自动为日期插件添加当    第358节:jQuery根据ID获取input、checkbox、radio、select的示例    第359节:jQuery实现的一个tab切换效果内部还嵌有切换_jqu    第360节:用Jquery选择器计算table中的某一列某一行的合计    第361节:jQuery实现的一个自定义Placeholder属性插件_jquery_自    第362节:jquery判断浏览器后退时候弹出消息的方法_jquery    第363节:jQuery判断checkbox是否选中的3种方法_jquery_自学ph    第364节:jquery访问ashx文件示例代码_jquery    第365节:jQuery的animate函数学习记录_jquery    第366节:jQuery中get和post方法传值测试及注意事项_jquery_自    第367节:使用jquery.qrcode生成彩色二维码实例_jquery_自学p    第368节:jquery datatable后台封装数据示例代码_jquery_自学p    第369节:jquery对象和javascript对象即DOM对象相互转换_jquer    第370节:jquery bind(click)传参让列表中每行绑定一个事件_    第371节:jQuery html()方法使用不了无法显示内容的问题_jq    第372节:JQuery设置获取下拉菜单某个选项的值(比较全)_j    第373节:jquery中each遍历对象和数组示例_jquery    第374节:jQuery-强大的jQuery选择器 (详解)[转]    第375节:Asp.net MVC 中利用jquery datatables 实现数据分页显示功能    第376节:ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据    第377节:jQuery+Asp.Net实现省市二级联动功能的方法    第378节:jQuery实现金额录入框    第379节:.net jquery绘制自定义表单源码分享    第380节:利用ASP.NET MVC和Bootstrap快速搭建个人博客之后台dataTable数据列表    第381节:ASP.NET MVC中使用jQuery时的浏览器缓存问题详解    第382节:ASP.NET MVC+EF在服务端分页使用jqGrid以及jquery Datatables的注意    第383节:asp.net+Ligerui实现grid导出Excel和Word的方法    第384节:利用ASP.NET MVC+EasyUI+SqlServer搭建企业开发框架    第385节:asp.net+js实现批量编码与解码的方法    第386节:前端开发框架选型清单    第387节:为什么服务端获取不到路由哈希部分如vue的#号后面参数    第388节:三谈Iframe自适应高度代码_心得技巧_网页制作    第389节:深入学习.net验证码生成及使用方法    第390节:.net生成验证码    第391节:Asp.Mvc 2.0用户客户端验证实例讲解(3)    第392节:asp.net中js+jquery添加下拉框值和后台获取示例    第393节:jquery提交表单mvc3后台处理示例    第394节:jQuery实现倒计时跳转的例子    第395节:asp.net使用jquery模板引擎jtemplates呈现表格    第396节:asp.net使用jQuery获取RadioButtonList成员选中内容和值示例    第397节:asp.net使用jquery实现搜索框默认提示功能    第398节:asp.net使用jQuery Uploadify上传附件示例    第399节:.net mvc页面UI之Jquery博客日历控件实现代码    第400节:UpdatePanel和jQuery不兼容 局部刷新jquery失效    第401节:模拟QQ心情图片上传预览示例    第402节:asp.net中js和jquery调用ashx的不同方法分享    第403节:浅谈对Jquery+JSON+WebService的使用小结    第404节:jquery+php实现导出datatables插件数据到excel的方法    第405节:php+jquery实现无限级目录遍历展示代码    第406节:PHP批量修改静态html文件编码的例子 - php高级应用    第407节:php实现事件监听与触发实例程序 - php高级应用    第408节:jQuery教程-jQuery动画    第409节:jQuery教程-编写jQuery插件    第410节:jQuery教程-jQuery简介    第411节:jQuery教程-jQuery基本选择器    第412节:jQuery教程-jQuery过滤选择器    第413节:jQuery教程-jQuery表单选择器    第414节:jQuery教程-jQuery包装集    第415节:jQuery教程-jQuery的实用方法介绍    第416节:jQuery教程-jQuery事件模型    第417节:jQuery教程-jQuery的常用事件    第418节:jQuery教程-jQuery事件处理和事件委派    第419节:如何删除css样式    第420节:Asp.Mvc 2.0用户客户端验证实例讲解(3)    第421节:JQuery为用户控件(ASCX)赋值与接口的应用    第422节:Asp.net+jquery+.ashx文件实现分页思路    第423节:ASP.NET中UpdatePanel与jQuery同时使用所遇问题解决    第424节:jQuery调用WebService返回JSON数据及参数设置注意问题    第425节:JavaScript用JQuery呼叫Server端方法实现代码与参考语法    第426节:asp.net jquery无刷新分页插件(jquery.pagination.js)    第427节:在ashx文件中使用session的解决思路    第428节:jquery中如何获得服务器控件实现思路    第429节:使用Asp.net Mvc3 Razor视图方式扩展JQuery UI Widgets方法介绍    第430节:jquery.pagination +JSON 动态无刷新分页实现代码    第431节:巧妙使用JQuery Clone 添加多行数据,并更新到数据库的实现代码    第432节:使用jQuery Uploader显示文件上传进度    第433节:Asp.Net平台下的图片在线裁剪功能的实现代码(源码打包)    第434节:jQuery 插件autocomplete自动完成应用(自动补全)(asp.net后台)    第435节:排除JQuery通过HttpGet调用WebService返回Json时“parserror”错误    第436节:在jquery repeater中添加设置日期,下拉,复选框等控件    第437节:使用ASP.NET一般处理程序或WebService返回JSON的实现代码    第438节:jquery repeater 模仿 Google 展开页面预览子视图    第439节:30 分钟掌握无刷新 Repeater    第440节:JQuery实现Repeater无刷新批量删除(附后台asp.net源码)    第441节:asp.net中一款极为简单实用的图表插件(jquery)    第442节:jQuery Data Linking 对象与对象之间属性的关联    第443节:Asp.net下用JQuery找出哪一个元素引起PostBack    第444节:js插件类库组织与管理(基于asp.net管理)    第445节:asp.net+jquery Jsonp使用方法    第446节:asp.net下使用jQuery.AutoComplete完成仿淘宝商品搜索自动完成功能(改进了键盘    第447节:在Asp.net中使用JQuery插件之jTip代码    第448节:aspx实现的 jquery ui 的 flexgrid demo    第449节:asp.net+jquery Gridview的多行拖放, 以及跨控件拖放    第450节:Asp.net利用JQuery弹出层加载数据代码    第451节:ASP.NET开发者使用jQuery应该了解的几件事情    第452节:ASP.NET MVC引入JQUERY JQRTE控件    第453节:asp.net下 jquery jason 高效传输数据    第454节:让VS2008对JQuery语法的智能感知更完美一点    第455节:把jQuery的each(callback)方法移植到c#中    第456节:正则验证不能含有中文的实现方法【jQuery与java实现】    第457节:jQuery正则表达式的使用方法步骤详解    第458节:jQuery验证手机号邮箱身份证的正则表达式(含港澳台)    第459节:jQuery如何用正则表达式验证手机号、身份证号、中文名称    第460节:常用的JQuery数字类型验证正则表达式整理    第461节:jQuery中的正则表达式分析 正则基础    第462节:jQuery手机验证码倒计时效果    第463节:H5开发app用什么框架    第464节:php怎么实现点击加载更多    第465节:用jquery进行修复在iframe下的页面锚点失效问题    第466节:用简单的jquery+CSS创建自定义的a标签title提示tooltip    第467节:div嵌套html不用iframe    第468节:input中id和name属性的区别示例介绍    第469节:html+css+jquery模仿搜索风云榜选项卡效果有截图    第470节:使用trigger方式实现不用点击file类型的input弹出文件选择对话框    第471节:HTML中data自定义属性的使用和插件应用介绍    第472节:纯css为select添加样式(无脚本)实现    第473节:创建新元素的三种方法小结    第474节:如何使用<nav>链接实现滚动到页面某一部分    第475节:H5上滑跳转页面的实现(代码实例)    第476节:html5和css3以及jquery实现音乐播放器    第477节:HTML5和jQuery实现弹出创意搜索框层的方法    第478节:利用H5仿微信界面    第479节:如何使用jQuery和HTML5实现手机摇一摇的换衣特效    第480节:JQuery$()用法总结    第481节:jQuery怎么实现左右滑动的toggle    第482节:jQuery自定义函数应用以及解析    第483节:如何实现jquery回车登录效果    第484节:jQuery+JSONP跨域需要怎样实现    第485节:jQuery中如何实现toggle方法    第486节:jquery中select组件的使用方法    第487节:HTML5data-*自定义属性实例分享    第488节:HTML5的classList属性操作CSS类的使用详解    第489节:jqueryonbind之间有什么区别    第490节:HTML5中关于History模式的详解    第491节:HTML怎么导出生成word文档?    第492节:h5History模式的实例教程    第493节:jQueryValidation的使用详解    第494节:音乐播放器的制作实例(html5)    第495节:关于动画应用的6篇文章推荐    第496节:3D焦点图函数定义与用法汇总    第497节:有关设计参考的文章推荐5篇    第498节:分享一个用html5实现炮弹自由落体的实例代码    第499节:利用Jquery使用HTML5的FormData属性实现文件上传    第500节:分享几款炫酷的HTML5实现的图片特效