`new Image()`和`document.createElement('img')`之间有区别吗?

问题描述 投票:58回答:6

在javascript中,我可以这样做:

img1 = new Image();
img2 = document.createElement('img');

我的问题是,这两种方法有区别吗?我读过某个地方,ImageFormElement被称为主机对象,这是真的吗?如果是,主机对象是什么?

哪种方法更可取?

javascript dom
6个回答
52
投票

我找不到任何详细的参考,但根据MDC - HTMLImageElement示例中的评论,似乎Image是DOM级别0的一部分,而document.createElement is part of DOM level 2

DOM级别0由Netscape发明,提供了访问网站某些元素的方法。基本上所有浏览器都支持它以实现向后兼容。 但说实话,我不明白为什么Image构造函数存在于那里,因为据我所知,没有办法用DOM级别0来操作文档。也许它只是由浏览器在内部使用来创建对象。

DOM级别2是W3C开发的官方标准。

有关DOM级别的更多信息,请查看quirksmode.org - Level 0 DOMWikipedia


我读过某个地方,ImageFormElement被称为主机对象,这是真的吗?

是。

如果是,主机对象是什么?

ECMAScript specification以这种方式激励主机对象:

ECMAScript是一种面向对象的编程语言,用于在主机环境中执行计算和操作计算对象。这里定义的ECMAScript不是计算上自给自足的;实际上,本说明书中没有规定输入外部数据或输出计算结果。相反,预计ECMAScript程序的计算环境不仅将提供本规范中描述的对象和其他设施,还将提供某些特定于环境的主机对象,其描述和行为超出了本规范的范围,除非指示它们可以提供可以访问的某些属性以及可以从ECMAScript程序调用的某些功能。

主客体 主机环境提供的对象,以完成ECMAScript的执行环境。 注意任何非本机对象都是宿主对象。

因此,规范中未定义并由环境提供的任何对象都是宿主对象。这些例如在浏览器(以及其他)中:windowdocumentconsole


7
投票

这两行是等效的,都创建HTMLImageElement对象。唯一的区别在于具有混合命名空间的XML文档 - new Image()总是返回带有XHTML命名空间的<img>元素,document.createElement('img')并不总是这样做。


4
投票

我个人会坚持使用createElement,因为它不是一个特殊的情况,使一个图像的一切都是相同的,因为它们是相同的我也注意到jquery使用appendChild(节点)方法的一切,我不知道它们之间的区别你和问题中的两个方法,但jquery可以跨浏览器工作


4
投票

Requirements:

在我的团队中,我们正在构建角度5应用程序。功能要求是在组件负载上预加载图像,以便在我们的单页应用程序中的特定位置需要时再次加载它们。

1. img = new Image(); way:

我们尝试通过create new Image()在DOM中预加载图像但是当我们重用图像src URL时,浏览器总是重新加载源文件或检查标头是否被修改(如果启用了缓存)这意味着预加载是成功的但是对于每次重用,往返于服务器再次成功。

2. img = document.createElement('img') way:

当我们对document.createElement('img')做同样的事情时,图像源没有被重新加载,而是从文档的本地内存中重用,并且没有对img src URL做出额外的请求。

我真的不明白为什么,但这是我们发现的一个主要区别。如果其他人需要重复使用Preloaded图像,那么后者将是保存一些带宽和少量请求往返的方法:)


1
投票

我不知道技术差异应该是什么,但我只是通过在以下代码中从new Image()更改为document.createElement('img')来修复IE8错误。在IE8中,使用Image构造函数时,onload回调从未触发。

newImage = document.createElement('img');
//newImage = new Image();

newImage.onload = function () {
  callback(this.width, this.height);
};

newImage.src = image.src;

1
投票

在使用Web组件时,这两种创建图像的方法之间存在一些显着差异。例如,如果您在导入的HTML文档中使用document.createElement方法(使用<link rel="import" href="...">),则在将图像附加到主文档的DOM之前,图像实际上不会被加载。有关详细信息,请参阅this SO question/answer

© www.soinside.com 2019 - 2024. All rights reserved.