Javascript 扩展<;对象>;飞镖

Javascript 扩展<;对象>;飞镖,javascript,html,dart,Javascript,Html,Dart,Dart元素不支持getter访问.contentDocument,因此我考虑扩展对象以添加功能 我查看了ObjectElement的实现,基本上需要添加以下行: @DomName('HTMLObjectElement.contentDocument') @DocsEditable() Document get contentDocument => _blink.BlinkHTMLObjectElement.instance.contentDocument_Getter_(this)

Dart
元素不支持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或
  • 我从SVG的源代码中创建了新的SVG元素,并将它们附加到DOM中,让我可以操作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
    的调用,然后将其转换为Dart
    Document
    ,以便在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
    添加到元素中,因为我没有对这些元素的引用,所以它将不起作用:'(