javascript - 无法访问使用 JavaScript
问题描述
我正在开发一个 JSF 2.2 应用程序并希望使用 JavaScript 更改单选按钮。我正在使用 JavaScript 中的 HTML5 地理定位获取纬度和经度,并希望将它们传递给连接到 Java bean 的 xhtml 页面,以便在提交时将其发送到服务器上的 Java 代码进行处理。
地理位置获取纬度和经度(以度数和度数为单位),我将其转换为度、分和秒,然后使用以下代码将值传递给 JavaScript 中的输入字段:
document.getElementById("lat-deg").value = latDeg;
在 xhtml 代码中插入纬度为
<h:inputText class="coord" id="lat-deg"
validatorMessage="Error: Degrees of latitude must be a number between 0 and 90"
value="#{solarPower.latDeg}">
<f:validateRegex pattern="[0-9]+" />
<f:validateLongRange minimum="0" maximum="90" />
</h:inputText>
同样适用于纬度的分和秒,以及经度的度、分和秒。当单击按钮调用 JavaScript 代码时,这完全可以正常工作。
但是,我想对负纬度(南)和负经度(西)使用单选按钮,但经过多次尝试,我无法让它工作。
在我的 JavaScript 代码中,我有以下内容:
var lat = position.coords.latitude;
var latMinus = false;
if (lat < 0) latMinus = true;
lat = Math.abs(lat);
var latDeg = Math.floor(lat);
// Get also latMin and latSec, then update the <h:inputText ...> fields
if (latMinus) {
document.getElementById("south").checked = true;
} else {
document.getElementById("north").checked = true; // <===
}
代码在显示消息的 Firefox 控制台指示的行处失败:
类型错误:document.getElementById(...) 为空
当它尝试将单选按钮设置为“N”时。在南半球,它会在之前的 document.get... 声明中失败。
对应的xhtml代码为:
<h:selectOneRadio id="lat-radio" value="#{solarPower.latNS}">
<f:selectItem id="north" itemValue="N" itemLabel="N" />
<f:selectItem id="south" itemValue="S" itemLabel="S" />
</h:selectOneRadio>
这对经度重复。
我尝试用这个替换上面的 JavaScript 代码:
if (latMinus) {
document.getElementById("lat-radio").itemValue = "S";
} else {
document.getElementById("lat-radio").itemValue = "N";
}
但它仍然失败,但这一次控制台中没有打印任何内容。
在查看浏览器看到的 html 源代码时,JSF 生成了以下代码
<td>
<input type="radio" checked="checked" name="lat-radio" id="lat-radio:0" value="N" /><label for="lat-radio:0"> N</label></td>
<td>
<input type="radio" name="lat-radio" id="lat-radio:1" value="S" /><label for="lat-radio:1"> S</label></td>
显然它已将 id="lat-radio" 更改为 "lat-radio:0" 和 "lat-radio:1",这可能与我遇到的问题有关。最后,我还尝试在 JavaScript 代码中访问 ids “north”和“south”,但没有成功。
到目前为止,在网上很难找到很多关于如何使用 JavaScript 更改 JSF 单选按钮的信息,并且非常感谢在解决这个问题方面提供的帮助 - 非常感谢。
解决方案
如果您希望能够提交输入值,您可以将输入组件放入表单中:
<h:form id="frmGeo">
<h:panelGroup id="radioNorthVsSouth">
<h:selectOneRadio id="lat-radio">
<f:selectItem itemValue="N" itemLabel="N" />
<f:selectItem itemValue="S" itemLabel="S" />
</h:selectOneRadio>
</h:panelGroup>
</h:form>
客户端都是纯 html ,选择“jsf 单选按钮”就像在纯 html 中选择单选按钮一样。因此,在这种情况下,您可以像这样调整输入:
if (latMinus) {
document.getElementById('frmGeo:radioNorthVsSouth')
.querySelectorAll('input[value=S]')[0].checked=true;
} else {
document.getElementById('frmGeo:radioNorthVsSouth')
.querySelectorAll('input[value=N]')[0].checked=true;
}
或者这个不太冗长但也不太富有表现力的一个:
if (latMinus) {
document.getElementById('frmGeo:lat-radio:1').checked=true;
} else {
document.getElementById('frmGeo:lat-radio:0').checked=true;
}
推荐阅读
- c++ - 修改传递给该函数内部的可变参数函数的参数
- css - CSS 文件中的 Rails 变量
- https - Firefox 不接受 SSL 证书
- ios - 为什么原始视频和使用 GVRVideoView 播放的视频会出现色差?
- vba - 将新邮件主题行更改为附件的名称
- python - Tkinter 从 TopLevel() 小部件修改根窗口
- jquery - 如何以与背景相同的方式转换图像?
- sockets - 如何使套接字在 xamarin 中工作?
- symfony - Doctrine Custom Discriminator 图
- python - Pandas:自定义时间范围内的出现次数和特定日期的最活跃时间