【问题标题】:OnChange problem with select_tag with '/' and '.' characters in Rails带有 '/' 和 '.' 的 select_tag 的 OnChange 问题Rails 中的字符
【发布时间】:2009-10-04 08:12:44
【问题描述】:
我有一个 select_tag (rails),它用“/”和“。”加载了一个选择值。里面的人物。
select 标记的 onchange 使用连接的 url 和 select 标记的值重定向页面(使用 window.location)。
这些是我试图找出问题所在。
- 调用警报 javascript 以显示串联值。
- 为传递的值添加了 urlencode。
- 将 urlencode 的值硬编码到 windows.location(奇迹般地,它正在工作)。
提前致谢。
【问题讨论】:
标签:
javascript
ruby-on-rails
html-select
【解决方案1】:
没有代码很难说(或者确实是一个实际的问题!),但一般来说,当您从文本值构建 URL 时,您应该在客户端调用 encodeURIComponent,而不是尝试在服务器端对其进行编码.例如。
<select id="foo">
<option value="123./">123./</option>
<option value="456./">456./</option>
</select>
<script type="text/javascript">
document.getElementById('foo').onchange= function() {
var v= this.value;
location.href= 'http://www.example.com/thing?foo='+encodeURIComponent(v);
};
</script>
但是,. 和 / 都不是查询参数中的特殊字符,因此在这种情况下忘记对它们进行编码实际上不会导致问题。如果我们谈论的是 URL 的路径部分,那么 / 是特殊的并且必须被编码:
location.href= 'http://www.example.com/things/'+encodeURIComponent(v)+'/view';
http://www.example.com/things/123.%2F/view
但是,由于各种晦涩和烦人的原因,在 Apache 和 IIS 中,在路径中包含 %2F 往往会很麻烦;最好避免。
无论如何,选择重定向页面的标签都是坏消息,不应该真正使用。除了需要 JS 工作之外,它们很不方便(没有在新选项卡中打开、书签链接等),它们会破坏键盘导航(因为 onchange 会立即触发,因此无法选择其他选项)和它们破坏了后退按钮(因为当您返回页面时,会记住表单值,因此您不能再次切换到同一页面,因为 onchange 不会触发)。
选择导航是一种名誉扫地的技术。今天,您可能会改为尝试点击弹出式<div>,其中包含简单的链接。