Clipboard.js 无法在 Bootstrap 模式下工作
Clipboard.js not working in Bootstrap modal
我正在尝试使用 Clipboard.js 复制输入值:https://clipboardjs.com/。输入位于模式中:
http://codepen.io/Deka87/pen/eBJOKY
new Clipboard('#copy', {
text: function(trigger) {
return $("#copy-input").val();
}
});
虽然它在模态之外工作,但当输入和复制按钮位于模态中时它无法工作 window。我试图在模态 window 打开后初始化剪贴板功能:
$(".modal").on("shown.bs.modal", function() {
new Clipboard('#copy', {
text: function(trigger) {
return $("#copy-input").val();
}
});
});
但是,并没有解决问题。有什么想法吗?
试试这个分支:http://codepen.io/anon/pen/NbxWbQ
我忘了删除 console.log 所以忽略它 :)
<input type="text" class="form-control" id="copy-input" value="Copied successfully!"/>
<br />
<a href="#" id="copy" data-clipboard-target="#copy-input" class="btn btn-default">Copy input content to clipboard</a>
和
$(".modal").on("shown.bs.modal", function() {
console.log('a', Clipboard, $('#copy'), $("#copy-input").val());
var clipboard = new Clipboard('#copy')
});
我有同样的问题,我解决了这个附加元素而不是 document.body
。
function copyToClipboard() {
const el = document.createElement('textarea');
el.value = 'text to copy';
document.getElementById('copy').appendChild(el);
el.select();
document.execCommand('Copy');
document.getElementById('copy').removeChild(el);
}
Bootstrap 的模式强制关注可访问性(enforceFocus
)原因,但这会导致许多第三方库出现问题
https://github.com/twbs/bootstrap/issues?q=is:issue+enforceFocus+is:closed
我已经尝试了所有可能的情况,但其中 none 成功了。所以我没有使用剪贴板,而是做了一些 js 技巧。
首先select您要复制的文本。
document.querySelector('#txtCopy').select();
但此代码仅在您的元素是文本框时才有效。那么如何 select 如果你想 select 里面的内容 div 或 span 等。那么你可以使用下面的函数来做到这一点 -
function selectText(element) {
if (/INPUT|TEXTAREA/i.test(element.tagName)) {
element.focus();
if (element.setSelectionRange) {
element.setSelectionRange(0, element.value.length);
} else {
element.select();
}
return;
}
if (window.getSelection) { // All browsers, except IE <=8
window.getSelection().selectAllChildren(element);
} else if (document.body.createTextRange) { // IE <=8
var range = document.body.createTextRange();
range.moveToElementText(element);
range.select();
}
}
现在我们需要复制 selected 文本 -
document.execCommand('copy');
现在您可以看到文本已被复制。
有时您需要在复制后取消选择所有文本。在这种情况下 - 您可以使用以下功能取消选择 -
function deselectAll() {
var element = document.activeElement;
if (element && /INPUT|TEXTAREA/i.test(element.tagName)) {
if ('selectionStart' in element) {
element.selectionEnd = element.selectionStart;
}
element.blur();
}
if (window.getSelection) { // All browsers, except IE <=8
window.getSelection().removeAllRanges();
} else if (document.selection) { // IE <=8
document.selection.empty();
}
}
希望这对你有用。
https://github.com/zenorocha/clipboard.js/issues/155#issuecomment-217372642
Bootstrap 3
$.fn.modal.Constructor.prototype.enforceFocus = function() {};
Bootstrap 4
$.fn.modal.Constructor.prototype._enforceFocus = function() {};
我遇到了类似的问题,并通过以下步骤得到了解决方案:
1)创建一个临时输入元素并向其添加值:
var $temp_input = $("<input value='" + valueToCopy + "'>");
2)将元素附加到您的模式弹出窗口
$("#ModalPopup").append($temp_input);
3) 设置焦点和 select 字段:
$temp_input.focus(); $temp_input.select();
4) 使用 document.execCommand("copy")
5)删除临时元素
$temp_input.remove();
您必须设置容器
new ClipboardJS('.btn', {
container: document.getElementById('modal')
});
请参阅高级用法部分中的此页面 https://clipboardjs.com/。
我正在尝试使用 Clipboard.js 复制输入值:https://clipboardjs.com/。输入位于模式中:
http://codepen.io/Deka87/pen/eBJOKY
new Clipboard('#copy', {
text: function(trigger) {
return $("#copy-input").val();
}
});
虽然它在模态之外工作,但当输入和复制按钮位于模态中时它无法工作 window。我试图在模态 window 打开后初始化剪贴板功能:
$(".modal").on("shown.bs.modal", function() {
new Clipboard('#copy', {
text: function(trigger) {
return $("#copy-input").val();
}
});
});
但是,并没有解决问题。有什么想法吗?
试试这个分支:http://codepen.io/anon/pen/NbxWbQ 我忘了删除 console.log 所以忽略它 :)
<input type="text" class="form-control" id="copy-input" value="Copied successfully!"/>
<br />
<a href="#" id="copy" data-clipboard-target="#copy-input" class="btn btn-default">Copy input content to clipboard</a>
和
$(".modal").on("shown.bs.modal", function() {
console.log('a', Clipboard, $('#copy'), $("#copy-input").val());
var clipboard = new Clipboard('#copy')
});
我有同样的问题,我解决了这个附加元素而不是 document.body
。
function copyToClipboard() {
const el = document.createElement('textarea');
el.value = 'text to copy';
document.getElementById('copy').appendChild(el);
el.select();
document.execCommand('Copy');
document.getElementById('copy').removeChild(el);
}
Bootstrap 的模式强制关注可访问性(enforceFocus
)原因,但这会导致许多第三方库出现问题
https://github.com/twbs/bootstrap/issues?q=is:issue+enforceFocus+is:closed
我已经尝试了所有可能的情况,但其中 none 成功了。所以我没有使用剪贴板,而是做了一些 js 技巧。
首先select您要复制的文本。
document.querySelector('#txtCopy').select();
但此代码仅在您的元素是文本框时才有效。那么如何 select 如果你想 select 里面的内容 div 或 span 等。那么你可以使用下面的函数来做到这一点 -
function selectText(element) {
if (/INPUT|TEXTAREA/i.test(element.tagName)) {
element.focus();
if (element.setSelectionRange) {
element.setSelectionRange(0, element.value.length);
} else {
element.select();
}
return;
}
if (window.getSelection) { // All browsers, except IE <=8
window.getSelection().selectAllChildren(element);
} else if (document.body.createTextRange) { // IE <=8
var range = document.body.createTextRange();
range.moveToElementText(element);
range.select();
}
}
现在我们需要复制 selected 文本 -
document.execCommand('copy');
现在您可以看到文本已被复制。
有时您需要在复制后取消选择所有文本。在这种情况下 - 您可以使用以下功能取消选择 -
function deselectAll() {
var element = document.activeElement;
if (element && /INPUT|TEXTAREA/i.test(element.tagName)) {
if ('selectionStart' in element) {
element.selectionEnd = element.selectionStart;
}
element.blur();
}
if (window.getSelection) { // All browsers, except IE <=8
window.getSelection().removeAllRanges();
} else if (document.selection) { // IE <=8
document.selection.empty();
}
}
希望这对你有用。
https://github.com/zenorocha/clipboard.js/issues/155#issuecomment-217372642
Bootstrap 3
$.fn.modal.Constructor.prototype.enforceFocus = function() {};
Bootstrap 4
$.fn.modal.Constructor.prototype._enforceFocus = function() {};
我遇到了类似的问题,并通过以下步骤得到了解决方案:
1)创建一个临时输入元素并向其添加值:
var $temp_input = $("<input value='" + valueToCopy + "'>");
2)将元素附加到您的模式弹出窗口
$("#ModalPopup").append($temp_input);
3) 设置焦点和 select 字段:
$temp_input.focus(); $temp_input.select();
4) 使用 document.execCommand("copy")
5)删除临时元素
$temp_input.remove();
您必须设置容器
new ClipboardJS('.btn', {
container: document.getElementById('modal')
});
请参阅高级用法部分中的此页面 https://clipboardjs.com/。