Javascript 扩展<;对象>;飞镖
DartJavascript 扩展<;对象>;飞镖,javascript,html,dart,Javascript,Html,Dart,Dart元素不支持getter访问.contentDocument,因此我考虑扩展对象以添加功能 我查看了ObjectElement的实现,基本上需要添加以下行: @DomName('HTMLObjectElement.contentDocument') @DocsEditable() Document get contentDocument => _blink.BlinkHTMLObjectElement.instance.contentDocument_Getter_(this)
元素不支持getter访问.contentDocument
,因此我考虑扩展对象以添加功能
我查看了ObjectElement
的实现,基本上需要添加以下行:
@DomName('HTMLObjectElement.contentDocument')
@DocsEditable()
Document get contentDocument => _blink.BlinkHTMLObjectElement.instance.contentDocument_Getter_(this);
然而,我不知道该怎么做。我现在使用的解决方案是使用一个代理,它将所有调用重定向到底层的JsObject
,但老实说,这不仅仅是脏的,而且不可能维护
/*更新以解释所有邪恶的根源*/
在启动我正在进行的项目时,我希望在网站上显示用户上传的SVG,并允许用户通过插入其他SVG元素或删除其他SVG来操纵这些SVG
将SVG作为字符串下载并通过
container.append(新的SvgElement(svgCode))
我发现了非常奇怪的显示错误,比如SVG中嵌入的图像被替换,甚至被移除,还有其他带有遮罩的错误
通过使用
标记并将其数据属性设置为SVG的url,问题得以解决。SVG被正确渲染。话虽如此,又出现了另一个问题。我无法访问和操作SVGs DOM,因为它位于
标记内,并且无法使用contentDocument
访问标记的文档
考虑到所有这些因素,几乎只剩下两种选择:
标记时没有显示错误,但无法操作SVG或
标记并使用Javascript访问对象的contentDocument
正如您所看到的,访问contentDocument
并不总是一个安全问题,不允许使用它,只是一个快速而肮脏的问题解决方案
当使用JsObject访问contentDocument
时,我得到的是一个JsObject,而不是一个元素。因此,我不仅需要在几乎所有地方更新我的代码,而且因为我必须将JsObject与callMethod(blabla)
一起使用,所以代码也变得非常难看 类MyObjectElement扩展了ObjectElement{
静态布尔值已注册=假;
静态寄存器(){
如果(!\u已注册){
document.registerement('my-object',MyObjectElement,
扩展标记:“对象”);
_isRegistered=真;
}
}
工厂MyObjectElement(){
var result=document.createElement('object','my object');
返回结果;
}
MyObjectElement.created():super.created();
js.JsObject获取内容文档{
//似乎不适用于自定义元素。
返回新的js.JsObject.fromBrowserObject(this)['contentDocument'];
}
}
像这样使用它
MyObjectElement.register();
var obj=新的MyObjectElement()
…数据=
"";
文件.正文.附加(obj) 是的,我知道。但我仍然无法访问contentDocument
,因为ObjectElement不提供getter。因此,我需要访问底层Javascript对象并执行对其contentDocument
的调用,然后将其转换为DartDocument
,以便在Dart中使用它。由于blink
库是私有的,我无法加载和使用它。可能是JsObject.fromBrowserObject
。对不起,我太累了,不能再仔细看了。可能明天。访问内容文档的问题不仅在使用
时出现,而且在
和
时也会出现。看看吧,否则我还不确定你想完成什么。出于安全原因,Dart团队故意阻止访问contentDocument
。一段时间以来,他们一直在考虑改变这一点,但迄今为止没有采取任何行动。您可以使用新的js.JsObject.fromBrowserObject(obj)['contentDocument']访问contentDocument
但是AFAIK没有办法从JsObject创建Dart实例。我更新了我的答案,但是新建了js.JsObject.fromBrowserObject(这个)['contentDocument']
似乎不适用于自定义元素。可能的工作方式是嵌入
而不是扩展它,但您仍然无法从contentDocument
获取Dart文档
实例。您至少应该创建一个bug报告,或者至少将您的用例添加到一个相关的现有bug中。完成。另一件事是,可能有一个解决我的问题(不是我的问题)的办法,就是在发送SvgElement时修复显示错误。你知道是什么导致了这些显示错误吗?更新:似乎是Chrome的问题。SVG只是由于用户的行为而改变的,因此,我想我会尝试一下。如果行得通,我欠你一杯很浓的咖啡;)阿当!!它对我的用例不起作用。我需要用户将鼠标悬停在SvgElements上,以便选择他想要操作的一个。因此,我需要将EventListeners
添加到元素中,因为我没有对这些元素的引用,所以它将不起作用:'(