Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取准确的浏览器渲染文本(RTL和LTR方向混合)_Javascript_Html_Right To Left_Bidi - Fatal编程技术网

Javascript 获取准确的浏览器渲染文本(RTL和LTR方向混合)

Javascript 获取准确的浏览器渲染文本(RTL和LTR方向混合),javascript,html,right-to-left,bidi,Javascript,Html,Right To Left,Bidi,是否有办法通过浏览器检索实际渲染的文本(在从右到左文本方向的上下文中) 你好(世界) 你好(世界) 将呈现: 含铬 在firefox中 但两者都有 document.getElementById('ok')。textContent==document.getElementById('ko')。textContent 及 document.getElementById('ok')。innerText==document.getElementById('ko')。innerText为

是否有办法通过浏览器检索实际渲染的文本(在从右到左文本方向的上下文中)


你好(世界)

你好(世界)

将呈现:

  • 含铬

  • 在firefox中

但两者都有
document.getElementById('ok')。textContent==document.getElementById('ko')。textContent
document.getElementById('ok')。innerText==document.getElementById('ko')。innerText
true
(对于两种浏览器)

有没有办法获取网页中显示的实际文本


有一个
方向
CSS属性,您可以从中获取,例如
getComputedStyle(elem)
,但这只是在元素级别,因此您无法确切知道浏览器是如何呈现textNodes的

因此,您需要做的是:

  • 首先从容器中抓取所有textNodes(最好使用一个)
  • 使用
  • 通过范围的方法获取每个角色的当前位置
  • 分类
  • 获取它们的文本值
这是一个现场演示:

函数getDisplayedText(容器){
var r=document.createRange();//获取节点位置
var nodes=[];//首先获取所有节点
var treeWalker=document.createTreeWalker(容器,NodeFilter.SHOW_TEXT,null,false);
while(treeWalker.nextNode())nodes.push(treeWalker.currentNode);
var chars=[];//然后获取其包含的所有字符
nodes.forEach(n=>{
n、 data.split(“”).forEach((c,i)=>{
r、 setStart(n,i);//将范围移动到此字符
r、 设定值(n,i+1);
推({
案文:c,
rect:r.getBoundingClientRect()//保存范围的DOMRect
})
})
});
return chars.filter(c=>c.rect.height)//只保留显示的字符(即没有脚本文本内容)
.sort((a,b)=>{//sort ttb ltr
if(a.rect.top==b.rect.top){
返回a.rect.left-b.rect.left;
}
返回a.rect.top-b.rect.top;
})
.map(n=>n.text)
.加入(“”);
}
log('ko:',getDisplayedText(ko));
log('ok:',getDisplayedText(ok))

你好(世界)

你好(世界)


有一个
方向
CSS属性,您可以从中获取,例如
getComputedStyle(elem)
,但这只是在元素级别,因此您无法确切知道浏览器是如何呈现textNodes的

因此,您需要做的是:

  • 首先从容器中抓取所有textNodes(最好使用一个)
  • 使用
  • 通过范围的方法获取每个角色的当前位置
  • 分类
  • 获取它们的文本值
这是一个现场演示:

函数getDisplayedText(容器){
var r=document.createRange();//获取节点位置
var nodes=[];//首先获取所有节点
var treeWalker=document.createTreeWalker(容器,NodeFilter.SHOW_TEXT,null,false);
while(treeWalker.nextNode())nodes.push(treeWalker.currentNode);
var chars=[];//然后获取其包含的所有字符
nodes.forEach(n=>{
n、 data.split(“”).forEach((c,i)=>{
r、 setStart(n,i);//将范围移动到此字符
r、 设定值(n,i+1);
推({
案文:c,
rect:r.getBoundingClientRect()//保存范围的DOMRect
})
})
});
return chars.filter(c=>c.rect.height)//只保留显示的字符(即没有脚本文本内容)
.sort((a,b)=>{//sort ttb ltr
if(a.rect.top==b.rect.top){
返回a.rect.left-b.rect.left;
}
返回a.rect.top-b.rect.top;
})
.map(n=>n.text)
.加入(“”);
}
log('ko:',getDisplayedText(ko));
log('ok:',getDisplayedText(ok))

你好(世界)

你好(世界)

<html dir="rtl">
<body>
  <p id='ko'>Hello (world)</p>
  <p id='ok'>Hello <bdo dir='ltr'>(world)</bdo></p>
</body>
</html>