4

JavaScriptでウィジェット(UWA構文を使用)を作成しようとしています。これはFireFoxで完全に機能しますが、InternetExplorerは奇妙です。

基本的に、ウィジェットを最初にロードしたとき、中央の列は表示されません(その日のDuty Rotaが表示されるはずです)。

デフォルト

ただし、F12キーを押して開発者コンソールに移動すると、ドキュメントモードをに変更IE9 standardsして正しく機能させることができます。

IE9標準モード

次に、ドキュメントモードQuirksに設定すると、次のように表示されます。

クァークズモード

中央の列を定義するコードは次のとおりです。

/* [centre] Duty rota */
AllInOne.centreCol = function() {
    var now = new Date();
    var currentDay = now.getDay();

    var DRWeek1 = {
        Monday : {
            BeforeSchool : "HA, MJO, LS, GB, JSA, HA, TD",
            Breaks : "ABO, LL, RR, DR, PHd, JA, VID, AN, LDE, CN, DW, PG, MD, ND, CK, JP, RH, RJ, CC, GB",
            AfterSchool : "GB, CL, MVW, TD/GDO, HL, LS"
        },
        Tuesday : {
            BeforeSchool : "RJ, AN, AS, GB, JSA, SUW, MJO",
            Breaks : "DW, AB, RR, SDI, PHd, LL, ABO, ND, CG, CC, MD, PD, CT, RY, LDE, SC, RH, JR, RC, GB",
            AfterSchool : "GB, CL, MJO, TD/GDO, SUW, AS"
        },
        Wednesday : {
            BeforeSchool : "JP, JC, SM, GB, HSA, HA, CL",
            Breaks : "BW, JR, TG, SD, PHd, JM, SW, MVW, CG, AMO, MDA, KL, VID, CN, SDI, DST, VY, SLH, JH, GB",
            AfterSchool : "GB, MJO, CL, TD/GDO, HA, SM"
        },
        Thursday : {
            BeforeSchool : "SUW, HL, ST, GB, JSA, HL, CK",
            Breaks : "DR, VY, HL, CK, PHd, JC, DST, HS, SC, MDA, AH, PD, NB, AMO, HSM, DM, JOS, SLH, CK, GB",
            AfterSchool : "GB, JOR, JH, TD/GDO, HL, ST"
        },
        Friday : {
            BeforeSchool : "TG, SUW, JT, GB, JSA, JM, JP",
            Breaks : "SW, AB, HSM, HA, PHd, DM, JOS, CT, KL, BW, RY, PG, JA, NB, RC, HS, JOR, AH, GP, GB",
            AfterSchool : "GB, SWA, JM, TD/GDO, JP, JT"
        }
    }

    var DRHTML = '<h2>Duty Rota</h2>';

    switch ( currentDay ) {
        case 1:
            DRHTML += '<p><strong>Before School:</strong>' + DRWeek1.Monday.BeforeSchool + '</p>';
            DRHTML += '<p><strong>Break / Lunch:</strong>' + DRWeek1.Monday.Breaks + '</p>';
            DRHTML += '<p><strong>After School:</strong>' + DRWeek1.Monday.AfterSchool + '</p>';
            break;
        case 2:
            DRHTML += '<p><strong>Before School:</strong>' + DRWeek1.Tuesday.BeforeSchool + '</p>';
            DRHTML += '<p><strong>Break / Lunch:</strong>' + DRWeek1.Tuesday.Breaks + '</p>';
            DRHTML += '<p><strong>After School:</strong>' + DRWeek1.Tuesday.AfterSchool + '</p>';
            break;
        case 3:
            DRHTML += '<p><strong>Before School:</strong>' + DRWeek1.Wednesday.BeforeSchool + '</p>';
            DRHTML += '<p><strong>Break / Lunch:</strong>' + DRWeek1.Wednesday.Breaks + '</p>';
            DRHTML += '<p><strong>After School:</strong>' + DRWeek1.Wednesday.AfterSchool + '</p>';
            break;
        case 4:
            DRHTML += '<p><strong>Before School:</strong>' + DRWeek1.Thursday.BeforeSchool + '</p>';
            DRHTML += '<p><strong>Break / Lunch:</strong>' + DRWeek1.Thursday.Breaks + '</p>';
            DRHTML += '<p><strong>After School:</strong>' + DRWeek1.Thursday.AfterSchool + '</p>';
            break;
        case 5:
            DRHTML += '<p><strong>Before School:</strong>' + DRWeek1.Friday.BeforeSchool + '</p>';
            DRHTML += '<p><strong>Break / Lunch:</strong>' + DRWeek1.Friday.Breaks + '</p>';
            DRHTML += '<p><strong>After School:</strong>' + DRWeek1.Friday.AfterSchool + '</p>';
            break;
        default:
            DRHTML += '<p>No school. Yay!</p>';
            break;
    }

    var DutyRota = widget.createElement( 'p', 
        { 'id' : 'DR', 'class' : 'DR' } );
    widget.body.getElementsByClassName('centre_col')[0].appendChild(DutyRota);
    widget.body.getElementsByClassName('DR')[0].setHTML(DRHTML);
}

