为了响应服务器上的某些异步事件,我想更新HTML节点的类以反映其更新状态。我知道节点的id,以及我要将其更改为的类。我需要使用什么JsCmd来更新类?一般来说,我在哪里可以找到关于JsCmd及其作用的好参考?
一个简单的例子:
case class UpdateClass(id: String, htmlClass: String)
class ClassUpdater extends CometActor {
override def lowPriority: scala.PartialFunction[scala.Any, scala.Unit] = {
case UpdateClass(id, htmlClass) =>
partialUpdate(Noop /* now what? */)
}
def render = NodeSeq.Empty
}
所以,如果我有HTML:
<html><body>
<lift:comet type="ClassUpdater"/>
<div id="foo" class="bar">insert text here</div>
</body></html>
如果我将UpdateClass("foo", "baz")
邮件发送到ClassUpdater
,我希望我div
的班级更改为baz
。
答案 0 :(得分:4)
编辑: 我找到了更好的方法。旧代码现在更像是一个更复杂的蓝图。
看起来没有jQuery就有更直接的方法:
SetElemById("foo", JE.Str("baz"), "className")
转换为JavaScript调用
document.getElementById("foo").className = "baz";
请注意,JE.Str("baz")
可以是任何JsExp
,如果您还可以执行类似
SetElemById("foo", JE.Str("baz"), "firstChild", "className")
这会改变第一个孩子的班级。 (见:SetElemById)
您可以查看JsCMD特征的代码,了解内置命令的其他功能。
如果您想要更复杂的东西,这样的事情可能对您有所帮助。它发送一个jQuery命令,它将#oldId
中的类更改为newClass
。
case class ChangeClassAtId(oldId: String, newClass: String) extends JsCmd {
def toJsCmd = """try {
$(""" + ("#" + oldId).encJs + """).attr("class", """ + newClass.encJs + """);
} catch (e) {}"""
}
在任何地方更改所有出现的类都有点复杂:
case class ChangeClass(oldClass: String, newClass: String) extends JsCmd {
def toJsCmd = """try {
$(""" + ("." + oldClass).encJs + """).each(function(){
$(this).addClass(""" + newClass.encJs + """).removeClass(""" + oldClass.encJs + """);
});
} catch (e) {}"""
}
当然,您应该使用它而不是Noop
。
答案 1 :(得分:0)
编辑 - 我误解了这个问题。我的回答只是更新了div的内容。
你会想要这样的东西:
case UpdateClass(id,htmlClass)=&gt; partialUpdate(SetHtml(id,Text(“TEXT TO TOO DIV”)))