CKEDITOR-标识选定的html
我发现了CKEDITOR选择对象的一些有用属性(通过CKEDITOR-标识选定的html,ckeditor,selection,client-side,server-side,offset,Ckeditor,Selection,Client Side,Server Side,Offset,我发现了CKEDITOR选择对象的一些有用属性(通过editor.getSelection()获取): 这将返回所选文本的开始和结束位置,但仅与startContainer(元素)和endContainer(元素)相关。我希望获得相对于整个文档或其他内容的绝对位置,以标识所选html(开始或结束元素的某个实习生id?)。我想在服务器端阅读这些属性,并在那里修改所选的html。是否有某种通用方法可以将所选文本的位置信息从客户端移动到服务器端 非常感谢。如果我理解正确,您希望根据提交/ajax调用期
editor.getSelection()
获取):
这将返回所选文本的开始和结束位置,但仅与startContainer(元素)和endContainer(元素)相关。我希望获得相对于整个文档或其他内容的绝对位置,以标识所选html(开始或结束元素的某个实习生id?)。我想在服务器端阅读这些属性,并在那里修改所选的html。是否有某种通用方法可以将所选文本的位置信息从客户端移动到服务器端
非常感谢。如果我理解正确,您希望根据提交/ajax调用期间光标所在的位置或选择所在的位置来识别服务器端的特定节点或多个节点。您已经知道了获取当前选择的节点的咒语 我建议在提交到服务器之前,手动标记元素。在提交之前,向目标受害者添加自定义属性或类,然后使用该标记标识节点服务器端 例如,
[
是选择的开始,]
是结束,您的数据是:
<p>foo</p><p>[bar</p><p>baz]</p>
foo[barbaz]
在提交之前,获取并用JS标记元素,使其看起来像
<p>foo</p><p class="chosen">bar</p><p class="chosen">baz</p>
foobar
baz
然后,您可以使用任何XML/HTML工具来查找标记为选中的
元素(如果您使用的是C#我建议使用CSQuery)。然后只需移除标记并命令节点执行您的出价。对于多个节点,只需标记多个节点。如果我理解正确,您希望根据光标所在位置或submit/ajax调用期间选择的位置在服务器端标识特定节点或多个节点。您已经知道了获取当前选择的节点的咒语
我建议在提交到服务器之前,手动标记元素。在提交之前,向目标受害者添加自定义属性或类,然后使用该标记标识节点服务器端
例如,[
是选择的开始,]
是结束,您的数据是:
<p>foo</p><p>[bar</p><p>baz]</p>
foo[barbaz]
在提交之前,获取并用JS标记元素,使其看起来像
<p>foo</p><p class="chosen">bar</p><p class="chosen">baz</p>
foobar
baz
然后,您可以使用任何XML/HTML工具来查找标记为选中的元素(如果您使用的是C#我建议使用CSQuery)。然后只需移除标记并命令节点执行您的出价。对于多个节点,只需标记多个节点。该计算强烈违背了CKEDITOR的原则。但我认为,我已经找到了最好的解决方案——它几乎与Nenotlep建议的一样:
var bookmarks = e.getSelection().createBookmarks(true);
var startId = bookmarks[0].startNode;
var endId = bookmarks[0].endNode;
这将插入代码不可见书签(带有id startId和endId的span),然后我可以在服务器端处理它。现在,我必须解决多重选择问题和标签交叉问题。计算强烈违背了CKEDITOR的原则。但我认为,我已经找到了最好的解决方案——它几乎与Nenotlep建议的一样:
var bookmarks = e.getSelection().createBookmarks(true);
var startId = bookmarks[0].startNode;
var endId = bookmarks[0].endNode;
这将插入代码不可见书签(带有id startId和endId的span),然后我可以在服务器端处理它。现在我必须解决多选问题和标签交叉问题。现在我必须解决这个问题:
-如果有人想选择(*=选择边框)此:some te*xt aaa bb*b
…JS将此书签放入:
<b>some te
<span id="cke_bm_69S" style="display: none;"> </span>
xt</b>
aaa
<i>bb
<span id="cke_bm_69S" style="display: none;"> </span>
b</i>
xt
aaa
bb
B
。。。我必须这样做:
<b>some te
</b><span property="..."><b>xt</b>
aaa
<i>bb</i></span><i>b</i>
xt
aaa
bbb
我的解决方案(尚未测试):
选择id为=“cke_bm_69S”的节点,确保标记交叉问题,如果存在一些问题,则使用before()和after()方法插入html。但是我担心,会有临时未关闭的标签,我不知道,如果可以的话。现在我必须解决这个问题:
-如果有人想选择(*=选择边框)此:some te*xt aaa bb*b
…JS将此书签放入:
<b>some te
<span id="cke_bm_69S" style="display: none;"> </span>
xt</b>
aaa
<i>bb
<span id="cke_bm_69S" style="display: none;"> </span>
b</i>
xt
aaa
bb
B
。。。我必须这样做:
<b>some te
</b><span property="..."><b>xt</b>
aaa
<i>bb</i></span><i>b</i>
xt
aaa
bbb
我的解决方案(尚未测试):
选择id为=“cke_bm_69S”的节点,确保标记交叉问题,如果存在一些问题,则使用before()和after()方法插入html。但是我担心,会有临时未关闭的标签,我不知道,如果可以的话。我找到了一个好的、优雅的解决方案:
textselector.js(标记所选内容-将bookmars插入CKEDITOR)
服务器端的操作(识别冲突-标记交叉,必要时修复元素-分为2部分并插入跨度):
我找到了一个好的、优雅的解决方案:
textselector.js(标记所选内容-将bookmars插入CKEDITOR)
服务器端的操作(识别冲突-标记交叉,必要时修复元素-分为2部分并插入跨度):
可能是这样:e.getSelection().getRanges()[0].startContainer.getUniqueId()-但它真的是某种通用属性,我也可以在服务器端读取它吗?或者是这样:e.getSelection().getRanges()[0].startContainer.getAddress()-然后通过DOM XML找到它?可能是这样:e.getSelection().getRanges()[0].startContainer.getUniqueId()-但它真的是某种通用属性吗?我也可以在服务器端读取它?还是这样:e.getSelection().getRanges()[0]。startContainer.getAddress()-然后通过DOM XML找到它?我有这样一个想法-但我认为,这更好:通过e.getSelection().getRanges()[0]计算选择的开始和结束偏移量。startOffset,e.getSelection().getRanges()[0]。endOffset和以前的每个节点长度。如果你能像这样工作,听起来不错