Javascript 获取路径/";唯一选择器“;到HTML对象:为什么它不';不行?
我正在尝试获取用户选择的对象的路径。我做了一个代码,但它不能正常工作,我不知道为什么 这是:Javascript 获取路径/";唯一选择器“;到HTML对象:为什么它不';不行?,javascript,html,Javascript,Html,我正在尝试获取用户选择的对象的路径。我做了一个代码,但它不能正常工作,我不知道为什么 这是: var selObj = window.getSelection().anchorNode; //chosen html object var currentCheck = selObj; //element which name is added to path var path = ""; //path to element while (currentCheck.tagName != "BODY"
var selObj = window.getSelection().anchorNode; //chosen html object
var currentCheck = selObj; //element which name is added to path
var path = ""; //path to element
while (currentCheck.tagName != "BODY") {
currentCheck = currentCheck.parentNode;
var addToPath = currentCheck.tagName.toLowerCase();
//class
if (currentCheck.className != "") {
var divideClassNames = currentCheck.className.replace(/( {2,})/, '').replace(/ *$/, '').replace(/^ */, '').replace(/\ /g, '.');
addToPath += "." + divideClassNames;
}
//id
if (currentCheck.id != "") {
addToPath += "#" + currentCheck.id;
}
//nthchild
var i = 0;
var child = currentCheck;
while ((child = child.previousSibling) != null) {
i++;
}
addToPath += ":nth-child(" + i + ")";
if(path !== ""){
path = addToPath + " > " + path;
} else {
path = addToPath;
}
}
您可以复制它,在任何网站上突出显示某些文本,并在浏览器控制台中运行
我强调了其中的前几个词(“家养狗”),我得到的是:
body.mediawiki.ltr.sitedir-ltr.ns-0.ns subject.page Dog.skin vector.action视图:第n个孩子(2)>div.mw-body#content:n个孩子(5)>div.mw-body-content:n个孩子(9)>div.mw-content-ltr#mw内容文本:第n个孩子(7)>p:n个孩子(6)
使用:
$("body.mediawiki.ltr.sitedir-ltr.ns-0.ns-subject.page-Dog.skin-vector.action-view:nth-child(2) > div.mw-body#content:nth-child(5) > div.mw-body-content#bodyContent:nth-child(9) > div.mw-content-ltr#mw-content-text:nth-child(7) > p:nth-child(6)")
在浏览器中,控制台不返回任何元素(浏览器找不到)
在firefox中有一个选项“复制唯一选择器”。我在我想要得到的路径上使用了它,我得到的是:
#mw-content-text > p:nth-child(4)
如您所见,“第n个孩子”(我的脚本返回6,browser-4)有一些问题。我在其他网站上试过:到处都是关于N个孩子的问题
我应该更改什么以使其正常工作?您的问题是文本节点
while ((child = child.previousSibling) != null) {
if (child.nodeType != 3) {
i++;
}
}
在第n个子项的计数中添加一个文本节点,而不需要它。HTML中标记之间的所有空白在dom中创建一个文本节点
更多信息您的问题是文本节点
while ((child = child.previousSibling) != null) {
if (child.nodeType != 3) {
i++;
}
}
在第n个子项的计数中添加一个文本节点,而不需要它。HTML中标记之间的所有空白在dom中创建一个文本节点
更多信息为什么需要获取路径?你想用它做什么?如果您只想找到被选中的元素,而不必担心其路径,那么可以使用onselect事件,请参见:我为问题添加了一个解决方案,但是惟一选择器是一个有趣的话题。如果目标是获取唯一的选择器,请记住可以在第一个ID中停止,因为这是唯一的。如果id不是唯一的,您就不能确定jquery是否会返回正确的id。如果使用:nth clid,也可以删除类元素,因为它是多余的。@31我想将用户高亮显示的文本保存在数据库中,并在用户再次访问此页面时高亮显示。我需要路径来保存所选数据的位置。@RaúlMartín您知道如何在不使用jQuery的情况下获取此路径描述的对象吗?当然可以。document.QuerySelect all为什么需要获取路径?你想用它做什么?如果您只想找到被选中的元素,而不必担心其路径,那么可以使用onselect事件,请参见:我为问题添加了一个解决方案,但是惟一选择器是一个有趣的话题。如果目标是获取唯一的选择器,请记住可以在第一个ID中停止,因为这是唯一的。如果id不是唯一的,您就不能确定jquery是否会返回正确的id。如果使用:nth clid,也可以删除类元素,因为它是多余的。@31我想将用户高亮显示的文本保存在数据库中,并在用户再次访问此页面时高亮显示。我需要路径来保存所选数据的位置。@RaúlMartín您知道如何在不使用jQuery的情况下获取此路径描述的对象吗?当然可以。document.QuerySelect all为什么需要获取路径?你想用它做什么?如果您只想找到被选中的元素,而不必担心其路径,那么可以使用onselect事件,请参见:我为问题添加了一个解决方案,但是惟一选择器是一个有趣的话题。如果目标是获取唯一的选择器,请记住可以在第一个ID中停止,因为这是唯一的。如果id不是唯一的,您就不能确定jquery是否会返回正确的id。如果使用:nth clid,也可以删除类元素,因为它是多余的。@31我想将用户高亮显示的文本保存在数据库中,并在用户再次访问此页面时高亮显示。我需要路径来保存所选数据的位置。@RaúlMartín您知道如何在不使用jQuery的情况下获取此路径描述的对象吗?请确定document.queryselectoral