像bootstrap一样的去做web编程

1: 闭包

boot的闭包方式有点特别,普通的闭包是这样的:

(function ($) {

})(jQuery)

这种写法是怕全局污染,把$封闭在自己的空间里,暴露在外面的只有jQuery,这样,如果用了别的也用$的控件,就可以避免冲突。

而boot的闭包又有一些不同:

+function ($) {

}(jQuery)

这样写除了之前的好处,还有一点就是简洁,以及更重要的一点,避免之前的括号没有闭合,导致的冲突。这样,更加的独立,之前的包没有闭合也不会影响到这里。就好像保守的程序员,喜欢在个别的语句前,多家一个";",为的就是怕之前的语句与现在的语句合在了一起。

2:冲突的避免

除了控制jQuery中$的冲突,还要避免插件重名所带来的冲突。

jQuery 有自己的避免$全局污染的方法,就是noConflict。他可以把变量过渡到别的符号上,或者只是把$收回,只暴露出jQuery来。

而boot自己也有类似的冲突解决方法。

下面是所有boot插件的格式,以alert为例:

+function($){

 var old = $.fn.alert;

 $.fn.alert = function (option) {}

 $.fn.alert.Constructor = Alert;

 $.fn.alert.noConflict = function () {
 $.fn.alert = old;
 return this;
 }

}(jQuery)

这样接入有一个别的alert控件,也叫做alert。那么我们就会把他储存到old里。然后在把他重新生命为自己的alert控件。

如果在接下来,我们需要用之前的alert,那么就noConflict一下,这样,alert就又付给了之前的alert控件,也就是old。

再把咱们自己写的alert返回出来。我们可以再给他付给别的空间名,这样两个就都可以用了。

而且我们也可以用Constructor来查看现在alert究竟是哪个控件。

3:on的使用

boot很方便,有些控件是自动的绑定在了特定的元素上的。还是以alert为例。

var dismiss = ‘[data-dismiss="alert"]‘
$(document).on(‘click.bs.alert.data-api‘, dismiss, Alert.prototype.close);

这里就是on的用法,他可以监听整个document,然后在根据参数,冒泡到特定的元素上去,这样做的好处是,可以再元素未被渲染的情况下,就把事件绑定到上面去,这样做,不用ready,也可以对新生成的元素执行同样的事件。所以boot的空间,除了特定的一些(比如tooltip),都可以在写出来的同时,就可以应用,只需要给元素特定的属性。

4:css3的兼容解决方案

有时候,我们需要在动画效果结束后在来去调用一些函数,在我们用jquery的动画时,animate的done参数可以帮我们很好地解决这方面的事情,可是当我们的大部分动画,都应用了css3的时候,要怎么办呢。所以boot‘用了 一下这个方法:

+function ($) {
 ‘use strict‘;

 // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
 // ============================================================

 function transitionEnd() {
 var el = document.createElement(‘bootstrap‘)

 var transEndEventNames = {
 WebkitTransition : ‘webkitTransitionEnd‘,
 MozTransition : ‘transitionend‘,
 OTransition : ‘oTransitionEnd otransitionend‘,
 transition : ‘transitionend‘
 }

 for (var name in transEndEventNames) {
 if (el.style[name] !== undefined) {
 return { end: transEndEventNames[name] }
 }
 }

 return false // explicit for ie8 (  ._.)
 }

 // http://blog.alexmaccaw.com/css-transitions
 $.fn.emulateTransitionEnd = function (duration) {
 var called = false
 var $el = this
 $(this).one(‘bsTransitionEnd‘, function () { called = true })
 var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
 setTimeout(callback, duration)
 return this
 }

 $(function () {
 $.support.transition = transitionEnd()

 if (!$.support.transition) return

 $.event.special.bsTransitionEnd = {
 bindType: $.support.transition.end,
 delegateType: $.support.transition.end,
 handle: function (e) {
 if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
 }
 }
 })

}(jQuery);

他首先去问浏览器,是否支持transitionend这个属性,如果支持,那么我们在来做后续的操作,同样以alert为例:

$.support.transition && $parent.hasClass(‘fade‘) ?
 $parent
 .one(‘bsTransitionEnd‘, removeElement)
 .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
 removeElement()

