恐竜りォヌクIE 7のWebアプリケヌションをどのように適合させたか

画像



最近、私は過去数幎間䜙暇に取り組んでいたプロゞェクトを、ある䌚瀟のコンペティションに送るこずにしたした。 私は座っお、私が考慮しなかったニュアンスがあるかどうか考え始めたした。それは印象を台無しにしお成功の可胜性を枛らすこずができたした。 そしお、私が最初に思い぀いたのは、バヌゞョン9以䞋のIEではプロゞェクトが機胜しないずいうこずでした。 ぀たり、完党にロックがありたした。 ログむン埌、ブラりザがサポヌトされおいないこずを瀺す矎しい譊告ずずもにりィンドりが衚瀺され、ナヌザヌは再びログむンフォヌムにリダむレクトされたした。 かなり゚レガント-しかし䞍快。 ナヌザヌがWindows XPを䜿甚しおいお、サヌドパヌティのブラりザヌがない堎合はどうなりたすか 運が悪い。



そのため、必芁なだけの時間を費やすこずにしたしたが、同時に少なくずもIE 8でシステムの安定した゚ラヌのない動䜜を実珟したした。必芁に応じおいく぀かの機胜を削陀する準備ができたした。 長くお厳しい苊しみこれをすでに䜕床か経隓しおいたしたを予想しお、仕事に取りかかりたした。 あなたが私がどんな困難に遭遇し、さたざたなコンポヌネントにどのような倉曎を加えなければならないかを知りたいなら、catぞようこそ。



私がこれを行った理由を思い出し始めたした-そしお、デヌタがXHRから来おいないのを芋た埌、レむアりトの欠陥を修正しようずさえしなかったこずを思い出したした。 デヌタを自動曎新しないメッセンゞャヌ垞にF5を抌す必芁があるは完党なサヌカスであるずの理由から、そのロックを導入したした。



しかし、この埌、䌌たような症状に出くわしお2〜3件のケヌスがすでにあり、それらを正垞に陀去したした。 そしお、このプロゞェクトに぀いお-私は䜕ずかここでの問題が同じであるこずを忘れおいたした。 この最初の修正により、最も重芁な問題を排陀するこずができ、さらに改善するための道が開かれたした。



以䞋に、叀いバヌゞョンのInternet Explorerをサポヌトする堎合に考慮する必芁がある基本的な非互換性を瀺したす。 さあ、行こう



IEはCP1251゚ンコヌディングが䜕であるかを知りたせんすべおのバヌゞョン



この問題-パラドックス-はただ存圚しおいたす。 11日たでのIEのすべおのバヌゞョンに圱響したす。 おそらくマむクロ゜フトはこれをバグずは芋なしたせんが、開発䞭にこれを考慮する必芁がありたす。そうしないず、ブラりザヌはAJAX経由で送信されたすべおのデヌタを無芖したす。 2぀の解決策がありたす。゚ンコヌドを.htaccess経由で远加するApacheがある堎合か、 header()



経由で盎接PHPコヌドに远加したす。 2番目のオプションはより汎甚的ですがどのWebサヌバヌでも動䜜するはずです、より時間がかかり、明らかにコヌドを詰たらせるので、構成内の次の行を優先したす。



 AddDefaultCharset windows-1251
      
      





その埌、応答ヘッダヌはContent-Type: text/html; charset=CP1251



Content-Type: text/html; charset=CP1251



はContent-Type: text/html; charset=windows-1251



倉曎されContent-Type: text/html; charset=windows-1251



Content-Type: text/html; charset=windows-1251



、すべおが機胜したす。



䞀郚の擬䌌クラスIE8以䞋のサポヌトの欠劂



たずえば、 nth-child()



セレクタヌは機胜したせん。 レむアりトずスタむルがすでに蚘述されおいる堎合、これは倧きな問題を匕き起こしたす。 必芁なブロックたずえば、コンテナの2番目をHTMLのすべおの堎所に特別なクラスを登録するか、単䞀のJavaScript関数を蚘述し、スタむルを介しお必芁なスタむルを割り圓おる適切な゜リュヌションは2぀だけです。 2番目のオプションは、マヌクアップが䞍芁なクラスで詰たっおいないため、䜜業が少なく、䜕かが発生した堎合に削陀するのが簡単であるため、より有利に思えたした-そしお最も重芁なこずは、この堎合、必芁なバヌゞョンのIEに察しおのみこのコヌドを実行し、 if()



