Javascript 在给定文本选择的情况下,查找某个类的前一个元素,而不考虑DOM结构

Javascript 在给定文本选择的情况下,查找某个类的前一个元素,而不考虑DOM结构,javascript,jquery,dom,Javascript,Jquery,Dom,正如在所附的图片中一样,我的目标是选择一个文本,例如在Helvetii中,并找到在选择之前nMarker类的元素中的哪个元素 换句话说,我想在Helvetii中进行选择,并以某种方式找到类nMarker的元素,它的数据标记等于1。 不幸的是,我没有一次机会使用jQuery prevAll、prev、closest等,因为DOM是未知的,所以我无法计算父代、祖先等。因为标记是按照算法放置在若干单词之后的(这是我无法更改的要求) 到目前为止,我所取得的成就是实现这个cose,如果选择在标记所在的同

正如在所附的图片中一样,我的目标是选择一个文本,例如在Helvetii中,并找到在选择之前nMarker类的元素中的哪个元素

换句话说,我想在Helvetii中进行选择,并以某种方式找到类nMarker的元素,它的数据标记等于1。 不幸的是,我没有一次机会使用jQuery prevAll、prev、closest等,因为DOM是未知的,所以我无法计算父代、祖先等。因为标记是按照算法放置在若干单词之后的(这是我无法更改的要求)

到目前为止,我所取得的成就是实现这个cose,如果选择在标记所在的同一个元素中,它就可以工作。但是,正如我所说,我希望解决方案能够在不了解DOM结构的情况下工作

var sel = window.getSelection ? window.getSelection() : document.selection.createRange();
if(sel.getRangeAt){ // thats for FF
var range = sel.getRangeAt(0);
var newNode = document.createElement("span");
newNode.setAttribute('class', 'justSelected');
range.surroundContents(newNode);

$( ".justSelected" ).prevAll(".nMarker").data( "marker" )
} 

使用非jQuery方法,我将其管理为:

var body = $("body").text();
var toFind = window.getSelection().toString();
var strRegEx = '{:(?:(?!{:).)*?'+toFind; 
var res = body.match(strRegEx);
console.log(res);
var regExp = /\{:([^)]+)\:}/;
var matches = regExp.exec(res[0]);
alert(matches[1]);
无论如何,这并不能完全回答这个问题(我想得到数据标记属性),但现在我得到了相同的数字。
但是,只有当选择在整个文本中是唯一的时,这才有效。

在尝试时,给您一些考虑:在检查当前节点后,循环
$(This).parents()
节点,在每个父节点上运行
.find(.nMarker”).last()
,如果找到,则断开,否则继续此标记是否始终与标记的文本处于同一“祖先级别”?我的意思是,示例中标记的文本位于段落中,而您要查找的标记位于兄弟段落中,或者可能位于其他任意位置?像
…标记文本…

…标记文本…

这样的东西也会出现吗?@CBroe不,问题恰恰是这个。标记可能在任何地方。不幸的是,我必须处理非标准ePub,所以它们可以在任何地方,所以是的,它可以发生在你所说的任何地方。下面我发布了一个放弃HTML/jQuery方法的可能答案。但是,只有当选择在html(章节)文件中是唯一的时,它才起作用。我想您应该从这样的内容开始,以获取当前选择所在的元素。一旦找到了标记,就变成了DOM遍历的问题(循环遍历以前的同级,在那里签入,如果没有找到标记,则向上移动到下一个公共父元素,重复该过程…)