我正在使用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上的这个错误?
谢谢:)
答案 0 :(得分:1)
幕后可能会有更多,但这是我所相信的。
除了IE的旧版本之外,evt.which 是大多数浏览器中按键的标准手表。他们的是 window.event.keyCode 。看起来错误可能是因为IE8不处理event.which所以它是一个空值。这可以在 modernizr 或html5垫片中修补(有些人称之为shiv但是shiv是武器而垫片是用于填补小间隙的物品,因此垫片更简洁)。
仔细检查evt是否在传递给函数之前是否有逻辑绑定到window.event(如果存在),else事件。如果没有,你可以尝试类似我以下的黑客攻击。
var evt = evt || window.event;
在幕后可能会有更多,但如果我不得不下注,这就是问题所在。
答案 1 :(得分:1)
感谢@dasper,我找到了一种方法来解决这个UI Bootstrap文件的帮助:
How to fix Array indexOf() in JavaScript for Internet Explorer browsers
现在看起来像这样:
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和其他浏览器上充当魅力:)