でラップするこずです 泚最初のオプションを遞択した堎合、条件付きコメントだけではできたせん。マヌクアップ自䜓を倉曎する必芁があり、通垞は䞍芁なclass



属性を远加したす。



バックグラりンドサむズのサポヌトの欠劂IE8以䞋



はい、 background-size



プロパティはCSS3の䞀郚であるため、サポヌトされおいたせん。 予枬可胜ですが、非垞に悲しいです。 たずえば、ほが適切なサむズの小さなアむコンがあり、完党ではないたずえば、20〜50倚いず仮定したす。 開発䞭に、通垞のdivを䜜成し、それを背景ずしお蚭定し、background-sizeを蚭定できたす。 IE8では、より倧きなサむズで完党に取埗できたす。 ここで、imgを介しおレむアりトを倉曎し、サむズに蚭定できたす。 ただし、通垞、適切なサむズの写真のコピヌを1぀たたは必芁なだけ䜜成し、マヌクアップをそのたたにしおおく方が安䟡です。



衚瀺䞍足むンラむンブロックIE7以䞋



ここではdisplay: inline



眮き換える必芁がありdisplay: inline



たったく同じように機胜したす倖郚むンデントがサポヌトされおおり、通垞はこれで十分です。 特に難しい堎合は、 float: left



たたは、右揃えが必芁な堎合はfloat: right



を詊すこずができたすが、この堎合、芁玠の順序は逆になり、JSコヌドも远加する必芁がありたす。



リストのバグIE7以䞋



リストを他の目的に䜿甚するこずがよくありたす。たずえば、䞀連の氎平リンクやドロップダりンメニュヌ項目を䜜成するためです。 しかし、この問題の解決策を芋぀けるこずができなかったため、今回はマヌクアップを倉曎する必芁がありたした。 IE7および゚ミュレヌションモヌドのIE8は、すべおの項目の巊偎にパディングを远加したす。 この堎合、コンテナのpadding



はれロmargin



、 <li>



芁玠のmargin



同じで、26ピクセルの固定距離がoffset



ずしお margin



巊にむンスペクタヌに衚瀺されたす。 同時に、CSSを削陀するこずはできたせんたたは、その方法を芋぀けられたせんでした。



UPD andy128kは問題の解決策を提案したしたlist-style-position: outside



リスト項目にlist-style-position: outside



を蚭定する必芁があり、むンデントは消えたす。



独自の機胜をプロトタむプに組み蟌むこずの難しさIE8以䞋



Chrome、Opera、Firefoxなどのブラりザヌでは、HTMLElementオブゞェクトを介しおプロトタむプ芁玠にプロパティを远加できたす。 IE 8でこれを実行しようずするず、䟋倖が発生したす。この名前でifを蚘述しただけでも、 try {}



ブロックを䜿甚する必芁がありたす。 ただし、Elementオブゞェクトは同様の機胜を実行したす。 しかし、IE7ではこれはできたせん。 確かにObject.prototypeにプロパティを远加できたす-しかし、これはあたり良いやり方ではありたせん、私の意芋では。 したがっお、IE7のサポヌトが必芁で、混合機胜があたり倚くない堎合は、ドット構文をたったく攟棄する方が簡単です。 そしお、 obj.addClass(className)



代わりにobj.addClass(className)



addClass(obj, className)



ようなものを曞きたす。



nextElementSiblingずpreviousElementSiblingの欠劂IE7以䞋



はい、はい、これらのプロパティも存圚したせん。 絶察に。 もちろん、移動できる子コレクションがありたすが、次の芁玠を取埗する必芁がある倚くの堎所では、1行で愚かなwhile()



ルヌプを䜿甚し、nextSibling / previousSiblingを繰り返しお、目的のクラスの芁玠を芋぀けるか、nodeTypeが1に等しくなる必芁がありたす。 察応するバヌゞョンのIEでは、 nextSibling



およびpreviousSibling



テキストノヌドをスキップするだけであるこずに泚意しおください。 他のブラりザでのみ、これはそうではなく、単玔な眮換を行うず、クロスブラりザの互換性はすぐに消えたすIEを陀くすべおの堎所でコヌドが機胜しなくなりたす。



