【问题标题】:JavaScript: Can a constructor function create a documentElement object?JavaScript:构造函数可以创建 documentElement 对象吗?
【发布时间】:2009-08-20 06:47:01
【问题描述】:

我想做一个构造函数来创建一个 documentElement 对象。

例如,考虑 new Audio() 构造函数 - 它创建一个 documentElement 对象,如果您向它传递一些变量,它会使用属性填充新的 documentElement。它不会将其插入 DOM,它只是创建对象。

所以,问题是 - 是什么让 documentElement 与普通 javascript 对象(属于 {property: value} 类型)不同,您能否像为对象编写构造函数一样为它们编写构造函数?

编辑:

我正在玩弄的是在没有它的浏览器中重新创建新的 Audio() 构造函数,使用 quicktime 或 flash HTMLObjectElement 代替 HTMLAudioElement。

audio.constructor 引用 HTMLObjectElement 对我来说没问题,因为在支持它的浏览器中使用 new Audio() 的结果是 audio.constructor 引用 HTMLAudioElement。

我不确定 Audio.prototype。当我在支持音频的浏览器中查询 console.log(Audio.prototype) 时,它们什么也没有返回——甚至在 console.log 中没有空行——所以这让我很困惑。不过,如果我理解正确,这不会影响我的目标。

目的是能够使用 Audio 构造函数进行编码,并让浏览器在本地处理它或在需要时设置插件实例。

【问题讨论】:

  • 我刚刚在这里看到了一个有用的注释:stackoverflow.com/questions/367768/… Claudia 说:如果构造函数返回一个对象,则使用该对象而不是 this
  • Audio 构造函数创建了一个documentElement?你有一些参考资料吗?因为我不知道任何Audio 构造函数。
  • 它是新的。它伴随 html5 并允许您从 javascript 播放声音。查看博文下半部分html5doctor.com/native-audio-in-the-browser
  • 我知道 HTML5 中的音频内容,但我不知道有一个 JavaScript 构造函数。我认为您必须在 DOM 中查询 audio 标记才能访问音频 API。

标签: javascript dom functional-programming constructor


【解决方案1】:

document 元素不是一个普通的 JavaScript 对象,它是一个 DOM Element 对象,它实现了通用的 DOM 核心 document interface

您可以使用document.implementation.createDocument(可从DOM Core Level 2 获得)创建documentElements:

function createDocument() {
 var doc = document.implementation.createDocument('http://www.w3.org/1999/xhtml',
                                                      'html',  null),
     body = document.createElementNS('http://www.w3.org/1999/xhtml', 'body');  

  doc.documentElement.appendChild(body);  
  return doc;
}

编辑:

你的意思是这样的吗?

function ElementCreator(tagName, attributes){
    this.element = document.createElement(tagName);

    for (var i in attributes) {
      this.element[i] = attributes[i];
    }
  return this.element;
}

var anchor = new ElementCreator('a', { id: 'myLink', href:'http://google.com',
                                       innerHTML:'Link text' });
document.body.appendChild(anchor);
// <a id="myLink" href="http://google.com">Link text</a>

但是,我认为为此使用构造函数没有太多优势。

元素从构造函数返回,对象instance丢失,上例中的anchor.constructor指的是HTMLAnchorElement而不是ElementCreator,因此对ElementCreator.prototype的访问也是丢了。

如果将 DOM Element 实例包装在一个成员上,或者只是实现一个简单的函数,会更有意义。

【讨论】:

  • 对不起,如果我不清楚。你误会了。我想编写一个构造函数(不仅仅是一个函数),它将以 document.createElement('tag') 的方式创建 documentElements(不是文档)。
  • 感谢您的编辑。这让我走上了正确的道路。我已在对上述问题的编辑中回复了您的疑虑...
  • 我认为您的术语有点混乱。 “documentElement”是指一个 DOM 节点吗?
  • 是的。但在 DOM 中之前,它肯定不是 DOM 节点吗?
  • @stephband:一个 DOM 节点是一个 DOM 节点,无论它当前是否是文档的一部分。当它从文档中移除时,它不能停止成为一个 DOM 节点;如果创建时不是DOM节点,则不能插入到文档中,因为文档只能包含DOM节点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多