Javascript 为什么这个用于排序的下拉列表在Internet Explorer中有效,而在Chrome中无效?
我有一些JavaScript用于dropdownlist,用于在产品清单页面上对结果进行排序。在Internet Explorer中,排序工作正常,浏览器可以完美地处理这一问题。然而,在Chrome中,它每次都会失败(你能相信吗,IE中有些东西可以工作,但Chrome却不行?) 在IE中,当我使用“排序方式”选项时,URL如下所示:Javascript 为什么这个用于排序的下拉列表在Internet Explorer中有效,而在Chrome中无效?,javascript,google-chrome,internet-explorer,razor,Javascript,Google Chrome,Internet Explorer,Razor,我有一些JavaScript用于dropdownlist,用于在产品清单页面上对结果进行排序。在Internet Explorer中,排序工作正常,浏览器可以完美地处理这一问题。然而,在Chrome中,它每次都会失败(你能相信吗,IE中有些东西可以工作,但Chrome却不行?) 在IE中,当我使用“排序方式”选项时,URL如下所示: $("[name=a]").change(function () { window.location = '@(this.Model.Sor
$("[name=a]").change(function () {
window.location = '@(this.Model.SortUri)' + '@Html.Raw(this.Model.SortUri.IndexOf('?') == -1 ? "?" : "&")a=' + this.value;
});
MyExampleSite.com/Supplies/Products/12345/MyProduct/?a=0
但是,当我在Chrome中执行“排序方式”选项时,URL是这样的:
MyExampleSite.com/Supplies/Products/12345/MyProduct/?&;a=0
正如你所看到的,它在URL中添加了amp,如果我一直尝试对其进行排序,那么每次都会添加一个额外的amp
以下是导致我出现问题的JavaScript:
$("[name=a]").change(function () {
window.location = '@(this.Model.SortUri)' + '@(this.Model.SortUri.IndexOf('?') == -1 ? "?" : "&")a=' + this.value;
});
我的解决方案是像这样添加Html.Raw
:
$("[name=a]").change(function () {
window.location = '@(this.Model.SortUri)' + '@Html.Raw(this.Model.SortUri.IndexOf('?') == -1 ? "?" : "&")a=' + this.value;
});
突然间,它在IE和Chrome中运行良好
我的问题是为什么Chrome会这样做而不是IE?您只需要将整个字符串作为Html.Raw的一部分(在外部构建逻辑并直接在此处插入该变量) 请检查这篇文章
好吧,你需要确保你所有的东西都被正确编码,我猜你没有。我们需要查看更多您的页面才能确定这一点。IE可能会检测到你做得不正确,并试图为你修复它,而Chrome不会自动修复你的错误 它变得相当复杂的规则,当你做和不需要逃避的东西。它在一个HTML页面中,每个人都知道您需要转义&在HTML页面中,但它在一个脚本标记中,所以您是否需要转义它?这取决于CDATA元素中是否也有脚本标记 简单的解决办法是避免这样做。将要切换到的URL作为数据标记放在[name=a]元素上,如下所示:
<sometag name='a' data-urlprefix='@(this.Model.SortUri)@(this.Model.SortUri.IndexOf('?') == -1 ? "?" : "&")a='>stuff</sometag>
这还有一个好处,就是将服务器处理的内容移到HTML部分,这样您就可以将javascript放在它自己的文件中,您无论如何都应该这样做
- 请注意,如果这个.value还不是很好,那么您应该使用urlencoding
this.value,所以我已经这样做了。如果已对其进行编码,则可以安全地将其删除。我还将window.location更改为window.location.href,因为window.location有时也会做一些奇怪的事情——在某些浏览器上编码,但在其他浏览器上不编码,等等
&
不属于url编码,它是一个html实体。。。IE接受它的事实与此无关,因为它本来就不应该存在。请尝试将console.log放到this.Model.SortUri上,并确保默认情况下它不包含?
。我修复了这个问题,但我的问题更多的是关于为什么它在IE和Chrome中不使用Html.raw请检查这一点,这里有一个更好的解释@user2624242您可能希望将该外部链接合并到您的答案中并引用相关部分。实际上,我可能会建议将javascript更改为$(document)。on('change','[data urlpefix]',function(){window.location.href=$(this)。data('urlpeffix')+encodeURIComponent(this.value);})
即使在动态加载的UI元素上也能工作,并且不需要包装在$(document).ready中,因为它附加到document元素本身。如果有人在文档真正“准备就绪”之前更改了元素,这很好。