Апостроф Escape, когда передающий параметр в onclick событии

Я передаю название компании onclick событию. Некоторые названия компаний имеют апострофы в них. Я добавил '.Replace ("'", "'")' к company_name полю. Это позволяет onclick событию стрелять, но подтвердить индикаторы сообщения как "Jane&# 39; s Welding Company".

<a href="#" onclick="return Actionclick('<%= Url.Action("Activate", new {id = item.company_id}) %>', '<%= Html.Encode(item.company1.company_name.Replace("'", "&#39;")) %>');" class="fg-button fg-button-icon-solo ui-state-default ui-corner-all"><span class="ui-icon ui-icon-refresh"></span></a>

<script type="text/javascript">
function Actionclick(url, companyName) 
{
    if (confirm('This action will activate this company\'s primary company ('+companyName+') and all of its other subsidiaries.  Continue?')) 
    {
        location.href = url;
    };
};

ОТРЕДАКТИРУЙТЕ подтвердить шоу сообщения &# 39; в сообщении, а не '. Когда я ввел его здесь, это заменило &# 39; с a'. Добавленные пробелы так, чтобы не происходил бы. Я хочу знать лучший способ передать его моему onclick событию и также правильно отобразить его в сообщении, не делая нескольких замен (если существует лучший путь).

9
задан RememberME 17 May 2010 в 00:25
поделиться

2 ответа

Есть два варианта, как я это вижу.

  1. Если вы обернете параметры в кавычки (") вместо апострофов/одиночных кавычек ('), то вам не нужно будет экранировать их вообще. HTML-кодировка позаботится о кодировке любых кавычек (если они есть в строке), и апострофы не будут проблемой. Хотя, поскольку javascript уже обернут в кавычки, вам придется экранировать кавычки обратной косой чертой. например:

    onclick="return Actionclick(\"<%= Url.Action("Activate", new {id = item. company_id}) %>\", \"<%= Html.Encode(item.company1.company_name) %>\");"

  2. Зачеркните название компании, так как апостроф нужно экранировать только в конечной строке javascript, а не в HTML. Например:

    onclick="return Actionclick('<%= Url.Action("Activate", new {id = item.company_id}) %>', '<%= Html.Encode(item.company1.company_name. Replace("'", "\\\'")) %>');"

13
ответ дан 4 December 2019 в 13:00
поделиться

У вас есть строковый литерал JavaScript внутри значения атрибута HTML.

Таким образом, вам нужно сначала JS-кодировать значение (заменив ' на \' и \ на \\ ), затем HTML-кодирование. В настоящее время вы кодируете HTML ' (что было бы неэффективно, поскольку браузер декодировал бы его обратно в апостроф до того, как его увидел JS-движок) ... а затем снова кодируете HTML, оставляя его буквально означает '.

Используйте кодировщик JSON, чтобы превратить строку (или любой другой тип значения) в литерал JavaScript.

Однако. Писать JavaScript в строку - отстой. Умение не умеет отслеживать несколько уровней побега. Так что не делай этого.Всегда избегайте встроенных атрибутов обработчика событий. Вместо этого используйте статический сценарий и назначайте обработчики из самого JavaScript, используя ненавязчивые сценарии.

<a class="dangerous fg-button fg-button-icon-solo ui-state-default ui-corner-all"
    href="<%= Server.HTMLEncode(Url.Action("Activate", new {id = item.company_id})) %>"
    title="This action will activate this company's primary company (<%= Server.HTMLEncode(companyName) %>) and all of its other subsidiaries."
>
    <span class="ui-icon ui-icon-refresh"></span>
</a>

(Я буду использовать jQuery, поскольку он у вас есть в ваших тегах :)

<script type="text/javascript">
    $('.dangerous').click(function() {
        return confirm(this.title+' Continue?');
    });
</script>

Однако обратите внимание, что это злоупотребление . Действия, которые делают активное изменение чего-либо, никогда не должны отправляться или допускаться к получению в виде запроса GET. Вместо этого вы должны использовать кнопку, которая отправляет запрос POST (либо непосредственно в форме, либо через AJAX). (Вам также следует рассмотреть возможность использования встроенных элементов управления ASP.NET вместо шаблонов значений, чтобы не вызывать HTMLEncode так часто.)

См. этот классический WTF за один способ, которым это может вас укусить.

2
ответ дан 4 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: