"dart:html"和"dart:dom"包之间有什么区别?

And*_*rle 8 package dart dart-html

我从一些Dart例子开始.然后我想用这里document.query('#someId')描述的方式查询DOM ,但似乎文档中没有查询方法.通过`new Element.tag('p')创建一个新元素也行不通.

后来我弄清楚,它会工作,当我从改变导入的包dart:domdart:html.但是使用它们都给了我很多duplicate definition of _XYZ.

所以我想知道:

  1. 什么是dart:htmldart:dom包之间的区别
  2. 我应该使用哪一个
  3. 为什么我不能同时使用两者

Lar*_*ann 10

回答有点乱

  1. 应该使用哪一个:你应该使用dart:html它在DOM之上提供最干净的抽象.

  2. 为什么我不能同时使用它:它应该严格不需要,但你实际上可以dart:dom通过dart:html使用这里描述的脏黑客来获得底层实现.更好更清洁的解决方案是使用Dart重命名导入的功能,#import('dart:dom', prefix: 'dom');如下面的@munificent所述.

  3. 什么是dart:html和dart:dom包之间的差异.我倾向于认为它们之间的区别与JQuery(dart:html)和JS DOM操作(dart:dom)类似.

Dart团队正在努力使dart:htmlAPI变得简单且不令人惊讶(以良好的方式)使用,因为我们已经习惯了来自JQuery(dom manip),Tree.js(WebGL编程)和D3(SVG绘图)等库).此外,他们还尝试在所有这些功能区域中遵循一种API样式,以便SVG或WebGL API使用与DOM API类似的构造,从而确保所有部分可以很好地协同工作.

更新:截至2012年5月dart:dom现已弃用,将被删除.


mun*_*ent 7

Lars在你的问题上表现出色.我只想补充一下:

为什么我不能同时使用它们

你可以,实际上.问题是两个库对于一些事情(主要是window)使用相同的名称.当您导入它们时,这些名称会发生​​碰撞,Dart不允许这些名称.要解决此问题,您可以使用前缀导入其中一个:

#import('dart:html');
#import('dart:dom', prefix: 'dom');
Run Code Online (Sandbox Code Playgroud)

然后,当您引用从中导入的名称时dart:html,只需使用该名称即可.当你想要一个DOM时,你的前缀是:

window     // dart:html window
dom.window // dart:dom window
Run Code Online (Sandbox Code Playgroud)


Chr*_*ett 6

所有答案的更新,可能使这个问题不再适用,dart:dom已被弃用.

请参阅dartlang网站上的这篇文章.