如何复制和粘贴 HTML (HTML)

12/11/2015

本文内容

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

复制和粘贴 HTML 内容不同于复制和粘贴其他基本格式(如文本或链接)。遇到的主要挑战是,内容可能包含对其他内容的引用。例如,它可能包含其 src 属性引用本地存储的图像文件的 img 标记。当用户复制此内容时,他们期望同时包含文本和图像。支持复制和粘贴 HTML 的应用需要考虑如何处理这些引用以确保用户能够复制和粘贴他们所需的内容。

若要帮助你按用户期望的方式复制和粘贴 HTML,则 Windows.ApplicationModel.DataTransfer 命名空间包含一些函数,这些函数可帮助捕获引用的元素,如图像。我们将向你展示具体做法。

查看我们的剪贴板示例应用以便获得介绍如何复制和粘贴其他类型数据的完整示例。

你需要了解的内容

技术

先决条件

你应当了解如何使用 JavaScript 来标识用户已选择的 HTML,并在该选择范围内找到子元素(如 img 标记)的实例。

你应当熟悉 Visual Studio 及其关联模板。

你应当熟悉 JavaScript。

将 HTML 复制到剪贴板

var dataPackage = new Windows.ApplicationModel.DataTransfer.DataPackage();

获取 HTML 内容。

下面我们从 HTML 元素获取内容:

var htmlFragment = document.getElementById("htmlTextToCopy").innerHTML;

准备 HTML 内容以便进行剪贴板操作。

使用 HtmlFormatHelper.CreateHtmlFormat 方法准备 HTML 内容。该方法添加必需的标头并且确保将 HTML 设置为适合剪贴板操作的正确格式。

var htmlFormat = Windows.ApplicationModel.DataTransfer.HtmlFormatHelper.createHtmlFormat(htmlFragment);

将 HTML 内容添加到 DataPackage 对象。

dataPackage.setHtmlFormat(htmlFormat);

用内容引用填充资源映射。

如果用户选择了包含对其他内容(如本地存储的图像文件)的引用的 HTML,则需要将这些引用添加到 DataPackage.ResourceMap 属性中。下面是添加图像引用所需的步骤:

var imagePath = document.getElementById("localImage").src;

var imageUri = new Windows.Foundation.Uri(imagePath);

var streamRef = Windows.Storage.Streams.RandomAccessStreamReference.createFromUri(imageUri);

dataPackage.resourceMap.insert(imagePath, streamRef);

将内容复制到剪贴板。

Windows.ApplicationModel.DataTransfer.Clipboard.setContent(dataPackage);

粘贴剪贴板中的 HTML

获取剪贴板的内容。

var dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.getContent();

检查剪贴板是否包含 HTML 数据。

if (dataPackageView.contains(Windows.ApplicationModel.DataTransfer.StandardDataFormats.html)) {

...

}

如果剪贴板包含 HTML,则按照用户的指示检索该 HTML 并将其添加到文档对象模型 (DOM)。

小心  请注意,来自其他应用程序的 HTML 不受信任,因此你不应该显示它,除非你确定此 HTML 没有任何动态内容。使用 DataTransfer.HtmlFormatHelper.GetStaticFragment 方法获取共享的 HTML 内容(没有任何动态元素,如脚本标记)。

var htmlFragment = Windows.ApplicationModel.DataTransfer.HtmlFormatHelper.getStaticFragment(htmlFormat);

document.getElementById("htmlOutput").innerHTML = htmlFragment;

通过以下步骤使用资源映射的内容替换本地图像文件 URL(如果有):

...

var images = document.getElementById("htmlOutput").getElementsByTagName("img");

// Check first if there are any images (img tags) in the fragment, because

// calling the getResourceMapAsync method can be resource intensive.

if (images.length > 0) {

dataPackageView.getResourceMapAsync().done(function (resourceMap) {

// Check whether the resourceMap contains any items.

if (resourceMap.size > 0) {

for (var i = 0, len = images.length; i < len; i++) {

var imageElement = images[i];

// Look up RandomAccessStreamReference value corresponding to this

// image's SRC property.

var streamRef = resourceMap.lookup(imageElement.getAttribute("src"));

if (streamRef) {

// Generate blob URL, and replace contents of the SRC property.

replaceSrcURL(imageElement, streamRef);

}

}

}

});

}

...

function replaceSrcURL(imageElement, streamRef) {

// Map the image element's src to a corresponding blob URL generated from the streamReference.

streamRef.openReadAsync().done(function (imageStream) {

var blobObject =

window.MSApp.createBlobFromRandomAccessStream(imageStream.contentType, imageStream);

var blobUrl = window.URL.createObjectURL(blobObject, { oneTimeOnly: true });

imageElement.src = blobUrl;

}, function (e) {

displayError("Error opening stream corresponding to the image element with SRC=\"" +

imageElement.getAttribute("src") + "\". Error: " + e);

});

}

