CSS 类只是元素上的另一个属性:
doc.search('a').each do |anchor|
anchor.inner_text = "hello!"
anchor['class']="whatever"
end
由于 CSS 类在属性中以空格分隔,如果您不确定一个或多个类是否已经存在,您将需要类似
anchor['class'] ||= ""
anchor['class'] = anchor['class'] << " whatever"
您需要使用= 显式设置属性,而不是仅仅改变为属性返回的字符串。例如,这不会改变 DOM:
anchor['class'] ||= ""
anchor['class'] << " whatever"
即使这会导致完成更多工作,我也可能会这样做:
class Nokogiri::XML::Node
def add_css_class( *classes )
existing = (self['class'] || "").split(/\s+/)
self['class'] = existing.concat(classes).uniq.join(" ")
end
end
如果您不想对课程进行猴子补丁,您也可以:
module ClassMutator
def add_css_class( *classes )
existing = (self['class'] || "").split(/\s+/)
self['class'] = existing.concat(classes).uniq.join(" ")
end
end
anchor.extend ClassMutator
anchor.add_css_class "whatever"
编辑:您可以看到,这基本上是 Nokogiri 在内部为您通过单击类查看源代码找到的add_class 方法所做的:
# File lib/nokogiri/xml/node_set.rb, line 136
def add_class name
each do |el|
next unless el.respond_to? :get_attribute
classes = el.get_attribute('class').to_s.split(" ")
el.set_attribute('class', classes.push(name).uniq.join(" "))
end
self
end