プログラミング: 2015年9月アーカイブ

InternetExplorer(以下 IE)という糞ブラウザも、それを「業務で使用する標準ブラウザ」に選定する情報システム部門も大嫌いだ!・・・と叫びたい夜であります。

今、IE11 を使ったテストをしているんですが、例えば、ラジオボタンの内容が変更されたかどうかのチェックを、初期状態が

<input type="hidden" name="OLD_FLG" value="1">
<input type="radio" name="FLG" value="0">0番
<input type="radio" name="FLG" value="1" checked>1番
<input type="radio" name="FLG" value="2">2番

という FORM で行います。

OLD_FLG に現在の DB の内容 '1' がセットされ、value="1" のラジオボタンが checked な状態になっているわけですな。この HTML は PHP のプログラムで動的に吐き出しています。

この状態で、例えば「2番」にチェックし、submit すると、

if (window.document.form.elements[FLG].value != 
        window.document.form.elements[OLD_FLG].value) {
    <以下略>

みたいな JavaScript が走って、OLD_FLG と FLG の内容が違えば、変更が行われたと判断して別の Function が走ったりするわけですな。

Chrome でも Firefox でも問題なく動いています。
上記のような場合は、window.document.form.elements[FLG].value に '2' が、window.document.form.elements[OLD_FLG].value には '1' がセットされているので、ラジオボタンが更新されたな・・・という判断が出来るというわけです。

ところが、IE11 だけ処理が落ちちゃうんよねえ、途中で。

原因は、上記 JavaScript が走った時点で、window.document.form.elements[FLG].value が undefined だから。

どうも、IE11 では FLG 配列の中のどれが実際に checked な状態になっているかを調べて、その値で比較をしないと駄目なようですな。
具体的には、

var wk_flg = document.form.elements[FLG];
for (var i = 0; i < wk_flg.length; i++) {
    if (wk_flg[i].checked == true) {
        if (wk_flg[i].value == window.document.form.elements[OLD_FLG].value) {
    <以下略>

みたいな面倒くさいことをしなくちゃいけない。

InternetExplorer 信者は「こっちの方が正しい!」とか戯言を言いそうだけど、JavaScript が実行された時、その時点の画面の状態(FORM の入力状態)が有効になっていると考えるのが自然だろう。チェックされている radio ボタンの value 値が「undefined 」というのは不自然やわあ。

「どちらのやり方でもいい」は有りだとしても(実際、Chrome や Firefox はどっちのやり方でもOK)、配列としてひとつひとつ checked になっているかチェックして、その値をそのラジオボタンの選択値とする・・・なんてやり方は無しやで。

ほんま、なんでこんな糞ブラウザを有り難がる輩がいるのか理解に苦しむ。日本の Web プログラマのレベルの低さの現れか・・・

さっさと IE なんか捨て去っちゃえばいいのに、「OS パッケージに最初から含まれている」という理由だけで使っちゃうんだよなあ。
正直、企業内で IE を使い続けているというのは、情報システム部門(担当)の怠慢だと思う。
VB.NET でメールサブジェクトをデコード(Bエンコードされたものだけ)したいんで、こんな感じで組んでみたけど、何か今ひとつだな。

ちなみに前処理で、

Subject: =?UTF-8?B?5pyA5paw44Gu44OK44Kk44Kt44Ki44Kk44OG44Og44KS44K344Or?=
 =?UTF-8?B?44OQ44O844Km44Kj44O844Kv44Gu44GK5L6b44Gr?=

みたいに長いサブジェクトが複数行に渡るものは、

=?UTF-8?B?5pyA5paw44Gu44OK44Kk44Kt44Ki44Kk44OG44Og44KS44K344Or?==?UTF-8?B?44OQ44O844Km44Kj44O844Kv44Gu44GK5L6b44Gr?=

のように、一行のテキストにまとめてある。

で、該当処理をまとめた Function がこれ。

    Private Function decodeMailSubject(ByVal subject As String) As String

        Dim tmp As String = subject
        Dim pattern As New System.Text.RegularExpressions.Regex("^(.*?)(\=+\?.+?\?\=)(.*)$") ' エンコード部分全体にマッチ
        Dim pattern2 As New System.Text.RegularExpressions.Regex("^\=+\?(.+?)\?B\?(.+?)\?\=$", System.Text.RegularExpressions.RegexOptions.IgnoreCase) ' エンコードされた本文部分にマッチ

        subject = String.Empty

        Do Until tmp = String.Empty

            Dim m As System.Text.RegularExpressions.Match = pattern.Match(tmp)

            If m.Success Then ' マッチした

                subject &= m.Groups.Item(1).Value

                ' =?~?=部分の要素分解
                Dim m2 As System.Text.RegularExpressions.Match = pattern2.Match(m.Groups.Item(2).Value)
                If m2.Groups(1).Value <> String.Empty Then
                    ' デコード
                    Dim b() As Byte = System.Convert.FromBase64String(m2.Groups(2).Value)
                    subject &= System.Text.Encoding.GetEncoding(m2.Groups(1).Value).GetString(b)
                Else
                    subject &= m.Groups.Item(2).Value
                End If

                tmp = m.Groups.Item(3).Value

            Else
                ' マッチしなかったらもう終わり
                subject &= tmp
                tmp = String.Empty
            End If

        Loop

        Return subject

    End Function

テスト結果は良好だけど、コードとしての美しさに欠けるな(^^; ま、VB.NET をそんなに使い込んでないから仕方ないか(^^;

是非とも VB.NET マスターの方の「これ、こう書いた方がいいよ」というご指摘・ご指導をお待ちしております(笑)

このアーカイブについて

このページには、2015年9月以降に書かれたブログ記事のうちプログラミングカテゴリに属しているものが含まれています。

前のアーカイブはプログラミング: 2015年5月です。

次のアーカイブはプログラミング: 2015年12月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら