我刚刚升级到ASP.NET DevExpress 16.2,突然ASPxPopupControl不起作用。该网页引发了异常。
这是炸弹的代码:
AutoUpdate
它在false
行上炸弹。
错误消息是:
Array.prototype.slice:'这个'不是JavaScript对象
不太确定为什么会发生这种情况,因为它是组件上的第三方UI添加。
此异常是什么意思或如何解决此问题?
答案 0 :(得分:0)
AFAIK getElementsByTagName(tag)
返回NodeList
,可以将其视为元素数组 - 它们只是宿主对象。请注意,Array.prototype.slice
取决于实现,一些较旧的浏览器版本(IE 8或更早版本)have lack support of applying slice
for host objects。
此问题的解决方法是创建一个try-catch块,以确定主机对象的slice
是否适用,并在旧浏览器中运行时使用Array.prototype.push
方法替换slice.call
方法:
ASPx.GetCanBeActiveElementsInContainer = function(container) {
var canBeActiveTags = ["INPUT", "A", "UL", "BUTTON", "TEXTAREA", "SELECT", "IFRAME"],
canBeActiveElements = [];
Data.ForEach(canBeActiveTags, function(tag) {
var elements = container.getElementsByTagName(tag);
try {
// this works if running in IE 9+ or newer browsers
canBeActiveElements = canBeActiveElements.concat([].slice.call(elements));
} catch (e) {
// for IE 8 or older browsers
// adapted from /a/13317785
var temp = [];
for (var i = 0; i < elements.length; i++) {
temp.push(elements[i]);
}
canBeActiveElements = canBeActiveElements.concat(temp);
}
});
}
注意:如果上面给出的JS代码在ASPX页面中使用(不是作为DevExpress提供的任何内置JS库的一部分),上述更改可能有效。
参考:
"Array.prototype.slice: 'this' is not a JavaScript object" error in IE8