如何让javascript函数返回选定的数据库条目
我正在创建一个组织的web目录,该目录使用xml数据库显示所选县内的组织如何让javascript函数返回选定的数据库条目,javascript,html,xml,xpath,Javascript,Html,Xml,Xpath,我正在创建一个组织的web目录,该目录使用xml数据库显示所选县内的组织 出于测试目的,我现在只将其设置为显示组织名称和县,但是当我在javascript中有一个县名称标记为//时,这里的主要问题是,返回的是select元素,而不是所选的选项。 所选选项的获取方式如下:选项。selectedOptions[0]和选项。selectedOptions[0]。可以使用innerText获取文本 另一个严重问题是包含选项字符串的XPath查询。字符串被解析为文本,因此它搜索的是“option”,而不是
出于测试目的,我现在只将其设置为显示组织名称和县,但是当我在javascript中有一个县名称标记为//时,这里的主要问题是,
返回的是select元素,而不是所选的选项。
所选选项的获取方式如下:选项。selectedOptions[0]
和选项。selectedOptions[0]。可以使用innerText
获取文本
另一个严重问题是包含选项字符串的XPath查询。字符串被解析为文本,因此它搜索的是“option”,而不是option变量中包含的数据。它应该是这样的:name=“/data/record[county[包含(,“+option+”)]]/name”代码>
假设每个数据/记录条目都是唯一的,您不需要在这些节点上使用while循环,因为您将只有一个结果。我不使用XPath,但我假设如果需要,可以使用while循环来迭代子节点
下面是我未经浏览器检查的DisplayData版本。
因为数据作为一个节点的子节点一起存在,所以我只使用一个查询。这非常理想,因为如果需要传递记录数据,它是自包含的
这里有一个例子
函数显示数据(选项){
var selectedOption=option.selectedOptions[0]。innerText;
var xpath='/data//record[包含(./country,“+selectedOption+”)”);
var result=xml.evaluate(xpath,xml.documentElement,null,XPathResult.FIRST\u ORDERED\u NODE\u TYPE,null);
if(result.singleNodeValue!==null&&result.singleNodeValue.children.length>0){
var el=document.getElementById('results');
el.innerHTML='';
var data=result.singleNodeValue.children;
对于(变量i=0,长度=data.length;i'+数据[i].textContent+'';
}
}
}
我找到了问题的答案
需要更改为
这允许javascript中的选项
变量在更改
name=“/data/record[county[包含(,'Hampshire')]]/name”代码>
到name='/data//record[包含(./country,“+option+”)/name'代码>例如slamborne在其答案中建议的
和它可以跨浏览器工作。感谢您的帮助,您的帮助给了我一些有用的信息,但是我需要这些信息来跨浏览器工作,而且您在plunker中输入的内容在chrome中可以正常工作,但在internet explorer或firefox中则不行。另外,很抱歉我之前没有提到它,但我确实需要一个while循环,因为每个县将有多个组织,xml数据中的网址将需要作为超链接输出,这就是为什么我每次提取一个子节点,而不是一次提取所有子节点的原因。这个想法仍在进行中,输出最终将在每个组织的单独div中
<form>
Select your choice of county:
<select onchange="DisplayData(this)">
<option>---</option>
<option>UK</option>
<option>Hampshire</option>
<option>Surrey</option>
<option>Berkshire</option>
</select>
</form>
<script>
function loadXMLDoc(dname)
{
if (window.XMLHttpRequest)
{
xhttp=new XMLHttpRequest();
}
else
{
xhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xhttp.open("GET",dname,false);
try {xhttp.responseType="msxml-document"} catch(err) {} // Helping IE
xhttp.send("");
return xhttp;
}
var x=loadXMLDoc("data.xml");
var xml=x.responseXML;
function DisplayData(option)
{
name="/data/record[county[contains(., 'Hampshire')]]/name"; //<---------
// name="/data/record[county[contains(., option)]]/name"; DISPLAYS ALL COUNTIES
// name="/data/record[county[contains(., $option)]]/name"; DISPLAYS ALL COUNTIES
county="/data/record[county[contains(., 'Hampshire')]]/county"; //<---------
// code for IE
if (window.ActiveXObject || xhttp.responseType=="msxml-document")
{
xml.setProperty("SelectionLanguage","XPath");
nodes1=xml.selectNodes(name);
nodes2=xml.selectNodes(county);
for (i=0;i<nodes1.length;i++)
{
document.write("<b>Name:</b> " + nodes1[i].childNodes[0].nodeValue);
document.write("<br>");
document.write("<b>County:</b> " + nodes2[i].childNodes[0].nodeValue);
document.write("<br>");
document.write("<br>");
}
}
// code for Chrome, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
var nodes1=xml.evaluate(name, xml, null, XPathResult.ANY_TYPE, null);
var nodes2=xml.evaluate(county, xml, null, XPathResult.ANY_TYPE, null);
var result1=nodes1.iterateNext();
var result2=nodes2.iterateNext();
while (result1)
{
document.write("<b>Name:</b> " + result1.childNodes[0].nodeValue);
document.write("<br>");
document.write("<b>County:</b> " + result2.childNodes[0].nodeValue);
document.write("<br>");
document.write("<br>");
result1=nodes1.iterateNext();
result2=nodes2.iterateNext();
}
}
}
</script>
<?xml version="1.0" encoding="ISO-8859-1"?>
<data>
<record>
<name>Hampshire Organisation</name>
<town>Basingstoke</town>
<county>Hampshire</county>
<tele>01234 567890</tele>
<web>www.hampshireorg.com</web>
</record>
<record>
<name>Surrey Organisation</name>
<town>Woking</town>
<county>Surrey</county>
<tele>01234 567890</tele>
<web>www.surreyorg.com</web>
</record>
<record>
<name>Berkshire Organisation</name>
<town>Reading</town>
<county>Berkshire</county>
<tele>01234 567890</tele>
<web>www.berkshireorg.com</web>
</record>
<record>
<name>Nationwide Organisation</name>
<town>London</town>
<county>UK</county>
<tele>01234 567890</tele>
<web>www.nationwideorg.com</web>
</record>
</data>
function DisplayData(option) {
var selectedOption = option.selectedOptions[0].innerText;
var xpath = '/data//record[contains(./county, "' + selectedOption + '")]';
var result = xml.evaluate(xpath, xml.documentElement, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
if (result.singleNodeValue !== null && result.singleNodeValue.children.length > 0){
var el = document.getElementById('results');
el.innerHTML = '';
var data = result.singleNodeValue.children;
for (var i = 0, length = data.length; i < length; i++){
el.innerHTML += '<li>' + data[i].textContent + '</li>';
}
}
}