鉴于以下HTML ...
<p>Today is <span data-token="DateTime.DayOfWeek">$$DayOfWeek$$</span>,
</p>
<p>Tomorrow is the next day, etc, etc....</p>
点击$$ DayOfWeek $$返回一个DOM Range对象(通过一个组件,WYSIWIG editor bundled with KendoUI)。
然后我可以像这样访问整个元素......
var element = range.startContainer.parentElement;
console.log(element);
输出......
<span data-token="DateTime.DayOfWeek">$$DayOfWeek$$</span>
我想弄清楚的是如何构造一个由整个Element组成的Range对象,作为Range。
期望的高水平&#39;行为是单击一段文本,让浏览器选择该元素中的所有文本,返回一个Range对象。
很高兴接受jQuery解决方案。
答案 0 :(得分:1)
这是我提出的一种方式,如果我理解正确的话,似乎可以工作,你希望点击周围的元素产生一个包含该元素中所有内容的范围。
没有onclick代码,我假设你可以处理,这里是你描述的DOM范围代码:
var sel=document.getSelection(); //find the node that was clicked
var rng=sel.getRangeAt(); //get a range on that node
//now, extend the start and end range to the whole element:
rng.setStart(rng.startContainer.parentNode.firstChild);
rng.setEndAfter(rng.endContainer.parentNode.lastChild);
//DEMO: verify the correct range using a temp div/alert:
var t=document.createElement("div");
t.appendChild(rng.cloneContents());
alert(t.innerHTML);
答案 1 :(得分:1)
HTML
<p>Today is <span data-token="DateTime.DayOfWeek">$$DayOfWeek$$</span>,</p>
<p>Tomorrow is the next day, etc, etc....</p>
JS
var span = document.querySelector('[data-token]');
span.addEventListener('click', function() {
var sel = window.getSelection();
var range = document.createRange();
sel.removeAllRanges();
range.setStart(span.childNodes[0], 0);
range.setEnd(span.childNodes[0], span.innerText.length);
sel.addRange(range);
});
这是你的小提琴: http://jsfiddle.net/V66zH/2/
它可能不是超级浏览器,但适用于chrome。有关其他地方的一些其他优化,请参阅JavaScript Set Window selection。
还假设只有一个childNode,如示例html
中所示范围(https://developer.mozilla.org/en-US/docs/Web/API/range)和选择(https://developer.mozilla.org/en-US/docs/Web/API/Selection)的其他参考