- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用:
在页面上,我有一个 jQuery UI 对话框小部件
,它由用户手动启动。在 Dialog
内部是放置 DataTables 表和按钮
的地方。用户单击 “复制”
按钮,这将创建模态/类模态窗口,告诉用户按 Ctrl-C
将表格复制到剪贴板。
DataTables
有两个版本的 'Copy'
按钮,一个用于 Flash
,另一个用于 HTML5
。 Flash 工作正常,但主要是作为遗留浏览器的备用浏览器而设计的。 HTML5 是这里的问题所在。
阅读他们执行 HTML5 按钮的代码..它本质上做的是创建一个 textarea
元素,将表格数据复制到 textarea,然后它聚焦于 textarea 并选择它这样用户可以通过 Ctrl-C 进行复制。
问题是 textarea
没有获得焦点,甚至不能强制获得焦点,因为与 Dialog 小部件
有一些冲突。在不使用对话框小部件的情况下,“复制到剪贴板”功能可以正常工作。
在 Google Chrome 中,document.activeElement
位于 body
上。在 IE11 中,document.activeElement
位于 'Copy'
按钮上。我已经尝试了很多方法来迫使它专注于 textarea 但没有任何效果,包括 $(document.activeElement).blur()
然后是 $("textarea")[0] .focus()
.
代码如下:
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.9/css/jquery.dataTables.css"/>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/buttons/1.0.3/css/buttons.dataTables.css"/>
<script type="text/javascript" src="https://cdn.datatables.net/1.10.9/js/jquery.dataTables.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.3/js/dataTables.buttons.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.3/js/buttons.flash.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.3/js/buttons.html5.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#launchdialog").on("click", function( event ) {
var dialog = $("#dialogModal")
.dialog(
{
height: $(window).height()*.40,
width: $(window).width()*.30,
modal: true,
autoOpen: true,
title: "test",
close: function(ev, ui) {
$(this).dialog( "destroy" ).empty();
}
}
)
// Display table as DataTable
var $table = $('#exampleDataTables').DataTable( {
buttons: [
{
extend: "copyHtml5",
title: "copy"
}
]
});
// Place Buttons in existing Div tag
$table.buttons().container()
.appendTo( "#button-div-dialog" );
});
});
</script>
<style>
// Display 'Copy to Clipboard' modal above document and Dialog
// z-index is to set to 21 by DataTables code and, therefore, is behind div overlay and Dialog widget
div.dt-button-info {
z-index: 1000;
}
// Reveal 'Copy to Clipboard' textarea content for troubleshooting
div.dt-button-info span div {
height: 200px !important;
width: 200px !important;
overflow: scroll !important;
}
// Reveal 'Copy to Clipboard' textarea content for troubleshooting
textarea {
height: 200px;
width: 200px;
}
</style>
出于故障排除目的,我在 Google Chrome 中观察到,如果我打开对话框,然后删除 div 叠加层(它是使用对话框小部件创建的,因此用户无法单击对话框后面的任何地方),以及开发人员工具栏,以及然后单击“复制”按钮,文本区域内容被选中。在 IE11 中,我无法使用相同的步骤重现相同的效果。
唯一有效的方法,也是一种粗略的解决方案,如下所示:
// User clicks on the 'Copy' button. Any event here always fires before
// the DataTables code does its thing. Thus, I use setInterval as a trick
// to have the code I want to execute fire after the DataTables code
// execution is done.
$("#dialogModal").on("click", "div span.ui-button-text", function( event ) {
var intervalID = setInterval(function() {
if ( $("textarea").length !== 0) {
// Since textarea exists, that means DataTables code has finished executing.
// Hide Dialog trick (for IE) (Google Chrome works fine)
$("div.ui-dialog").hide();
// Since focus is no longer being hijacked by Dialog
// due to some unknown conflict, I can now finally set focus to
// the textarea element.
$("textarea")[0].focus();
// Display Dialog once more and select textarea contents
$("div.ui-dialog").show();
$("textarea")[0].select();
clearInterval(intervalID);
}
}, 10);
});
我不知道有什么方法可以在 DataTables 事件代码执行完毕后触发事件,而无需修改 DataTables 代码本身。所以,我使用 setInterval 来检查 textarea 是否存在。当它出现时,这意味着 DataTables 事件代码已完成。我现在可以使用 Google Chrome 选择它。对于 IE11,焦点被 Dialog 小部件劫持。我能想到的唯一解决方法是暂时隐藏对话框小部件,关注文本区域,然后再次显示对话框小部件。
对于IE11,我不能强制它专注于textarea。我在开发人员工具栏中尝试了很多东西,很多方法来取消设置和将焦点设置到文本区域,但没有任何效果。唯一起作用的是隐藏对话框小部件。
据我所知,此 Dialog/DataTables 冲突可能存在于其他 IE 版本中。到目前为止,我只测试了 Chrome 和 IE11。我坚信这是对话框小部件和/或 IE 的错误。
除了我在上面使用的解决方法之外,还有什么可以解决此 Dialog/DataTables 冲突的方法吗?
非常感谢。
最佳答案
我已经创建了一个纯 JavaScript 易于使用的替代方案,可以使用像 clip(text);
( github.com/Triforcey/clip-j ) 这样简单的命令复制到剪贴板。
这是源代码:
function clip(text) {
var copyElement = document.createElement('input');
copyElement.setAttribute('type', 'text');
copyElement.setAttribute('value', text);
copyElement = document.body.appendChild(copyElement);
copyElement.select();
document.execCommand('copy');
copyElement.remove();
}
关于jquery - DataTables 'Copy to Clipboard' (HTML5) 按钮不适用于 jQuery UI 对话框小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32428943/
该插件的绝大多数文档表明您可以使用 对其进行初始化 $('#example').dataTable(); 但是http://www.datatables.net/examples/api/multi_
我有一个 SQL 查询,它获取一些数据(dbtable 表中的语言列)。查询使用 GROUP_CONCAT,因此一个单元格有多个结果,例如 "Ajax, jQuery, HTML, CSS". 我想要
我有一个由 jQuery DataTables 增强的动态表,它显示一个与此类似的自定义对象 example . JSON: { "data": [ { "name": "Ti
我有两个数据表。首先是 DataTable NameAddressPhones = new DataTable(); 具有三列姓名、地址和电话号码。但我只想要两列姓名和地址数据,所以我想将这些列(包含
有没有办法将“处理...”语言放在 DataTable 对象的顶部而不是垂直中间?如果我有一张长 table ,它会隐藏在页面之外,因为它的默认位置在中间。 $('#example').dataTab
当我们向 DataTables 添加自定义过滤器时: $.fn.dataTable.ext.search.push(function(settings, data, dataIndex) { ..
我可以更改 dataTables 中搜索文本字段的宽度吗? 我现在正在编写以下代码,但它不起作用。 $('#example').dataTable() .columnFilter(
使用 DataTables plugin 时 如何使分页和 Showing 1 to 8 of 8 entries 出现在顶部而不是底部? 谢谢 最佳答案 每个数据表控件都以唯一的 id 命名计划之后
Angular 版本:6.0.4 ~ 节点版本:10.4.1 ~ NPM 版本:6.1.0 我看到这个问题被问了很多次,但没有回答。 关注这些后instructions to install angu
当单击外部按钮时,我正在尝试使用 DataTable(新版本)修改单元格值。我现在有以下内容: $(document).on('click', '.dropdown-menu li a', funct
引用:http://datatables.net/reference/api/page.info() 我正在尝试获取 ajax POST 生成的 jQuery DataTable 的当前分页信息。 使
以下对我有用: $('#datatable').on('page.dt', function() { alert("changed"); }); 每当我更改页面时,都会显示警报。但是如果我想警
我有一个 HTML 表,我在其中应用了 DataTables 函数。我使用表的第一行并将"template"类应用为我的模板行。然后选择此格式并使用 JSON feed 填充表中的所有行。问题是 Da
我有一个由 DataTables 1.10 驱动的表。过滤已打开。当我在下面谈论“做搜索”时,我指的是使用该表的过滤功能。 问题描述 关闭 stateSave 一切正常。但是,当 stateSave
看看这个例子,http://www.datatables.net/examples/api/multi_filter_select.html ,它使用 DataTable API 中的 columns
我正在使用 jQuery DataTables 在 spring 4.x 应用程序中创建一个报表页面来呈现报表。 通过 Jackson 消息转换器解析后,服务器返回以下对象。 { "data"
我在刷新 Primesfaces 的延迟加载数据表时遇到了一些问题。我正在使用 3.0.M4。 使用过滤器在您的示例中使用三个类。还尝试了仅使用延迟加载的示例,但随后未在 Controller 中重新
在 Blue Prism (BP) 中,有一种叫做 Collection 的东西,它基本上是 C# 中的 DataTable。在 BP 中,您可以在集合中拥有集合。我的问题是,您可以在 C# 的 Da
我正在使用 Flutter DataTables 来显示购物车中的商品列表。现在我想编辑任何选定行的数量。有没有办法获取用户点击的行信息? 以下是我的DataTable的完整代码: class _Da
我有一个关于 primefaces 数据表组件的问题。我想将 DataTable 变量绑定(bind)到 p:dataTable,以便我能够从支持 bean 以编程方式操作第一个、行、rowsPerP
我是一名优秀的程序员,十分优秀!