找回密码
 立即注册

QQ登录

只需一步,快速开始

nobt

论坛元老

86

主题

4199

帖子

4951

积分

论坛元老

积分
4951

微信认证勋章

nobt
论坛元老   /  发表于:2023-11-22 10:34  /   查看:1084  /  回复:8
本帖最后由 Richard.Huang 于 2023-11-23 14:00 编辑



产品:SpreadJS
版本:V14



image.png101181029.png


参考:https://gcdn.grapecity.com.cn/showtopic-146524-1-1.html
  1. GC.Spread.Sheets.Designer.wrapper.spread.bind(
  2.   GC.Spread.Sheets.Events.EditEnding,
  3.   function (sender, args) {
  4.     window.globalSelectJson = {};
  5.     if (window.getSelection) {
  6.       //一般浏览器
  7.       var userSelection = window.getSelection();
  8.       var userSelectionx = userSelection.toString();
  9.       // 整个文本
  10.       var text = userSelection.anchorNode.textContent;
  11.       // 起点
  12.       var anchor = userSelection.anchorOffset;
  13.       // 终点
  14.       var focus = userSelection.focusOffset; //extentOffset
  15.       var length = text.length;
  16.       if (anchor > focus) {
  17.         anchor += focus;
  18.         focus = anchor - focus;
  19.         anchor -= focus;
  20.       }
  21.       window.globalSelectJson = {
  22.         text: text,
  23.         anchor: anchor,
  24.         focus: focus,
  25.         length: length,
  26.       };
  27.     }
  28.   }
  29. );
复制代码

问题:这种自动换行里面预期应该拿到单元格所有的文本,现在只拿到了光标所在行的文本,怎么解决?

8 个回复

倒序浏览
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2023-11-22 13:45:53
沙发
您好,只能拿到光标所在行的文本的原因是,您输入的文本中存在换行符(并不是自动换行造成,自动换行是没有换行符的)。而您代码中 userSelection.anchorNode.textContent;的这个textContent属性只返回节点的文本内容,不包括节点中的标记和空格等其他内容。
如果需要获取包含选中文本的整个文本内容,可以通过获取选中文本的起始和结束位置来获得选中文本所在的节点,然后获取该节点的整个文本内容。
// 示例
var userSelection = window.getSelection();
var anchorNode = userSelection.anchorNode;
var focusNode = userSelection.focusNode;

// 判断选中文本是不是在同一个节点中,如果不是,则获取包含选中文本的最组共同的祖先节点
if (anchorNode.parentNode !== focusNode.parentNode) {
  var range = userSelection.getRangeAt(0);
  var commonAncestor = range.commonAncestorContainer;
  wholeText = commonAncestor.textContent;
} else {
  wholeText = anchorNode.parentNode.textContent;
}

console.log(wholeText);

14.0.0版本.html

3.06 KB, 下载次数: 60

回复 使用道具 举报
nobt
论坛元老   /  发表于:2023-11-22 15:57:16
板凳
Richard.Huang 发表于 2023-11-22 13:45
您好,只能拿到光标所在行的文本的原因是,您输入的文本中存在换行符(并不是自动换行造成,自动换行是没有 ...

这个拿全部文本的方式确实拿到了,但是出现了新问题,就是拿全文本后没法对这样的文本在对应的里面加上sub/sup的标签包裹,原来14版本之前你们没做限制的时候,我看实现的方案是这样:
userSelection.anchorNode.replaceData(anchor, focus - anchor, cornermarkstart + s2 + cornermarkend);
activeSheet.setValue(rowindex, columnindex, userSelection.anchorNode.parentElement.innerText);

也就是像你这种先将当前光标行所在的节点加上sub/sup,再把当前整个节点的值放回去

在14.1.3里面现在用这种事件的写法,表现为:方法执行到cornermark后,去拿EditEnding事件中赋值的全局userSelection对象,不是预期的userSelection,userSelection会哪里重置了,麻烦在我这个demo里面复现下,看怎么解决,谢谢



14.0.0版本 -subsup.zip (1.95 KB, 下载次数: 81)
回复 使用道具 举报
nobt
论坛元老   /  发表于:2023-11-22 15:58:28
地板
附件里面是14.1.3版本,异常,需要解决
附件里面改为14.0.0版本,功能正常
回复 使用道具 举报
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2023-11-22 18:45:53
5#
nobt 发表于 2023-11-22 15:58
附件里面是14.1.3版本,异常,需要解决
附件里面改为14.0.0版本,功能正常

我将您的demo进行了修改,能够成功执行,您可以查看一下是否是您需要的功能和实现

14.0.0版本 -subsup.html

5.01 KB, 下载次数: 81

回复 使用道具 举报
nobt
论坛元老   /  发表于:2023-11-22 19:11:05
6#
Richard.Huang 发表于 2023-11-22 18:45
我将您的demo进行了修改,能够成功执行,您可以查看一下是否是您需要的功能和实现

image.png834103698.png
文本:
中国陕西省西安市\n\n西安葡萄城软件技术有限公司\n\n最新<sub>产品活</sub>字格\n\n遥遥领先


image.png261850585.png

文本:
中国陕西省西安市\n\n西安葡萄城软件技术有限公司\n\n最新<sub>产品活</sub>字格\n\n遥遥领<sup>先</sup>





回复 使用道具 举报
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2023-11-23 17:23:11
7#
详细调研了一下windows.getSelection方法对于选中内容的识别和判定,他对于换行等字符的识别存在特殊处理,windows.getSelection如果遇到换行符,那么他对于选定内容偏移量的计算会从新开始,为了解决该问题,咱们需要累加所有偏移量,且对于换行符我们需要按照两个字符长度来计算。最后通过字符拼接的方式实现您的需求。我按照该描述从新做了一个demo,您可以下载后进行测试

14.0.0版本 -subsup.html

4.88 KB, 下载次数: 72

回复 使用道具 举报
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2023-11-30 18:18:19
8#
您好,请问您的问题是否得到解决,如果仍存在相关疑问,欢迎继续跟帖询问
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-12-28 10:13:35
9#
您好,由于本帖较长时间没有回复,本帖先做结贴处理了,后续如您有其他问题,欢迎您开新帖提问。
SpreadJS 17.0.9 | GcExcel 7.1.2 已发布~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部