事件传播三阶段:
在 target phase,event handler 被调用的顺序不再遵循先捕获,后冒泡的原则,而是严格按照 event handler 注册的顺序
在例子中,
btn.onclick = function(){
console.debug("冒泡1.Click btn");
}
先于
btn.addEventListener("click",function(){
console.debug("捕获1.Click btn");
},true);
注册,故而先执行。
要改变二者的执行顺序,只需要改变两段源码的顺序即可。
Next, the implementation must determine the current target's candidate event listeners. This must be the list of all event listeners that have been registered on the current target in their order of registration. [HTML5] defines the ordering of listeners registered through event handler attributes. Once determined, the candidate event listeners must not be changed. Adding or removing listeners does not affect the current target's candidate event listeners.
StackOverflow 更多讨论:
main 的祖先链里并没有 Module,这几个方法是怎么进去的?
这几个方法是 main 对象的 private singleton method,定义在 main 对象的 metaclass 里,因此可以被 main 对象调用
# at top-level
self.private_methods - Object.private_instance_methods # => [:define_method, :include, :private, :public, :using]
self.singleton_class.private_instance_methods(false) #=> [:define_method, :include, :private, :public, :using]
为什么要在 main 里加上这些方法?
个人感觉可以用四个字形容:将错就错。Ruby 也不是一门完美的语言,top-level 的设计一直也来也很有争议。顶层的 main 对象时而表现得像一个 Object 类的普通实例,时而表现得像一个 Module。严谨地讲,这是 Ruby 的一个 bug,然而 Matz 并不准备改,所以只能将错就错下去了。
更多讨论:
Rubinius 源码: https://github.com/rubinius/rubinius/blob/master/core/main.rb
Effective 系列确实都是好书!
#2 楼 @stardiviner HTML 属于 Web 前端的知识,找本前端的书看看就明白了,其实挺简单的。
Rails 里面能直接使用 helper 方法是因为约定大于配置,Rails 源码中已经自动加载文件并 include 了相关模块。
Ruby 里用 Kernel#require
和 Kernel#require_relative
显式加载执行其它文件中的代码,也可以使用 Kernel#load
和 Module#autoload
。
其实这反映了 Python 和 Ruby 的两种不同理念,Python 强调 explicit is better than implicit
, submodule.my_method
能清晰地反映出 my_method
是在哪个文件中定义的;而 Ruby 更强调简洁,更含蓄一些,直接使用 my_method
的缺点是你不能一眼看出该方法定义在哪里,需要用 method(:my_method).source_location
查看。各有利弊!
不觉得少啊,我给你列举几个:
安装 slim 这个 gem 后,会同时安装一个命令 slimrb
,可以在命令行下将 slim 文件转换为 html/erb 格式。
#1 楼 @darkbaby123 我感觉普通的开源项目重名没什么大问题,但是这个牵扯到了知识产权,毕竟 IBM 先注册了商标,应该说存在一定的法律风险(参考 javaeye 被迫改名 iteye 一事,域名都不能随便用)。
学费米
过来人表示:趁还在学校,赶紧考啊!
最主要的,就是预期近几年根本没有开车的机会,让我为这个东西支付成本,实在是理解不了
可以这样理解:工作后的时间成本比学生期间的昂贵太多,为了将来省钱省时间,早点学!
很赞,已 star!
参考 https://ruby.taobao.org/,不管是啥操作系统,在天朝,最主要的是设置 gem 的源。
gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/
安装 Bundler 并在命令行运行
bundle config mirror.https://rubygems.org https://ruby.taobao.org
Ruby 中有 alias
关键字和 Module#alias_method
方法,用于为方法设置别名。
checking for outdated ImageMagick version (<= 6.4.9)... no
你的 ImageMagick 版本是啥?
Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options.
检查 mkmf.log
Let me google that for you
You are not alone.
http://stackoverflow.com/questions/13963404/rails-and-os-x-how-to-install-rmagick
gem i rails -v 5.0.0.beta1
Inside Gemfile:
gem 'rails', '5.0.0.beta1'
Zeal Velocity LovelyDocs
支持开节点!
简单的说,虽然 puts
和 cc
都是 private method,但是 puts
是定义在 Kernel 模块中,cc
方法是定义在 KernelModule 模块中。Kernel
是一个特殊的模块,它和你自己定义的 KernelModule
模块有一些行为上的不同。
详细地说,这涉及两方面的知识:
module KernelModule
def cc
puts "this is the private method"
end
private : cc
end
class FatherClass
include KernelMdoule
end
class SonClass < FatherClass
cc
end
SonClass.ancestors # => [SonClass, FatherClass, KernelModule, Object, Kernel, BasicObject]
SonClass.class.ancestors # => [Class, Module, Object, Kernel, BasicObject]
Kernel
模块已经在 Object 模块中 include,而几乎所有的 Ruby 类都是直接或间接地继承自 Object
,所以 Kernel 模块会出现在所有类的 ancestors 列表中。当在 receiver 上调用 cc
方法时,Ruby 解释器会沿 receiver.class.ancestors 逐级查找是否有 cc
的定义,如果找到,会调用 cc
方法,同时不再向上查找;如果遍历 ancestors 而没有找到,则会在 receiver 上调用 method_missing 方法,一般情况下会抛出 NoMethodError 错误。
我试着解答一下:
问题 1:
obj.puts("this is the Kernel method") #报错 private method puts
puts 是 private instance method。private 的意思就是不能显示地指定 receiver object。你在这里显式指定 obj 为 receiver,当然会报错啦。
问题 2:
你这里笔误了吧。class SonClass < KernelClass
应该是 class SonClass < FatherClass
才对。
而且,你调用 cc
方法的时候,receiver 是 SonClass,而不是 SonClass 的实例,当然获取不到实例方法了。
问题 3: Ruby 文档的确有问题