首先$.support.transition,调用transitionEnd方法,看看是否支持这个属性,如果支持,那么就用one注册一次 transitionend,然后在用emulateTransitionEnd去调用一下,参数为这个css3动画的时间duration。这个时间之后去调用这次事件,就可以达成callback的形式。当然如果不支持这个属性,那么我们就直接执行callback,就ok了。

5:trigger的应用

trigger可以手动的触发事件,以modal控件为例,在之前的版本的控件中,当modal框弹出来的时候,底部主窗口的滚动条没有取消,所以在后续的控件中(大概3.0.3左右),用了自身的注册事件来避免这部分的小bug。代码如下:

$(document)
 .on(‘show.bs.modal‘, ‘.modal‘, function () { $(document.body).addClass(‘modal-open‘) })
 .on(‘hidden.bs.modal‘, ‘.modal‘, function () { $(document.body).removeClass(‘modal-open‘) })

他在每次点开modal框之前,也就是show事件中,给body添加class:modal-open,这个样式把overflow给hidden掉。再在关闭modal框之后,也就是hidden事件中,再把这个class给remove掉。

这里注册了时间,那么哪里去触发呢?这就用到了trigger方法,在特定的地方

 var e = $.Event(‘shown.bs.modal‘, { relatedTarget: _relatedTarget })
 that.$element.trigger(e)

这样就触发了事件。大部分的外部接口就是这样给出的。

6:事件注销的技巧

boot在事件注册的时候给了很多的后缀。比如 click.bs.alert,show.bs.modal。这样做事为了什么呢。

加入我想取消掉alert的click事件。可是我不能把所有的click事件都取消掉,所以我们在off事件的时候,就要这样写:

$(document).off(‘click.bs.alert‘)

如果我想注销掉全部的alert的事件,那么就要:

$(document).off(‘.bs.alert‘)

同理,要是想注销掉全部的boot注册的时间 那么就要:

$(document).off(‘.bs‘)

所以在注册时间时候,才要麻烦的加后缀,是为了我们之后的行为做准备的。这样写非常的有道理。

7:api的使用

boot给了我们简单的接口,但是没有给我们全部,可是其实我们是可以拿到的。

boot把方法给了data。如下面:

$.fn.alert = function (option) {
 return this.each(function () {
 var $this = $(this)
 var data = $this.data(‘bs.alert‘)

 if (!data) $this.data(‘bs.alert‘, (data = new Alert(this)))
 if (typeof option == ‘string‘) data[option].call($this)
 })
 }

在alert的时候,首先检查元素中用没有alert这个data,有的话,则直接调用,没有的话才生成新的。

那么其实我们可以这样做:

$(‘.alert‘).alert();
var api = $(‘.alert‘).data(‘bs.alert‘);
api.hide();

这是和$(‘.alert‘).alert(‘hide‘);一样用的。

8:proxy的应用

proxy调用一个方法,切用参数取代方法中的this,好像我自己写的控件form就有这么一段:

this.$element.on(‘click‘,‘[data-formtype="reset"]‘,$.proxy(function () {
 this.reset();
 }, this));

我用了$element冒泡到的data-formtype=reset的元素,那么this自然指向了它,它的click事件是调用方法本身的reset()事件,可是里面的this不是这个方法,那么我们就用proxy来指向当前方法的this。这个方法灵活运用,对于封装控件有很大作用。

时间: 2024-12-28 01:36:46

像bootstrap一样的去做web编程的相关文章

python+web编程学习总结记录(一)

近来一个多星期一直在学习py的web编程,从零开始,短暂时间接受的很多知识都需要消化吸收,所以在这里把这个过程梳理一遍,尽量用自己的语言去描述这些知识点. 首先是web编程的必备知识:HTTP协议.超文本传输协议(HTTP),是一种通信协议,按照定义来直接去看容易一头雾水,但其实只需要了解:web服务器和客户端之间交流,必须要遵守统一的规矩,不然就跟你说汉语我说英文一样,互相不知对方在说什么.这个统一的规矩或者格式就是HTTP协议 而服务器和客户端之间的通信方式简而言之就是,客户端给服务器发了一

物联网网络编程、Web编程综述

