0

Web サイト上のすべての電子メール アドレスを 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;
}
4

2 に答える 2

1

forループがゼロから始まり、<=その停止条件に使用するのを見るたびに心配になります。

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

このイディオムにより、最後に定義された要素が通常である場合に、s[0]との両方を非常に簡単に逆参照できます。s[length]s[length-1]

IEのJavaScriptエンジンは、文字列の範囲外の読み取りと書き込みをどのように処理しますか?

于 2011-06-02T21:46:30.170 に答える
1

この問題は ROT-13 デコードとは何の関係もないことがわかりました。

Internet Explorer には、電子メール リンクの「href」属性に関する「バグ」があります。JavaScript を使用して「href」を更新すると、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);
});
于 2011-06-03T05:53:40.233 に答える