嗨,最后我想出了我自己的狡猾的解决方案,任何关于改进它的建议都会非常感激。它利用了一些原型功能:
在 IE5+ 中使用“/HTML/BODY/DIV[9]/DIV[2]”形式的 xpath
函数getXPathElement(xpath,元素){
//Specific to project, here i know that the body element will always have the id "top"
//but otherwise the element that is passed in should be first element in the xpath
//statement eg. /HTML/BODY/DIV the element passed in should be HTML
if(!element){
element = $("top");
var xpathArrayIndex = 3;
} else {
var xpathArrayIndex = 1;
}
//split the xpath statement up
var xpathArray = xpath.split("/");
var carryOn = true;
while(carryOn){
decendents = element.childElements();
//check to see if we are at the end of the xpath statement
if(xpathArrayIndex == xpathArray.length){
return element;
}
//if there is only one decendent make it the next element
if(decendents.size() == 1) {
element = decendents.first();
} else {
//otherwise search the decendents for the next element
element = getXPathElementByIndex(decendents, xpathArray[xpathArrayIndex]);
}
xpathArrayIndex++;
}
}
函数getXPathElementByIndex(后代,xpathSegment){
var decendentsArray = decendents.toArray();
//seperate the index from the element name
var temp = xpathSegment.split("[");
var elementName = temp[0];
//get the index as a number eg. "9]" to 9
var elementIndex = +temp[1].replace("]", "");
//the number of matching elements
var count = 0;
//keeps track of the number of iterations
var i = 0;
while(count != elementIndex) {
//if the decendent's name matches the xpath element name increment the count
if(decendentsArray[i].nodeName == elementName){
count++;
}
i++;
}
var element = decendentsArray[i - 1];
return element;
}
感谢大家的帮助,无论哪种方式,我都对各种 javascript 框架有所了解。