Javascript 为什么这个用于排序的下拉列表在Internet Explorer中有效,而在Chrome中无效?

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

我有一些JavaScript用于dropdownlist,用于在产品清单页面上对结果进行排序。在Internet Explorer中,排序工作正常,浏览器可以完美地处理这一问题。然而,在Chrome中,它每次都会失败(你能相信吗,IE中有些东西可以工作,但Chrome却不行?)

在IE中,当我使用“排序方式”选项时,URL如下所示:

    $("[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有时也会做一些奇怪的事情——在某些浏览器上编码,但在其他浏览器上不编码,等等

@Html.Raw()是Razor的一部分。这可能与JavaScript的关系不大,而与JavaScript的关系更大。还需要一个更好的标题-这有点让人困惑,因为问题是为什么解决方案在两种浏览器中都能工作。我编辑了它。谢谢你的指点。
&
不属于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元素本身。如果有人在文档真正“准备就绪”之前更改了元素,这很好。