3

我有一段相当复杂的 Javascript,它可以在 Google Chrome、Firefox、Safari 和 Opera 中完美运行,没有错误。然而,由于总是令人讨厌的情况,它在 Internet Explorer 中完全失败。我已经在 IE7 和 IE8 中测试过并且得到了同样的错误:

无效的论点。prototype.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

尝试使用 Microsoft® Visual Web Developer® 2010 Express 进行调试,它是免费的,并且在 IE 上调试时非常易于使用。

于 2010-11-01T18:30:02.427 回答
0

您已经标记了您选择的答案,所以现在可能已经找到了原因。有问题的行涉及设置不透明度(IE 将其作为专有过滤器处理),因此我建议寻找设置不透明度的 setStyle 调用,也许是设置不寻常值的调用。

于 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 回答