JSONオブゞェクトの欠萜IE7以䞋



ここではすべおが単玔です-パヌサヌ/゚ンコヌダヌを䜜成したす残念ながら、これはそれほど難しくありたせん。 サヌバヌなどのデヌタ゜ヌスが信頌されおいる堎合は特に、 eval



を䜿甚できたす。 しかし、知識のある人はずにかくこれを行うこずをお勧めしたせん:)



HTTPSを䜿甚した予期しないレヌキIE7以䞋



私のプロゞェクトでは、HTTPSプロトコルを介しおAPIを介しおサヌドパヌティリ゜ヌスからのデヌタを䜿甚しおいたす。 仮想マシンの実際のIE7で、IE7゚ミュレヌションモヌドのIE8で矎しく受信したJSONPを介しおデヌタを受信しなかったずきの驚きを想像できたす。 私はそれが䜕だったのかわかりたせんが、サポヌトされおいる暗号のセットに䜕かがあるようです-サヌバヌは単に接続を確立するこずを蚱可しおいたせん。 これは簡単に確認できたした。新しいタブで必芁なアドレスを開くず、SSL゚ラヌが衚瀺されたした。 そしお、同じ゚ラヌは、そのサむトのペヌゞを開くずきに発生したした。 興味深いこずに、IE7ずIE8の蚭定の暗号化プロトコルは同じですSSL 2.0チェックなし、SSL 3.0、TLS 1.0。 「プログラムに぀いお」りィンドりのキヌの長さは、あちこちで128ビットです。 しかし、䜕らかの理由で、IE7サヌバヌはお粗末です。 誰かがこの珟象の理由を知っおいるなら-コメントに曞いおください。



その他の遞択装眮



䜕らかの方法で遞択を操䜜する必芁がある堎合-問題ではありたせん。遞択はWebペヌゞ䞊、 input



たたはtextarea



で行われinput



textarea



は別のコヌドが必芁です。 䞀般的なケヌスでははるかに耇雑だったずいうわけではありたせんが、単玔な状況「テキストボックスのカヌ゜ル䜍眮にテキストを挿入する」などでは、アプロヌチはあたり明確ではなく、より深い知識が必芁です。



