找回密码
 立即注册

QQ登录

只需一步,快速开始

zhaozimingT

高级会员

38

主题

207

帖子

1284

积分

高级会员

积分
1284

[已处理] 拖拽

zhaozimingT
高级会员   /  发表于:2017-3-28 15:38  /   查看:24520  /  回复:51
   我把你的代码放进我自己的demo里面。
   然后之所以没有用hitinfo,是因为它一直在获取单元格坐标,然后当我拖拽的时候,每经过一个单元格就会把值赋值进去。
  现在你改过的代码也会出现这种情况。如图,我拖拽了一次经过了两个单元格就赋值了两次。
  再其次就是赋值的单元格并不是鼠标拖拽的单元格,有y坐标的几个单元格差距。
7B24K8E7HO1RJD8SBC(JGP4.png

51 个回复

倒序浏览
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-3-28 16:29:14
沙发
我给您的示例中设置了一个count 去计数,您也可以设置一个数组去缓存已经赋过值的单元格,只要不重复setValue就能解决性能问题。你说赋值单元格并不是鼠标单元格,那时因为鼠标移动较快有个延时。

您的代码问题在于在一个事件中去使用闭包达到传递参数的效果,这样是无法控制的。
回复 使用道具 举报
zhaozimingT
高级会员   /  发表于:2017-3-28 17:20:52
板凳
dexteryao 发表于 2017-3-28 16:29
我给您的示例中设置了一个count 去计数,您也可以设置一个数组去缓存已经赋过值的单元格,只要不重复setVal ...

对于你的回答,我思考了一下。首先你叫我设置一个数组,放已经赋值的单元格,可是问题不在这里。问题是当鼠标没有释放的时候会一直给经过的单元格赋值,当鼠标释放的时候,还是会在停下的单元格赋值。与存不存进数组没关系。 再其次,鼠标释放的当前单元格与赋值的单元格有差距并不是因为鼠标移动较快有个延时。是因为得到的坐标x是对的,但是y坐标有是有几个距离的差值,如果你没有这种状态,你把你修改后的code,发给我。 我测试一下你改过的文件。
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-3-28 17:55:32
地板
先明确一个问题,您是想鼠标松开的时候再赋值,还是只要鼠标路过的地方都赋值?
回复 使用道具 举报
zhaozimingT
高级会员   /  发表于:2017-3-28 18:10:30
5#
dexteryao 发表于 2017-3-28 17:55
先明确一个问题,您是想鼠标松开的时候再赋值,还是只要鼠标路过的地方都赋值?

     当鼠标松开的时候再赋值。
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-3-29 09:17:50
6#
鼠标松开时候赋值那就在drop事件里面做啊。这个就只触发一次。还以为你要实现类似画板上刷子的效果,直接把一片都赋值呢。
事件中传递的clientY 并不是鼠标指针的尖端,这个具体误差您可以研究下,我测试值为8 ,减掉就行了。
                        drop.addEventListener("drop", function (e) {       
                                var hitinfo = activeSheet.hitTest(e.clientX, e.clientY - 8);
                                if (hitinfo.hitTestType === GC.Spread.Sheets.SheetArea.viewport) {
                                        activeSheet.setValue(hitinfo.row, hitinfo.col, item);
                                }
                        });

评分

参与人数 1满意度 +5 收起 理由
zhaozimingT + 5

查看全部评分

回复 使用道具 举报
zhaozimingT
高级会员   /  发表于:2017-3-30 10:57:34
7#
  当我只有sheet1的时候,拖拽没有问题我添加了sheet2之后。sheet1和sheet2都不能完成拖拽了。
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-3-30 15:00:27
8#
切换了sheet就要重新获取activesheet了
或者每次拖拽都获取下activesheet

  1.                         drop.addEventListener("drop", function (e) {       
  2.                                 var activeSheet = spread.getActiveSheet();
  3.                                 var hitinfo = activeSheet.hitTest(e.clientX, e.clientY - 8);
  4.                                 if (hitinfo.hitTestType === GC.Spread.Sheets.SheetArea.viewport) {
  5.                                         activeSheet.setValue(hitinfo.row, hitinfo.col, item);
  6.                                 }
  7.                         });
复制代码
回复 使用道具 举报
zhaozimingT
高级会员   /  发表于:2017-3-30 15:48:32
9#
dexteryao 发表于 2017-3-30 15:00
切换了sheet就要重新获取activesheet了
或者每次拖拽都获取下activesheet

没有用的,我用laert()框, drop.addEventListener("dragenter", function (e) {
              count = 0;
         });  在sheet2里面连这个事件都不进,
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-3-30 17:07:32
10#
sheet1,和sheet2 始终都在同一个canvas 中绘制的,不牵扯切换的问题。检查下代码逻辑。我这边测试没有问题的。
  1.                 $(function () {
  2.                         var activeSheet = spread.getActiveSheet();
  3.                         var drop = document.getElementById("ss");
  4.                         var count = 0, item = "item";
  5.                         drop.addEventListener("drop", function (e) {       
  6.                                 var activeSheet = spread.getActiveSheet();
  7.                                 var hitinfo = activeSheet.hitTest(e.clientX, e.clientY - 8);
  8.                                 if (hitinfo.hitTestType === GC.Spread.Sheets.SheetArea.viewport) {
  9.                                         activeSheet.setValue(hitinfo.row, hitinfo.col, item);
  10.                                 }
  11.                         });

  12.                         drop.addEventListener("dragenter", function (e) {
  13.                                 var data = e.dataTransfer.getData("Text");
  14.                                 item = "item" + count++;
  15.                                 //item = $("#" + data).text();
  16.                         });
  17.                         drop.addEventListener("dragleave", function (e) {

  18.                         });
  19.                         drop.addEventListener("dragover", function (e) {
  20.                                 e.preventDefault();
  21.                         });
  22.                 });
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部