好得很程序员自学网

<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的详细内容...

  阅读:51次

上一篇

下一篇

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