0

我正在使用 rails app 并运行 bootstrap ui 库。该应用程序在所有浏览器上运行良好,除了 <=IE8 ....

经过一段时间的调查,我发现了产生错误的代码部分:

编译的 application.js :

 u.bind("keydown",function(t){0!==k.matches.length&&-1!==a.indexOf(t.which)&&(t.preventDefault(),40===t.which?(k.activeIdx=(k.activeIdx+1)%k.matches.length,k.$digest()):38===t.which?(k.activeIdx=(k.activeIdx?k.activeIdx:k.matches.length)-1,k.$digest()):13===t.which||9===t.which?k.$apply(function(){k.select(k.activeIdx)

和 UI Bootstrap 模板未编译:

 element.bind('keydown', function (evt) {

    //typeahead is open and an "interesting" key was pressed
    if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) {
      return;
    }

    evt.preventDefault();

    if (evt.which === 40) {
      scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length;
      scope.$digest();

    } else if (evt.which === 38) {
      scope.activeIdx = (scope.activeIdx ? scope.activeIdx : scope.matches.length) - 1;
      scope.$digest();

    } else if (evt.which === 13 || evt.which === 9) {
      scope.$apply(function () {
        scope.select(scope.activeIdx);
      });

    } else if (evt.which === 27) {
      evt.stopPropagation();

      resetMatches();
      scope.$digest();
    }
  });

有谁知道我如何——至少——修复 IE8 上的这个错误?

谢谢 :)

4

2 回答 2

1

幕后可能还有更多,但这是我所相信的。

evt.which是除了 IE 的旧版本之外的大多数浏览器中按键的标准监视。他们是window.event.keyCode。看起来错误可能是因为 IE8 不处理 event.which 所以它是一个空值。这可能会在modernizr或html5 shim 中为您修补(有些人称之为shiv,但shiv 是一种武器,而shim 是用于填补小间隙的物品,因此shim 更简洁)。

仔细检查以查看 evt 在传递给函数之前是否具有逻辑,如果存在则绑定到 window.event,否则绑定到事件。如果没有,你可以尝试像我下面那样破解它。

var evt = evt || window.event;

同样,幕后可能还有更多,但如果我不得不赌钱,这将是问题所在。

于 2013-09-20T15:55:53.117 回答
1

感谢@dasper,我找到了一种通过以下帮助解决此 UI Bootstrap 文件的方法:

如何在 Internet Explorer 浏览器的 JavaScript 中修复数组 indexOf()

现在看起来像这样:

 var keyCode = (window.event) ? evt.keyCode : evt.which;
    var a = jQuery.inArray(keyCode,HOT_KEYS);

    if (scope.matches.length === 0 || a === -1) {
      return;
    }
    .....

并将所有evt.which替换为keyCode var。

作为 IE8 和其他浏览器的魅力 :)

于 2013-09-23T17:24:57.483 回答