完整示例

该示例显示如何将带有嵌入图像的 HTML 复制到剪贴板。

function copyHTML() {

// Create the DataPackage object.

var dataPackage = new Windows.ApplicationModel.DataTransfer.DataPackage();

// Get the HTML content of an element.

var htmlFragment = document.getElementById("htmlTextToCopy").innerHTML;

// Prepare the HTML for Clipboard operations.

var htmlFormat =

Windows.ApplicationModel.DataTransfer.HtmlFormatHelper.createHtmlFormat(htmlFragment);

if (htmlFormat !== "") {

// Add the HTML to the DataPackage object

dataPackage.setHtmlFormat(htmlFormat);

// Populate the resourceMap with RandomAccessStreamReference objects

// corresponding to the local image file embedded in the HTML.

var imagePath = document.getElementById("someEmbeddedImage").src;

var imageUri = new Windows.Foundation.Uri(imagePath);

var streamRef = Windows.Storage.Streams.RandomAccessStreamReference.createFromUri(imageUri);

dataPackage.resourceMap.insert(imagePath, streamRef);

}

try {

// Copy the HTML content to Clipboard.

Windows.ApplicationModel.DataTransfer.Clipboard.setContent(dataPackage);

displayStatus("Text and HTML formats have been copied to Clipboard");

} catch (e) {

// Copying data to Clipboard can potentially fail if, for example another app is holding

// the Clipboard open.

displayError("Error copying content to Clipboard: " + e + ". Try again.");

}

}

该示例显示如何获取剪贴板中存储的 HTML,以及 HTML 内容中引用的任何图像。

function pasteHTML() {

var dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.getContent();

if (dataPackageView.contains(Windows.ApplicationModel.DataTransfer.StandardDataFormats.html)) {

// Get the HTML Format (CF_HTML) from DataPackageView.

dataPackageView.getHtmlFormatAsync().done(function (htmlFormat) {

// Extract the HTML fragment.

var htmlFragment =

Windows.ApplicationModel.DataTransfer.HtmlFormatHelper.getStaticFragment(htmlFormat);

// Add the fragment to the DOM.

document.getElementById("htmlOutput").innerHTML = htmlFragment;

// Replace local image file URLs, if any, with the contents of the resourceMap.

var images = document.getElementById("htmlOutput").getElementsByTagName("img");

// Check first if there are any images (img tags) in the fragment, because

// calling the getResourceMapAsync method can be resource intensive.

if (images.length > 0) {

dataPackageView.getResourceMapAsync().done(function (resourceMap) {

// Check whether the resourceMap contains any items.

if (resourceMap.size > 0) {

for (var i = 0, len = images.length; i < len; i++) {

var imageElement = images[i];

// Look up RandomAccessStreamReference value corresponding to this

// image's SRC property.

var streamRef = resourceMap.lookup(imageElement.getAttribute("src"));

if (streamRef) {

// Generate blob URL, and replace contents of the SRC property.

replaceSrcURL(imageElement, streamRef);

}

}

}

});

}

}, function (e) {

displayError("Error retrieving HTML format from Clipboard: " + e);

});

} else {

document.getElementById("scenario1HtmlOutput").innerText =

"HTML format is not available in clipboard";

}

}

function replaceSrcURL(imageElement, streamRef) {

// Map the image element's src to a corresponding blob URL generated from the streamReference.

streamRef.openReadAsync().done(function (imageStream) {

var blobObject =

window.MSApp.createBlobFromRandomAccessStream(imageStream.contentType, imageStream);

var blobUrl = window.URL.createObjectURL(blobObject, { oneTimeOnly: true });

imageElement.src = blobUrl;

}, function (e) {

displayError("Error opening stream corresponding to the image element with SRC=\"" +

imageElement.getAttribute("src") + "\". Error: " + e);

});

}

相关主题

