我正在为Rhino创建自己的自定义DOM。
如您所知,旧版IE支持“不错”。 document.all()功能用于执行节点选择。
可以按照以下方式调用
X) document.all(1).tagName
Y) document.all.[object id].tagName
如果我在我的DOM上声明函数
public object all(object ___param)
{
return ....;
}
可以处理查询X,但查询Y会抛出错误(因为rhino认为它是属性。
相反,如果我把属性作为
public object all
{
get
{
returns ...;
}
}
现在可以处理查询Y,但查询X最终会出错,因为它是属性!
(似乎我必须放弃Rhino javascript解释器中的一个选择。)
是否可以创建一个函数对象来处理查询X和查询Y?
提前致谢!
答案 0 :(得分:1)
这里有几个问题。
首先,Y中的语法不正确。它应该是:
document.all[object id].tagName
其次,如果您关心兼容性,则不推荐使用all
,even in Internet Explorer。
第三,您的public object all
示例也依赖于deprecated JavaScript syntax。您需要使用Object.defineProperty。
除此之外,还有另一个需要解决的问题:在Rhino中没有标准的方法,也没有办法让JavaScript对象拥有一个“全能”方法来处理任何属性名称,这就是你的魔力从document.all
寻找。 (ECMAScript 6的开发规范包含一个可以使用的功能,称为“代理”,但在Rhino中不支持。)因此,您可以使用的唯一方法是在Java端定义功能(参见{{3例如,并拦截对属性访问的调用。或者,您可以放入一个将对象视为不可变的hack,因此在初始化document
对象时,您可以初始化document[propertyname]
的所有值,但如果您修改了DOM,它们将停止工作
所以我的建议是,这不值得。但如果是,那就是你的路线图。