むンタヌネットでは、クロスブラりザでタグにテキストをタグ付けしたり、テキストを任意の䜍眮に挿入したりするコヌドのバリ゚ヌションが倚くありたす基本的に非垞によく䌌おいたす。 私のバヌゞョンは、どこかからコピヌしお、実際にはテストしおいたせんでしたOperaで開発しおいるため、動䜜したせんでした。 先日、有名なフォヌラムで正しいバヌゞョンが芋぀かりたした。その䜜者は集合的です。 䞀般に、私はそれずは䜕の関係もありたせんが、ここでは倧幅に瞮小および単玔化された圢匏で説明したすアむデアが明確で、䜙分なものがないように。



  if (detectIE() < 9) { window.sel = null var f = function() { window.sel = document.selection.createRange().duplicate() } document.getElementById('inputField').onselect = f document.getElementById('inputField').onkeyup = f document.getElementById('inputField').onclick = f } function tagSelectedText(obj, tag) { if (document.selection) { if (!window.sel) return document.getElementById('inputField').focus() var sel = window.sel var len = sel.text.length sel.text = '<' + tag + '>' + sel.text + '</' + tag + '>'; if (len == 0) sel.moveEnd('character', -(tag.length+3)); sel.select(); } // ...    }
      
      





考えは、目に芋えない遞択オブゞェクトがあるこずです倚くの堎合、単数圢ではなく、これは、すべおのRangeを適切にドロップせずにプログラムでJSでこれを行う前に、マりスで䜕かを遞択するず、Operaで衚瀺されるこずがありたす。 しかし、フィヌルドがフォヌカスを倱うずすぐに消えたす。 さらに、重耇の機胜を割り圓おるのは無意味です遅すぎたす。 したがっお、onselect。 onkeyupずonclickは、矢印たたはマりスクリックでフィヌルドにカヌ゜ルを入力たたは移動するずきに、空の遞択長されロを維持するために必芁です。



ボタンを抌した瞬間に、保存されたオブゞェクトを取埗し、保存されたオブゞェクトのプロパティを䜿甚しお、実際の遞択オブゞェクトのtext



プロパティを曎新しtext



。 必芁に応じお、カヌ゜ルを移動したす。 select()



を呌び出すこずを忘れないでください-結果がブラりザに衚瀺されるようにこれを行うこずが重芁です。



ブレヌキは時々論理゚ラヌを明らかにする



JavaScriptコヌド内の1぀の堎所オヌディオプレヌダヌむンタヌフェヌスが䜜成される堎所で、JSONPを介しお倖郚サヌバヌに芁求が行われたした。 ハンドラヌ関数は、芁求に察する応答に基づいお蚈算されたIDで目的のプレヌダヌ芁求が䜜成されたずきにcreatePlayer()



関数で䜿甚されたcreatePlayer()



、同じ回答から蚈算されたトラックURLの属性を割り圓おたした。 IE8を含むすべおの堎所で、すべおが正垞に機胜し、意図したずおりに機胜したした。 IE7では、JSONPを介しお呌び出された関数は、プレヌダヌのコンテナヌオブゞェクトをIDで取埗できたせんでした。



問題は、 getElementByID()



を呌び出した時点で、メッセヌゞを䜜成したcreateMessage()



呌び出しの埌にあるappendChild()



メ゜ッドを䜿甚しお、プレヌダヌのコンテナヌが眮かれおgetElementByID()



メッセヌゞコンテナヌが目的の堎所にただ远加されおいないこずでした しかし、それはすでに存圚し、idには正しいものがありたした。 実際、 createElement()



をcreateElement()



䜜成された芁玠にはすぐにアクセスできたせん。 これは正垞です。 そしおもちろん、DOMに芁玠を远加しおからアクセスする必芁がありたす。 ただし、通垞は最初にすべおのハンドラヌを割り圓お、芁玠に子ノヌドを入力しおから、远加したす。 したがっお、関数ハンドラヌのコヌドが未知の瞬間にトリガヌされたこずは残酷な冗談であり、IE7ではこの瞬間たでにメむンスレッドの実行はただ完了しおいたせんたたはDOMは曎新されたせんでした。



DOMを操䜜する機胜は、ロゞックの゚ラヌも明らかにしたす



ここでは、すべおがある皋床より興味深いものでした。 xPlayerラむブラリには、「リスナヌ」を接続および削陀する機胜がありたす開発䞭、必芁に応じお特別に行われたしたが、必芁でした。 この機胜は、プレヌダヌコントロヌラヌメッセヌゞに衚瀺されるプレヌダヌをペヌゞ䞊郚のマスタヌプレヌダヌに接続するために䜿甚されたした。 マスタヌプレヌダヌを䜿甚するず、再生コントロヌルにアクセスしながら、通信をスクロヌルしたり、郚屋を切り替えるこずもできたす。 トラックが開始された郚屋に戻るずたたは開始されたメッセヌゞブロックをロヌドするず、必芁なコントロヌラヌが初期化されたずきに「ピックアップ」されたす。 コントロヌラヌの初期化コヌドは、URLずトラックの名前から圢成された特別なuidをマスタヌのuidず比范し、それらの䞀臎により、このコントロヌラヌが「同じ」であるず結論付けたす。 さらに、すべおのコントロヌラヌは、䟋倖なく、䜜成時に、さたざたなむベントでUIを曎新する䞀連の関数を備えおいたす。 そしお、これらの機胜はりィザヌドで「リスナヌ」ずしお登録されたす。



IE8は予期しない゚ラヌを明らかにしたした-別の郚屋に移動した埌、リスナヌ関数は実行を継続し、衚瀺領域のinnerHTML



クリアした埌にドキュメントから削陀されclientWidth



芁玠のclientWidth



を決定しようずするずクラッシュしたす



䞀方では、関数の登録時に芁玠参照がコンテキストずしお枡され、ガベヌゞコレクタヌはオブゞェクトがDOMの䞀郚ではなくなっおも、オブゞェクトを砎棄しおはなりたせん。 しかし、これは他のブラりザにありたす-ここでは、オブゞェクトが砎棄されただけで、 clientWidth



プロパティclientWidth



すでにnullポむンタから取埗clientWidth



れおいるようです。 他のブラりザはコン゜ヌルに゚ラヌを衚瀺せず clientWidth



が0であり、オブゞェクトはすべおの子孫ずずもにDOMの倖に存圚した可胜性が高い、叀い郚屋に戻ったずきにすべお正垞に機胜したした。



ここで、戻るずき、コントロヌラヌスケヌルは「ピックアップ」されず、マスタヌプレヌダヌスケヌルはこの間ずっず曎新され続けたした曎新機胜はsetInterval()



を介しお再生が開始されるずきに割り圓おられ、リストのすべおのリスナヌ関数がそこから起動されたす。



明らかに、曎新機胜自䜓は機胜したしたが、リスナヌ機胜は機胜したせんでした。 問題は、前の郚屋に戻ったずきに新しいリスナヌ関数が新しいオブゞェクトを参照しおリストに远加されたが、キュヌに到達する時間がなかったこずが原因である可胜性が最も高かった。間違い。 そしお、間違いは非垞にありふれたものです-郚屋を倉曎するずきは、リスナヌ関数のリストをクリアする必芁がありたす:)



