查看HTML元素的classList元素将返回类型为DOMTokenList的对象,所以我们要研究的是该对象的属性和方法。
该类型的对象描述了一个用空格分隔的字符串数组,数组的每一项代表该元素的一个类名。HTMLElement.classList, HTMLLinkElement.relList, HTMLAnchorElement.relList or HTMLAreaElement.relList等方法都会返回该对象。
属性:
- length -- 只读属性,对于classList,它指示有多少个类名
方法:
- item(idx) -- 返回指定位置的项。如果未找到,则返回undefined,某些版本的浏览器返回null;
- contains(token) -- 如果数组中包含指定的元素,返回true,否则返回false;对于classList,该方法相当于jQuery中的hasClass方法;
- add(token) -- 向数组中添加元素。对于classList该方法相当于jQuery中的addClass
- remove(token) -- 移除指定的元素。对于classList该方法相当于jQuery中的removeClass方法;
- toggle(token) -- 切换某个元素。对于classList该方法相当于jQuery中的toggleClass方法;
简单的案例
classNum = elemClassList.length;
elemClassList.add('sexy');
elemClassList.remove('sexy');
elemClassList.toggle('fat');
if( elemClassList.contains('nipple') ){
console.info('OH YEAH');
}
模拟一下jQuery的addClass和removeClass
addClass: function (elem, value) {
// 如果没有传递元素
if (!elem) return;
var arr = [];
// 如果只有一个元素
if (elem.nodeType) arr.push(elem);
// 如果传递了HTML元素集合,如NodeList或HTMLCollection
if (elem.length) {
for (var j = 0, ln = elem.length; j < ln; j++) {
// 只处理HTML标签元素
if (elem[j].nodeType) arr.push(elem[j]);
}
}
// 为每一个元素添加类名
for (var i = 0, len = arr.length; i < len; i++) {
var elem = arr[i];
if (elem.nodeType === 1 && elem.className.indexOf(value) < 0 ) {
elem.classList.add(value);
}
}
},
removeClass: function (elem, value) {
var arr = [];
if (!elem) return;
// 如果只传递一个HTML元素
if (elem.nodeType) arr.push(elem);
// 如果传递了HTML元素集合
if (elem.length) {
for (var j = 0, ln = elem.length; j < ln; j++) {
// 只处理HTML标签元素
if (elem[j].nodeType) arr.push(elem[j]);
}
}
for (var z = 0, len = arr.length; z < len; z++) {
var elem = arr[z];
if (elem.nodeType === 1 && elem.className.indexOf() >= 0) {
elem.classList.remove(value);
}
}
}
};
本文链接
回到目录
百度百科中对闭包的定义:
闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境 (作用域)。在 Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby 和 Python,objective c 等语言中都能找到对闭包不同程度的支持。
占岭对闭包的定义:
对于函数A,它内部有子函数B,A函数的返回值为函数B,当A函数的实例被建立之后,由于还存在着对函数B的引用,所以函数B中的值还会存在于内存中,这时函数B的这种浪费内存的行为我们称为闭包!
在理解闭包之前,我们先来看一下JS变量的作用域吧:
所为使用域就是一个对象或者变量的有效性的范围,下面的代码中详细的说明了这一点
function bobo() {
var a = 1; //只在bobo函数体中有效
b = 1; //声明了一个全局变量,在整个<script>块中有效
function boboSub() { //声明一个函数,它只在bobo函数中有效
var c = 1; //只有boboSub函数声中有效
c = c + a; //子函数中可以使用上级函数的变量
}
}
通过一个代码来理解一下闭包吧:
这个例子中有变量i,它是父函数a中的一个变量,它对子函数b是可见的,在函数b中对它进行累加操作,最后函数a将函数b返回,而由于函数a对函数b
存在着地址上的引用,所以,当函数a没有被释放时,函数b也不会被释放,这虽然是不提供的,但在某种情况下是完成一些需求的最佳方式。即浪费的不一定是不好的。
function a() {
var i = 0;
function b() {
alert(++i);
}
return b;
}
var c = a();
c();
</script>
它的结果不是0,而是1,这就是闭合的作用,事实上闭合将局部变量B提升了,默认情况下,我们先把直接访问到函数A的内部函数B,所以闭包还有一个提升变量级别的作用。
好了,写到这里,Jquery真的不难系列也就写完了,匆匆忙忙,时间不知不觉过的很快,在这个系列中,我充分投入了进入,可能已经不是代码这么简单了,可能在写作的时候带有一些感情的色彩,这可能叫身临其境吧,又或者我走火入魔了,以至于我已经失眠3天了,呵呵!
祝大家早日学有所成吧,好好工作,好好生活吧!就到这吧。
回到目录
本文链接
$ rails new sampleapp -T
step2:
$ cd sampleapp
step3:
修改Gemfile
添加
gem 'therubyracer' group :development do gem 'rspec-rails' end group :test do gem 'rspec' gem 'webrat' end
step4:
$ bundle install
step5: 安装rspec
$ rails generate rspec:install
step6: 新建几个页面,【并删掉部分测试(可略过)】
$ rails generate controller Pages home contact
$ rm -rf spec/views
$ rm -rf spec/helpers
step7: 安装autotest(http://automate-everything.com/2009/08/gnome-and-autospec-notifications/#comments)
$sudo gem install ZenTest
【#可能在安装的时候提示gem版本太低,需要~>1.8,需要升级,以下给出升级方法(直接gem update --system是不行的):
#$sudo gem install rubygems-update -v 1.8.24(我安装时的最新版本)
#$sudo update_rubygems
#$sudo gem update --system
#】
$sudo gem install redgreen
$sudo apt-get install libnotify-bin
step8:
新建文件~/.autotest,内容如下
#!/bin/ruby require 'redgreen' #若为ubuntu11.*需要去掉此行 require 'autotest/timestamp' module Autotest::GnomeNotify def self.notify title, msg, img system "notify-send '#{title}' '#{msg}' -i #{img} -t 3000" end Autotest.add_hook :ran_command do |at| image_root = "~/.autotest_images" results = [at.results].flatten.join("\n") results.gsub!(/\\e\[\d+m/,'') output = results.slice(/(\d+)\sexamples?,\s(\d+)\sfailures?(,\s(\d+)\spending?|)/) full_sentence, green, failures, garbage, pending = $~.to_a.map(&:to_i) if output if failures > 0 notify "FAIL", "#{output}", "#{image_root}/fail.png" elsif pending > 0 notify "Pending", "#{output}", "#{image_root}/pending.png" else notify "Pass", "#{output}", "#{image_root}/pass.png" end end end end
step9:
下载autotest_images.zip,将.autotest_images放到放到~/下,即~/.autotest_images/
下载链接:http://automate-everything.com/wp-content/uploads/2009/08/autotest_images.zip
step10:享受成果。
$cd sampleapp #若已在此目录,略过
$autotest
step11:有关spork配置察看链接http://blog.csdn.net/emerald0106/article/details/7251332
注意启动spork时,spork为小写,即
$spork