Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么从上下文菜单复制停止工作?_Javascript_Jquery Mobile_Knockout.js_Clipboard_Knockout 3.0 - Fatal编程技术网

Javascript 为什么从上下文菜单复制停止工作?

Javascript 为什么从上下文菜单复制停止工作?,javascript,jquery-mobile,knockout.js,clipboard,knockout-3.0,Javascript,Jquery Mobile,Knockout.js,Clipboard,Knockout 3.0,我调试这个有困难,我怀疑这是某种浏览器安全协议 这是一些代码的一个最小示例,这些代码是通过让每一部分都有一个可点击的图标来复制文本而重构的,这很有效。引入一个上下文菜单,该菜单应委托给以前负责复制的视图模型 我期待的是,当右键单击并选择“复制”时,蓝色、绿色和红色将0、1、2输出到剪贴板 然而,自从我引入上下文菜单后,事情就停止了 我知道浏览器exec copy对用户交互有限制,但左键单击菜单选项肯定是用户交互 还是我犯了一个愚蠢的错误,我看不到过去 ClickDirect可以工作,因为它将函数

我调试这个有困难,我怀疑这是某种浏览器安全协议

这是一些代码的一个最小示例,这些代码是通过让每一部分都有一个可点击的图标来复制文本而重构的,这很有效。引入一个上下文菜单,该菜单应委托给以前负责复制的视图模型

我期待的是,当右键单击并选择“复制”时,蓝色、绿色和红色将0、1、2输出到剪贴板

然而,自从我引入上下文菜单后,事情就停止了

我知道浏览器exec copy对用户交互有限制,但左键单击菜单选项肯定是用户交互

还是我犯了一个愚蠢的错误,我看不到过去

ClickDirect可以工作,因为它将函数直接绑定到click处理程序

但其他部门都没有抄袭

var contextMenuVM=新函数(){
var self=这个;
var片段={};
var args=[];
self.show=功能(数据、事件){
log('showargs:',参数);
log('showthis:',this);
事件停止播放(真);
件=这个;
args=参数;
event.stopPropagation();
var posx=event.clientX+window.pageXOffset;//鼠标指针的左位置
var posy=event.clientY+window.pageYOffset;//鼠标指针的顶部位置
$('#contextMenu')。弹出('打开'{
x:posx,
y:波西,
地址:'来源'
});
返回false;
};
self.clickHandler=函数(fn){
返回函数(vm、事件){
event.stopPropagation();
event.preventDefault();
log('clickargs:',参数);
log('clickthis:',this);
fn.应用(件,参数);
//$(“#上下文菜单”)。弹出(“关闭”);
返回false;
};
};
}();
copyToClipboard=功能(pstrText){
//创建隐藏的文本元素(如果它还不存在)
var targetId=“\u hiddencypytext”;
变量origSelectionStart、origSelectionEnd;
//必须使用临时表单元素进行选择和复制
var target=document.getElementById(targetId);
如果(!目标){
target=document.createElement(“textarea”);
target.id=targetId;
document.body.appendChild(目标);
}
target.textContent=pstrext;
//选择内容
var currentFocus=document.activeElement;
target.focus();
target.setSelectionRange(0,target.value.length);
//复制所选内容
var成功;
试一试{
成功=document.execCommand(“复制”);
log('success:',success);
}捕获(e){
成功=错误;
console.log('exception',e);
}
//恢复原始焦点
if(currentFocus&&typeof currentFocus.focus==“函数”){
//currentFocus.focus();
}
//清除临时内容
//target.textContent=“”;
回归成功;
};
工具箱=新函数(){
var self=这个;
self.copy=函数(){
log('toolboxargs:',参数);
log('toolboxthis:',this);
copyToClipboard(此编号);
};
}();
var pieceVM=函数(编号){
var self=这个;
self.number=数字;
};
var arr=['bluemenu','greenmenu','redmenu','d','e','f','g','h','i','j','k','l'];
var计数=0;
$(函数(){
$(“.piece”)。每个(函数(){
应用绑定(新的pieceVM(arr[count++]),this;
});
applyBindings(contextMenuVM,document.getElementById('contextMenu');
});

演示
蓝色上下文菜单-不工作(成功:true)
绿色上下文菜单-不工作(成功:true)
红色上下文菜单-不工作(成功:true)
测试(向下滚动)
(预计:工作)
(结果:破裂)
上下文菜单(与演示相同)
(预计:工作)
(结果:破裂)
左键单击菜单
(预计:工作)
(结果:工作)
单击直接复制
(预计:破损)
(结果:破裂)
上下文直接复制
(预计:工作)
(结果:工作)
单击“间接”
(预计:破损)
(结果:破裂)
间接语境
复制
复制
复制
复制
复制
单击“间接”

它停止工作,因为JQuery移动弹出窗口阻止焦点转到弹出窗口之外的元素

您正在使用的代码(在一些地方已经普及,包括要复制的堆栈溢出)依赖于一个隐藏元素获得焦点

在您的情况下,您可能有点运气不佳,因为您有一个硬编码的实用程序函数,该函数假定焦点可能会丢失

如果您可以编辑该实用程序,我建议在每个弹出窗口中都有多个这样的字段,并且在调用复制函数时,可以使用最接近的字段,或者在弹出窗口中提供元素的id

幸运的是,你的问题不需要解决,但为什么会发生。否则我就帮不了你了:第6页花了几个小时。。。我们真糟糕