本文是基于嵌入式物联网研发工程师的视觉对网络编程和web编程进行阐述.对于专注J2EE后端服务开发的童鞋们来说,这篇文章可能稍显简单.但是网络编程和web编程对于绝大部分嵌入式物联网工程师来说是一块真空领域. 的确,物联网研发应该以团队协作分工的方式进行,所以有嵌入式设备端.网关.web前端.APP.后端开发等专属岗位.作为系统架构师,自然需要掌握各种岗位的关键技术.作为嵌入式工程师,掌握网络编程.web编程,能够极大地拓展自己的视野和架构思维,能够主动地对系统的各种协议和应用场景提出优化的见解

[转]所有编程皆为 Web 编程

Web编程还远远没有达到完美的境地.其实,还有点乱!没错,随便会写点代码的人就能三下两下地搞出一个糟糕的Web应用:也确实,99%的Web 应用都似狗屎一堆.但是,这也意味着,相当"聪明"的程序员们正在将他们的成果展现在成百上千(或者成千上万,甚至几百万)的用户面前,而这在互联网盛行 之前是绝无可能的 把软件按照Web应用的形式重整一下,即使软件本身并 不怎么样,这也使得程序员们能够把他们的软件展现在某个地方的某人面前. 如果你希望尽可能多的用户来使用你的软件,绝没有比把它做成Web应

不要忽视Web编程中的小细节

概述:长时间以来,我们创造了某些在构造和范围内用以提升网站易用性的约定和实践.然后在我们进行web编程的时候总有一些疏忽和纰漏.这里总结了一些web编程时容易出现的小错误,并给出了相应的补救方法,希望可以帮助提高网站的可用性.只要避免下列这些错误,网站的用户体验度就会大大提升. 错误一: 表单标签没有与相应字段相关联 利用 "for" 属性,使客户可以通过点击标签在表格内选择正确的输入字段.这对于复选框和单选字段来说就是要有更大的可点击区域. 错误二: Logo图表没有链接到主页 给l

Table被web编程弃用的原因

Table要比其它html标记占更多的字节.(延迟下载时间,占用服务器更多的流量资源.)Tablle会阻挡浏览器渲染引擎的渲染顺序.(会延迟页面的生成速度,让用户等待更久的时间.)Table里显示图片时需要你把单个.有逻辑性的图片切成多个图.(增加设计的复杂度,增加页面加载时间,增加HTTP会话数.)在某些浏览器中Table里的文字的拷贝会出现问题.(这会让用户不悦.)Table会影响其内部的某些布局属性的生效(比如<td>里的元素的height:100%)(这会限制你页面设计的自由性.)一旦

Python Web编程系列

我从网上找到了其他园友的文章,很不错,留着自己学习学习. Python Web编程(一)Python Web编程(二)Python Web编程(三)Python Web编程(四)Python Web编程(五)Python Web编程(六)Python Web编程(七) Python Web编程(八) 出处:http://www.cnblogs.com/game-over/category/105911.html

Bootstrap是快速开发Web应用程序的前端工具包 CSS和HTML的集合

版本主要新特性包括: Responsive embeds New responsive utility classes Copy docs snippets LMVTFY Browser bugs 其他更多: 提交有超过1000条,同时也很多改变的更加完美,下面几个值得注意的变化: The docs have been rearranged and updated to be more specific and easier to develop. The progress bar compon

JAVA web编程经验之: 一个请求一个事务

对于一个web请求,你会开启几个事务呢? 或许你没注意过吧. 又或许你不会对代码,性能要求太高,所以.... 一个请求一个事务, 因为一个事务往往和一个数据库连接关联, 如果开启了多个事务的话,也就意味着多个数据库连接, 性能不高吧? 前提 1.项目的代码结构分层如下: web层 ->  service层 -> infrastructure层(或DAO层) 2.所有事务都添加在 service层, 通过AOP(或其他类似的技术)实现 先看代码(一个Spring Controller 的调用代码

牛腩学习----Web编程安全问题

对于web编程中,安全是一项时刻都要注意的问题.在敲击牛腩的时候遇到的防止sql注入,md5转换明文密码为暗文等操作都是应对web编程安全问题提出的. 为此从网上查阅一些关于web安全方面的资料,对一些web安全问题简单了解了一下. SQL注入 SQL注入是攻击者通过精心设计的提交数据,在服务器合成SQL语句时,失去了设计者的初衷,导致执行了错误的SQL语句. 最简单的用户验证如果采用简单的select语句:select userName from USER where userName=1 a