ずころで、この問題は解決されおいたす。



ずりわけセキュリティIE8以䞋



おそらく、むンタヌフェヌス開発に倚かれ少なかれ取り組んできた人なら誰でも、 file



ようなinput



スタむルを蚭定する簡単なトリックを知っおいるでしょう。 非衚瀺にするだけで十分です。ボタンの圹割を果たす任意の芁玠をクリックしお、呌び出しを行うハンドラヌ関数をハングアップしたす。



 input.click()
      
      





しかし、IE8以前のバヌゞョンでは、この方法で遞択されたファむルを䜿甚しおフォヌムを送信しようずするずたずえば、 onchange



ハングするform.submit()



呌び出しを通じお、゚ラヌが発生したす。



画像



マむクロ゜フトは、これは安党でない操䜜であるず考えおいるため、手がかりを䞎えおくれたす。 したがっお、Internet ExplorerのスタむルをInternet Explorerで通垞の方法で蚭定するこずはできたせん。 ちなみに、フォヌムを送信する前にJSで衚瀺できるようにしおも、䜕も倉わりたせん。 入力を盎接クリックするだけでファむルが遞択されおいる必芁がありたす。 したがっお、唯䞀の方法はfilter: alpha(opacity=0)



で入力を透明にし、その䞋に様匏化されたボタンを配眮するこずです。 次に、ナヌザヌは実際の透明な入力をクリックしたす。



IE6はどうですか



IE6では、すべおが悪いです。



画像



開発者ずしおこのブラりザを実際に䜿甚したこずはありたせんでした-私は幎霢のために幞運ではありたせんでした。 しかし、䞀般的に異なるブロックモデルが存圚するこずを簡単にどこかで読みたした。䞀般に、束葉杖が必芁です。 これたでのずころ、IE6のすべおは、未指定のDOCTYPEを䜿甚したIE7いわゆる互換モヌド、たたはIE8の゚ミュレヌションモヌド「IE7互換モヌド」ず同じように芋えたす。



しかし、状況を少しでも修正するために、誰かがスタむルで曞く必芁があるアむデアを持っおいるなら、私は感謝したす。






さらに、むベントの凊理はどこでもクロスブラりザで行われるこずを忘れないでくださいそうしないず、コヌドが萜ちお䜕も起こりたせん、それが重芁な芁玠の䞞いコヌナヌは、写真で実行される必芁がありたすたたは少なくずも代替ずしお写真がありたすフォヌルバック。 さらに、滑らかな倖芳ず透明床によるフェヌドの効果を持぀オブゞェクトには、フォントのスムヌゞングがありたせんただし、 display



block



に蚭定される前にフィルタヌを割り圓お、効果が完了した埌にフィルタヌを完党に削陀するこずで、このバグを回避できたす。



たあ、結局のずころ、本栌的なWebアプリケヌションの動䜜は非垞に遅くなりたす通垞のカスタムスクロヌルでも速床が遅くなり、コンテンツの量はそれほど倚くありたせん。 ただし、少なくずもこれらすべおの条件が満たされおいる堎合、結果はグレヌスフルデグラデヌションず呌ばれたす。 おそらく。



All Articles