その関数内にInternetExplorerが気に入らないものはありますか?

私は信じられないほど混乱しています、どんな助けでも大歓迎です。


編集:完全なコード

ここで見つけることができます:http://pastebin.com/n1qFeTnU


追加の編集:ウィジェットコンテナがページをIE9の癖モードに強制しているようです。そのため、ドキュメントモードをまったく制御できないことを意味します。

それで、質問は残ります、私のコードでは、IE9(ブラウザモード)Quirks(ドキュメントモード)のInternet Explorerが気に入らないのは何ですか?

4

7 に答える 7

8

Quirks Mode を使用しないでください。IE5.5 と同じようにレンダリングされますが、IE6 よりもさらに悪いです...

このタグをファイルに追加してみてください:

<meta http-equiv="X-UA-Compatible" content="IE=edge" />
于 2012-05-14T16:48:28.387 に答える
2

まず、<?xml version="1.0" encoding="utf-8"?>DOCTYPE の前にある xml 文字列を削除してみてください。XHTML の場合でも、必要ないはずです。doctype の前に何かがあると、quirks モードがトリガーされる可能性があります。W3C の学校は、XHTML doctype も文書の最初の行にすべきだと言っています。

私はあなたのコードを実行したかったので、自分でこれを試すことができましたが、ペーストビンのサンプルには実際のフレームワークが含まれていないため、宣言されていない「ウィジェット」変数に到達するとスクリプトが壊れるため、できません。

編集:上記が機能する場合でも、UTF-8エンコーディングを宣言する必要がある場合は、メタタグを使用してそうすることができることを忘れていました。

最後に、上記が機能せず、互換表示が問題ではないことが確実な場合 (「tools\compatibility view settings」を確認してください)、スタイル シートを削除し、機能コードが適切に機能していることを確認して、これをデバッグしてみてください。 .

私の推測では、あなたのウィジェットはそこにありますが、不十分にレンダリングされた CSS によって隠されています。一部のフロートまたは z オーダー、または表示設定が誤って解釈されている可能性があります。ゆっくりとスタイルを追加し直すことで、うまくいかないことを絞り込むことができ、それを回避することができます。

ここで、すべてのウィジェットが IFRAMES で実行されていることに気付きました。IE では、フレーミング ページが互換モードの場合、IFRAMES は互換モードでレンダリングされます。ウィジェット自体がクワークモードを強制していると言っているので、それが関連しているかどうかはわかりませんが、覚えておく価値があります。

于 2012-05-22T18:52:32.647 に答える
1

