为什么从位置哈希中选择下拉列表在 Chrome 上有效,但不适用于 Firefox、IE 或 Safari
Why does dropdown list selection from a location hash work on Chrome, but not Firefox, IE, or Safari?
完整的JS新手。我想要一个"请求报价"按钮,以根据产品和网址在新页面上自动填充下拉菜单。 每个产品报价按钮都链接到相同的表单,但在 url 中具有不同的哈希值,该哈希值与下拉菜单中的选项匹配。
例:
-
用户点击"产品A"的"请求报价"
-
用户被发送到
www.example.com/request-a-quote/#Product A
-
表单上的产品下拉菜单(
id=product-select
)已显示"产品A"
此代码适用于 Chrome,但不适用于其他任何代码。我做错了什么?
//Get select object
var objSelect = document.getElementById("product-select");
var val = window.location.hash.substr(1);
//Set selected
setSelectedValue(objSelect, val)
function setSelectedValue(selectObj, valueToSet) {
for (var i = 0; i < selectObj.options.length; i++) {
if (selectObj.options[i].text== valueToSet) {
selectObj.options[i].selected = true;
return;
}
}
}
我发现应用decodeURIComponent()清理了我的val变量。
此外,将链接构建为 www.example.com/request-a-quote/#Product A 也很重要。 如果正斜杠不在哈希之前,移动 Safari 将忽略哈希之后的所有内容,并且它不起作用。
以下是我的最终解决方案:
//Get select object
var objSelect = document.getElementById("product-select");
var val = decodeURIComponent(window.location.hash.substr(1));
//Set selected
setSelectedValue(objSelect, val)
function setSelectedValue(selectObj, valueToSet) {
for (var i = 0; i < selectObj.options.length; i++) {
if (selectObj.options[i].text== valueToSet) {
selectObj.options[i].selected = true;
return;
}
}
}
没有看到更多代码....选项标签正式支持值属性与文本,文本是用户可读的名称。 我们使用价值作为标识符:
selectObj.options[i].value == valueToSelect;
您还需要更改 select.options 标记以使用 value 属性而不是文本。
根据要求更新更多信息:
text
的目的是提供用户可读的选项。 我们使用value
来识别服务器的选择,在您的情况下是URL哈希。 通过使用 value
属性,可以使用 URL 安全值和用户可读文本。
您在答案中发布的修复程序确实是不好的做法,随着代码复杂性的增加,它们会变得有问题。
此示例适用于所有浏览器,并且是正确的实现方式。
//Simulate hash
window.location.hash = '2'
var val = window.location.hash.substr(1);
var selectEle = document.getElementById('select')
setSelectedValue(selectEle, val)
function setSelectedValue(selectObj, valueToSet) {
for (var i = 0; i < selectObj.options.length; i++) {
var selection = selectObj.options[i]
if (selection.value == valueToSet) {
selection.selected = true;
}
}
}
<select name="selections" id="select">
<option value="1">Product A</option>
<option value="2">Product B</option>
<option value="3">Product C</option>
</select>
相关文章:
- HTML5 Canvas toDataURL(“image/png”)适用于一些绘画,而有些则不然,不确定原因
- JavaScript不显示剩余字符,但适用于其他页面
- 我如何完善这个Javascript代码,使其只适用于来自图像的链接(而不是来自文本的链接)
- 为什么这只适用于身体部分而不是头部
- 为什么不't此正则表达式适用于重复出现的对
- document.getElementById 对内部 html 的调用适用于 $_POST 和 $_GET 变量,但不
- JavaScript 位置适用于本地主机而不是服务器
- Rally App SDK 2.0:Rallymultiobjectpicker,适用于不显示displayField的
- jQuery事件在Mozilla上不起作用,并且适用于其他浏览器
- Angular.js - 控制器不为索引执行,适用于其余模板
- D3 .on 更改适用于文本而不是图表
- Zillow 数据 - json_encode不起作用 - 适用于常规变量
- 弹出模式仅适用于表格中的第一个元素,第二次单击后不会再次打开
- Phonegap Android项目适用于模拟器,而不是实际的手机
- ajax jonp 不应该适用于 请求的上不存在“访问控制-允许源”标头
- AngularJS:ng-单击不起作用,适用于<按钮>
- Javascript不会在移动设备上加载.适用于桌面
- 为什么我的代码适用于高度:100px,而不是高度:100%
- 拖放区.js + Laravel-多文件上传不起作用(仅适用于一个文件)
- 哪些限制适用于不透明响应