我正在创建一个 epub 图书阅读器。展示这本书后,我想允许用户在书中添加一些注释。
为了显示这本书,我使用了一个加载本地 html 文件的 wpf webbrowser 控件
我想通过创建上下文菜单或显示弹出窗口来操作此控件上的选定文本
我需要使用 javascript 函数获取所选文本的 xpath
var uiWebview_xpath = "";
function uiWebview_storeSelection()
{
if (typeof window.getSelection != 'undefined')
{
var selection = window.getSelection();
var range = selection.getRangeAt(0);//two range, absolute and relative
if (range != null)
{
uiWebview_xpath = makeXPath(range.startContainer) + '|' + range.startOffset + '|' + makeXPath(range.endContainer) + '|' + range.endOffset;
// var x = document.getElementsByName("Hidden1");
// x.value = uiWebview_xpath;
return uiWebview_xpath;
}
}
else if (typeof document.selection != "undefined") {
if (document.selection.type == "Text") {
html = document.selection.createRange().htmlText;
}
return html;
}
}
但我发现我没有使用这个函数的第一部分,我得到的只是第二部分返回的 html,我想为这个 html 创建 xPath
//http://home.arcor.de/martin.honnen/javascript/storingSelection1.html
function nsResolver(prefix){
var ns = {
'mathml' : 'http://www.w3.org/1998/Math/MathML', // for example's sake only
'h' : 'http://www.w3.org/1999/xhtml'
};
return ns[prefix];
}
function makeXPath (node, currentPath) {
/* this should suffice in HTML documents for selectable nodes, XML with namespaces needs more code */
currentPath = currentPath || '';
switch (node.nodeType) {
case 3:
case 4:
return makeXPath(node.parentNode, 'text()[' + (document.evaluate('preceding-sibling::text()', node, nsResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength + 1) + ']');
case 1:
return makeXPath(node.parentNode, node.tagName + '[' + (document.evaluate('preceding-sibling::' + 'h:' + node.tagName, node, nsResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength + 1) + ']' + (currentPath ? '/' + currentPath : ''));
case 9:
return '/' + currentPath;
default:
return '';
}
}
我是编程初学者,我正在寻找指示和帮助,我也想知道 webbrowser 控件的版本是否会影响我得到“document.selection!=”undefined“之间的区别的结果和“window.getSelection!='未定义'”