3

私は比較的大きなECMAScriptコードベース(> 60,000 LOC)で作業します。恐ろしい友人のInternet Explorer(特に6と7)のエラーを検出するのに少し苦労する傾向があります。IE-breaking ECMAScript/JavaScriptエラーを見つけよう

現時点では、Google RIAがGoogle Chrome、Firefox 3.6、Opera、Internet Explorer 8でうまくレンダリングされていて、Internet Explorer 8をIE7モードで実行しているときに3日間問題が発生しました(または実際のIE-7を使用して)。

私の質問は本当ですか:IE7でエラーが発生するコードを特定するにはどうすればよいですか?

通常、私はJSLintに頼っていますが、通常の容疑者(後ろのカンマ、私は嫌です)を捕まえる傾向がありますが、この特定のケースでは、ソースコードと最小化コードの両方にリンターを再実行しました。私の通常の容疑者は出てこない。だから私は間違ってIEが好きではないものを導入したと思います(私はどこかでdojo.mapの代わりにArray.mapを使用していたかもしれません)、それは私の顔に爆発し、私はすべて助けてください( "オブジェクトオブジェクト"と "ヌル"であるべきではありませんので、静かに失敗し、このオブジェクトが作成されるのを防ぐエラーアップストリームがあると仮定します)。

私はGoogle Closure Linterを見てみましたが、特別なことはありません.Google Closure Compilerが私の救世主になるとは思いません。あたかもIEをエミュレートしているかのようにコードを解析/実行できるツール(コマンドライン、Webサービス、その他)がありますので、適切なエラーを得ることができますか?

ご了承ください。

編集:これまでのところ私の問題を解決しようとしてくれてありがとう、私が本当に頼んでいるのは、この種のチェックを行うツールがあるかどうかです。つまり、特定のブラウザ。これは私の意見でJSの世界では欠けているものです(FFやChromeではあまり意味がありませんが、明らかにデバッガはもう少し役に立ちます)。

EDIT2:私は最終的に2つのブランチ間でコードの変更をすべて行い、問題は実際には既に存在していたが、以前は検出されずに以前の変更混乱の範囲を狭め、最終的にはすべてのコンソールログを追加することになりました。(重大ではあるものの、動作する...すべての行にログを追加する正規表現のサポートでemacsに感謝しています)。面白い事実:IEは、もともとソースの問題をキャッチし、それを再スローするtry catchブロックに表示されるはずのエラーメッセージを飲み込んだ。それでもそれができないのであれば、それが壊れた場合にその目的のために意図されていたように、それを見つけるのがずっと簡単だったでしょう。奇妙な。深いレベルの再投げが気に入らないかもしれない。

私は質問を開いたままにしておきますが、今のところ実際の質問に対する回答はありません。

+0

IE8の古いIE7モードで実行しているときにデバッグコンソールを開くと、エラーが発生している場所を指すようにエラーチェックボタンがオンになっていますか? – epascarello

+0

JSLintとClosureのコンパイラは、ブラウザのXがYメソッドをサポートしていないよりも、構文上の問題があります。 – epascarello

+0

@epascarello:はい、スローステートメントの1つを指していますが、stacktraceを通過してスローしたものが何かを突き止めていないことを示しています。さらに、このファイルに固有のようではありません。ブートストラップで起動されるファイルの順序を変更すると、最初のどちらかでどこかで失敗します。私はJSLintとClosureがこれをやっていないことを知っていますが、主にブラウザーに依存する主な問題はIE7の末尾のカンマです。許されている他の何もかもを助けません。 – haylem

答えて

2

@galambalazsが示唆しているように、IE8デバッガを試してみることもできます。 IE6時代の古いデバッガは一般的に有用ではありませんでした。

私がいつも使ってきた低レベルのテクニックは、私のJavascriptソースの大部分に自分のtry/catchブロックを追加してエラーの原因を絞り込むことです。 try/catchブロックを繰り返し調整することで、ソースから「バイナリ検索」を実行して、例外を引き起こすコードを見つけることができます。おそらくFirefoxに無害なコードがいくつかあるが、Internet Explorerのインタプリタはエラーを考慮しているだろう。 (公平を期すために、それはだ通常 IEの厳しさが正当化される、とFirefoxのずさんな行動は本当に望ましくないという場合。)だから、他の言葉で、あなたは疑いJavascriptのソースに開始したい

、または多分あなたはあなたの.jsファイル含まれるファイルのすべてにこれを行うだろう:

// top of Javascript source file foo.js 
try { 
    // ... all the code ... 
} catch (x) { alert("Error in foo.js: " + x); } 

を今、あなたはそのアラートをページをロードし、取得した場合は、エラーがfoo.js.のどこかにあることを知っていますしたがって、半分に分割します。

// top of foo.js 
try { 
    // ... half the code, roughly ... 
} 
catch (x) { alert("Error in first half of foo.js: " + x); } 
try { 
    // ... the rest of the code ... 
} catch (x) { alert("Error in second half of foo.js: " + x); } 

このプロセスを繰り返して、問題が見つかることになります。

+0

正直言って、> 60,000行以上のb-tree検索を楽しみにしていません:) – haylem

+0

10回程度の反復で、おそらく問題がどこにあるのか疑わしいでしょう。 – Pointy

+0

'window.onerror'はtry/catchブロックなしであなたを近づけるでしょう。 'window.onerror = function(msg、url、line){alert("行のエラー "+ line); } ' –

0

Microsoft Script DebuggerまたはInternet Explorer Developer Toolsをお試しください。相談して、旧バージョンからIE 8で異なるかもしれないものの完全なリストについては

012を参照してください可能性のある癖についてはです。

最終的に、各行にconsole.logを実行すると、難しい方法で特定のバグを見つけるのに役立ちますが、実際にコードの量を考慮すると、モジュールの単体テストを書くべきです。これは、アプリケーションが異なる入力と条件で実際に実行されることを確認する唯一の方法です。

+0

前述のように、IEによって与えられたメッセージは、そのような場合にはあまり役に立ちません。それらは統合されたデバッガから来て、基本的にオブジェクトが存在しない(どこにあるべきなのか)という理由で報告されます。 – haylem

+0

私の更新を参照してください。私はあなたの問題のMSOTがDOMに関連していると確信しています。 – galambalazs

+0

@galambalazs:RIAのレンダリングのこの段階では、まだブートストラップして依存関係をロードしている間にエラーが発生する可能性は低いです。しかし、それは可能です、私はあなたのリストを見て、あなたに戻ってきます。ありがとう。 – haylem

関連する問題