Сбой декодирования ROT-13 в Internet Explorer - PullRequest
0 голосов
/ 03 июня 2011

Я кодирую все адреса электронной почты на сайте как ROT-13, а затем декодирую адреса с помощью Javascript (чтобы избежать спама).Однако простое декодирование не работает в IE 7 или 8. Прекрасно работает в Chrome, Safari, Firefox.Любые идеи о том, что идет не так?

ОБНОВЛЕНИЕ Ссылка "href" правильно декодируется, и ссылки действительно работают правильно при нажатии.Таким образом, только текст ссылки (содержимое HTML) не может быть декодирован.

Вот код, который я использую:

/***********************************************
DECODE ROT13 EMAIL LINKS
***********************************************/

$('a.email-encoded').each(function() {
    $(this).attr('href', rot13x($(this).attr('href')));
    $(this).html(rot13x($(this).html()));
});

function rot13x(s) {

    var rxi = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    var rxo = 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm5678901234';
    var map = [];
    var buf = '';

    for (z = 0; z < rxi.length; z++) {map[rxi.substr(z, 1)] = rxo.substr(z, 1);}

    for (z = 0; z < s.length; z++) {
        var c = s.charAt(z);
        buf  += (c in map ? map[c] : c);
    }

    return buf;
}

Ответы [ 2 ]

1 голос
/ 03 июня 2011

Оказывается, проблема не имеет ничего общего с декодированием ROT-13.

В Internet Explorer есть «ошибка», связанная с атрибутом ссылок электронной почты «href». Если вы обновите «href» с помощью javascript, IE автоматически обновит текст ссылки, чтобы он соответствовал «href».

Итак, в моем коде сначала правильно был декодирован href, а затем IE установил текст ссылки в соответствии с новым декодированным href. Затем мы декодируем уже декодированный текст ссылки, непреднамеренно кодируя его снова.

Решение заключалось в том, чтобы сначала сохранить декодированный текст ссылки в виде переменной var, а затем использовать его для текста ссылки после завершения декодирования href. Вот так:

$('a.email-encoded').each(function() {
        var oldHref = $(this).attr('href');
        var newHref = rot13x(oldHref);
        var newLink = rot13x($(this).html());
        $(this).attr('href', newHref);
        $(this).html(newLink);
});
1 голос
/ 03 июня 2011

Меня беспокоит всякий раз, когда я вижу for цикл, начинающийся с нуля, и использую <= для его условия остановки:

for (z = 0; z <= s.length; z++) {

Эта идиома позволяет очень просто разыменовать s[0] и s[length], когда последний определенный элемент обычно s[length-1].

Как движок IE в IE обрабатывает за пределами чтения и записи строк?

...