html数据复制粘贴,如何复制和粘贴 HTML (HTML)相关推荐

  1. 你只管粘贴。复制我帮你解决

    上班的时候总有一些数据是要保存的.而有些时候因为数据表关联要改的数据并不是只改一张表.直接在系统中保存还方便一些.如果想要简单一些.直接拿到需要保存的数据对接口发送请求.但是需要处理授权. 如果把要保 ...

  2. html文档怎么复制粘贴,怎么复制粘贴(复制粘贴常用技巧)

    在Office家族中,有很多通用技巧,而复制粘贴绝对是出镜率最高的之一. 可是,99%的人都只是会Ctrl+C而已,对于复制粘贴的强大还一无所知. 比直接粘贴强大百倍的选择性粘贴,5个常用技巧你知道几 ...

  3. Android 代码操控手机粘贴板(复制到/获取)

    Android 代码操控手机粘贴板 以下方法皆为工具方法,直接复制可用 将字符串复制到粘贴板: //系统剪贴板-复制: s为内容public static void copy(Context cont ...

  4. python中如何实现复制粘贴_复制粘贴功能的Python程序 python 中如何实现

    python 中如何实现对文件的复制.粘贴虽然小编心有不甘,可是小编也明白,这辈子就只能陪你到这了. 比如说:小编想将"c:\123\1.txt"复制到"d:\新建文件夹 ...

  5. excel 直接复制oracle,为什么EXCEL复制单元格不能直接粘贴到Oracle数据库?|excel表格复制整列数据库...

    从网上数据库导出的EXCEL表格,有一列数据为何汇总不了,也复制不了呢 可能是看上去数据在那一列,可事实上数据并不在那一列,可能是在前一列或前几列中.将单元格移到你复制不了的那一列中的任一值中,如编辑 ...

  6. php点击复制按钮到我的粘贴板,JS 实现点击按钮复制内容到粘贴板 clipboard

    具体实现如下: 点击按钮复制内容到粘贴板 body { text-align: center; } #p1 { line-height: 150px; font-size: 40px; } #sour ...

  7. QQ空间无敌装逼,复制下面的任一代码粘贴即可出现意想不到的图案。

    复制下面的任一代码粘贴即可出现意想不到的图案. 打赏代码: [em]e10033[/em]{uin:123,nick: 打赏了你一个冰淇淋,who:1} [em]e10033[/em] 打赏了1000 ...

  8. ueditor编辑器右键粘贴、复制不能用的解决办法

    ueditor编辑器功能非常强大,现在比较多的网站页面或者系统中都集成了百度的ueditor编辑器,使系统编辑文本变得非常容易. 但是默认状态下,在使用google内核的浏览器时,会出现右键粘贴复制都 ...

  9. 实现虚拟机与主机之间自由粘贴和复制

    实现虚拟机VMware上面的ubuntu和主机的windows的自由粘贴和复制. 在虚拟机上面点击安装VMware Tools 终端下输入如下命令 cd /media/VMware Tools (我的 ...

  10. linux vim内容复制粘贴板,Vim 使用系统粘贴板复制粘贴

    习惯了Windows下面的复制,粘帖快捷键.转到vim编辑器会发现这两个键没什么作用,其实vim是使用ctrl+shift+c,ctrl+shift+v复制粘帖的.但是使用这些快捷键只能在一定屏幕范围 ...

最新文章

  1. 统计数字,空白符,制表符_为什么您应该在HTML中使用制表符空间而不是多个非空白空间(nbsp)...
  2. Android 开源之StickyHeaderListView 标题渐变、吸附悬停、筛选分类、动态头部
  3. delphi 鼠标获取窗口句柄_Windows窗口自定义,只需WindowTop一键设置
  4. pthread_join/pthread_exit用法实例
  5. ffmpeg抓取rtsp流并保存_详细解析RTSP框架和数据包分析(1)
  6. android 日历图,Android中的自定义日历视图
  7. Spring Framework 4.0相关计划公布---包括对于Java SE 8 和Groovy2的支持
  8. Windows10 的简单脚本 杀死所有表格程序
  9. IntelliJ IDEA 2017 破解
  10. HDU-4565 So Easy!
  11. Java基础第三天复习
  12. 【LLS-Player】ninja : rtdSDK构建
  13. 2020/5/4/ 每日一咕
  14. 崩坏3桌面版怎么更换服务器,崩坏3桌面版安装步骤介绍_崩坏3桌面版安装指南_玩游戏网...
  15. 美团外卖强杀门背后的真相,你看到的是真的吗?
  16. Word VBA(批量复制Excel表格和Word表格到Word中)
  17. StringUtil 用法
  18. java-php-python-医院挂号管理系统计算机毕业设计
  19. SpringBoot2-6 Web1-静态资源 默认4个目录,特别是resources 目录, webjars引入和内部资源访问,注意其内部resources目录 HandlerMapping
  20. 线上bug检测工具 android,Android 测试中对于偶现且难以重现的 bug 的处理

热门文章

  1. 2张图教你认识世界人口分布
  2. 查询rssi指令_RSSI测量方法及网络设备、终端设备与流程
  3. 商品房销售价格指数中的同比,环比,定基
  4. 杰理之外挂 FLASH 使用方法与注意点【篇】
  5. (附源码)spring boot校园管理系统 毕业设计 021104
  6. OpenCV中Mat的type说明
  7. 一种高效自然光供电的6LoWPAN无线传感节点
  8. 如何提高本地文件上传至百度云的速度_【软件推荐】满速下载软件,说出来你可能不信最高速度达到150m/s...
  9. 管理科学与工程和计算机哪个难考,考研管理科学与工程 管理学和工学哪个好考?...
  10. Android USB开发小结:host模式与accessory模式