後方互換性とクロスブラウザ互換性を維持したい場合、最も簡単な修正 IMO は doctype を HTML5 に設定すること<!DOCTYPE html>です。すべての主要なブラウザーがこれをサポートしており、こちらで確認できるように、これにより IE8 が強制的に標準モードになります。IE8 で Event プロトタイプを拡張するのに苦労しましたが、HTML5 doctype に切り替えるとうまくいきました。通常、IE8 は dom オブジェクトの拡張をあまり好みませんが、これは問題なく機能しました。この忍者の知識を使ってIE8に次に何をさせることができるかはわかりません:)

アップデート:

私はあなたのペーストビンを見て、ただ疑問に思っていました: 両方とも削除しましたか?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:frog="http://fdp.frogtrade.com/ns/">

線?それらを<!DOCTYPE html>?一見すると、これはMSも示唆していることです。ヘッダーが現在どのようになっているのか教えていただけますか? 私は少し興味をそそられたので、この問題を再現しようとします:D

更新 2:

jatrim が指摘したように: IE に関する限り、ウィジェットは iFrame でレンダリングされます。<!DOCTYPE html>その場合、親ドキュメントが quirks モードでレンダリングされている場合、doctype を に設定しても標準モードは強制されません。おそらく、親ドキュメントを に設定するとうまくいくかどうかを確認できます<!DOCTYPE html>

于 2012-05-22T10:38:23.430 に答える
1

最初に確認するのは、互換表示の設定です。たとえば、デフォルトでIE7モードに設定できます。

于 2012-05-22T05:36:54.303 に答える
0

IFRAMEの場合、親ページがIE9標準モードの場合、子ページはこのモードまたは「クァークズモードエミュレーション」モードでのみ使用できることに注意してください。IFRAMEで真のクァークズモードを取得するには、親ページをIE8以前のモードにする必要があります。この場合、子ページをIE9モードにすることはできず、IE8以前のモードでのみ使用できます。

于 2012-05-26T05:58:32.560 に答える
0

IE 9 でのみ導入されたのでgetElementsByClassName、Quirks モードでは使用できないと思います。

つまり、コードの最後に、DutyRota を追加できません。

于 2012-05-24T09:52:14.837 に答える
0

IEがページをWhatever-Modeでどのように表示するかは重要ではないと思います。たとえば、IE9 がデフォルトで Quirks-Mode でページをレンダリングしない場合、なぜそこでバグを修正する必要があるのでしょうか? できるという理由だけで、デフォルトで使用されていないレンダリング モードを IE に強制する人は誰もいません (一部の頭のおかしい人を除く)。

ブラウザを確認する私の方法は次のとおりです。

  • 各 IE バージョンhttp://www.microsoft.com/en-us/download/details.aspx?id=11575の仮想マシンをダウンロードするか、自分で作成します
  • 次のコードを URL としてお気に入りを作成します。

    javascript:(function(){var%20vMode=document.documentMode;var%20rMode='IE5%20Quirks%20Mode';if(vMode==9){rMode='IE9%20Standards%20Mode';}else%20if(vMode==8){rMode='IE8%20Strict%20Mode';}else%20if(vMode==7){rMode='IE7%20Strict%20Mode';}alert('Rendering%20in:%20'+rMode+"\nId: "+vMode);})();
    
  • ページを開き、お気に入りをクリックして上記のコードを実行します
  • ページがどのモードでレンダリングされているかを確認できるメッセージ ボックスが表示されます。

注意してください!このスクリプトは、IE バージョン 6 ~ 9 のみを処理します。IE10 では、ページが Quirks-Mode で表示されるたびに表示される可能性があります。したがって、実際のドキュメント モードを確認できる ID を追加しました :)

あなたのページが (デフォルトで) Quirks-Mode でレンダリングされている場合、新しいブラウザーに含まれている CSS で IE5.5 のレンダリング バグを修正する前に、それを引き起こしているものを検索して取り除きます。

Quirks-Mode の詳細: http://www.quirksmode.org/css/quirksmode.html

于 2012-05-23T06:58:17.683 に答える