Почему этот раскрывающийся список для сортировки работает в Internet Explorer, но не в Chrome?

У меня есть JavaScript для раскрывающегося списка для сортировки результатов на странице инвентаризации продукта. В Internet Explorer сортировка работает отлично, и браузер отлично справляется с этим. Однако в Chrome это терпит неудачу каждый раз (можете ли вы в это поверить, что-то работает в IE, но не в Chrome?)

В IE, когда я использую параметр Sort By, URL выглядит следующим образом:

MyExampleSite.com/Supplies/Products/12345/MyProduct/?a=0

Однако, когда я делаю параметр "Сортировать по" в Chrome, вот что выглядит URL:

MyExampleSite.com/Supplies/Products/12345/MyProduct/ &? Амп; а = 0

Как вы можете видеть, он добавляет усилитель в URL-адрес, и если я продолжаю пытаться сортировать его, просто добавляйте дополнительный усилитель каждый раз.

Вот 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?

Ответы

Ответ 1

Ну, вам нужно убедиться, что все ваши материалы закодированы правильно, и я предполагаю, что вы этого не сделали. Нам нужно будет увидеть гораздо больше вашей страницы, чтобы определить это. IE, вероятно, обнаруживает, что вы сделали это неправильно и попытались исправить его для вас, в то время как Chrome не исправляет вашу ошибку.

Это становится довольно сложным в отношении правил того, когда вы это делаете, и не нужно избегать вещей. Это на HTML-странице, и все знают, что вам нужно убежать и на HTML-страницах, но в теге script, так вам или вам не нужно бежать? Ну, это зависит от того, есть ли тэг script в элементе CDATA или нет.

Простое решение - избегать этого. Поместите URL-адрес, который вы хотите переключить, на элемент [name = a] в качестве тега данных, например:

<sometag name='a' data-urlprefix='@(this.Model.SortUri)@(this.Model.SortUri.IndexOf('?') == -1 ? "?" : "&")a='>stuff</sometag>

Затем в вашем javascript:

$("[name=a]").change(function () {
    window.location.href = $(this).data('urlprefix')+encodeURIComponent(this.value);
});

Это также помогает переносить материал обработки сервера только на части HTML, так что вы можете поместить javascript в его собственный файл, который вы все равно должны делать.

  • Обратите внимание, что вы должны быть urlencoding this.value, если это еще не так, поэтому я сделал это. Если он уже закодирован, его можно безопасно удалить. Я также изменил window.location на window.location.href, потому что window.location может иногда делать странные вещи - кодирование в некоторых браузерах, но не на других и т.д.