3

Google Chrome、Firefox、Safari、および Opera でエラーなく問題なく動作する、かなり複雑な Javascript があります。ただし、常に際限なく煩わしいケースになりがちなため、Internet Explorer では完全に失敗します。IE7 と IE8 でテストしたところ、同じエラーが発生しました。

無効な引数。プロトタイプ.js、2216行目、9文字目

Google でホストされている Prototype 1.6.1 を使用しています。与えられたエラーは、実際のコードでエラーが発生している場所がわからないため、あまり役に立ちません。エラーに記載されている行は、次のコードの下から 6 行目です。

setStyle: function(element, styles) {
    element = $(element);
    var elementStyle = element.style, match;
    if (Object.isString(styles)) {
      element.style.cssText += ';' + styles;
      return styles.include('opacity') ?
        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
    }
    for (var property in styles)
      if (property == 'opacity') element.setOpacity(styles[property]);
      else
        elementStyle[(property == 'float' || property == 'cssFloat') ?
          (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
            property] = styles[property];

    return element;
  },

コードの setStyle ブロックにあるため、一部の要素のスタイル属性を設定しているときにエラーが発生すると想定しています。ただし、このスクリプトで setStyle を 100 回以上呼び出し、エラーが発生している正確な場所を数時間把握しようとしました。エラーが発生している場所を見つけるために自分でできることはありますか?

4

5 に答える 5

4

try ... catchコードの周りに明示的に配置します。

for (var property in styles) {
  try {
    if (property == 'opacity') element.setOpacity(styles[property]);
    else
      elementStyle[(property == 'float' || property == 'cssFloat') ?
        (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
          property] = styles[property];
  }
  catch (_) {
    throw "Error setting property '" + property + "' to value '" + styles[property] + "'";
  }
}

次に、どのプロパティと値が問題を引き起こしているかを正確に知ることができます。

于 2010-11-01T17:45:46.507 に答える
3

IE8 では、開発者ツールがエラーで中断できるようにします [スクリプト タブの 5 番目のボタン] [デバッグの開始]ボタンをクリックします。

エラーが発生した場合、変数を調べて、問題の原因を正確に確認できるはずです。

于 2010-11-01T17:45:33.823 に答える
0

選択した回答には既にマークを付けているため、おそらく原因はすでに見つかっているでしょう。問題の行は不透明度の設定に関するものです (IE は独自のフィルターとして処理します)。

于 2010-11-01T18:51:58.447 に答える
0

問題の原因はsetStyle({someProperty: null}). 多分またundefined、または何かの種類。

今後このような問題を調査するには、catch ブロックでサードパーティ関数に与える引数を調べます。すこし

try{
  element.setStyle({someProperty: someValue})
}catch(error){
  throw('' + someProperty + ':' + someValue)
}

このコードは、ゼロ時間でエラーの原因を指摘していたでしょう。以下は、いくつかの Prototype.js ヘルパーを使用してこのケースをデバッグするためのより詳細なスニペットです。

;(function () {
  var superFunction = Element.setStyle
  Element.addMethods({
    setStyle: function (element, _arguments) {
      try{
        superFunction(element, _arguments)
      }catch(error){
        console.log(error, $H(_arguments).inspect())
      }
    }
  })
})()

PS IE8 では、開発者ツール (F12) を開いてconsole作業する必要があります。

于 2012-10-01T08:47:30.440 に答える
0

Microsoft® Visual Web Developer® 2010 Express でデバッグしてみてください。これは無料で、IE でのデバッグ中に非常に簡単に使用できます。

于 2010-11-01T18:30:02.427 に答える