获取Array.prototype.slice:'这个'不是DevExpress ASPxPopupControl的JavaScript对象

时间:2017-08-30 18:59:44

标签: javascript devexpress

我刚刚升级到ASP.NET DevExpress 16.2,突然ASPxPopupControl不起作用。该网页引发了异常。

这是炸弹的代码:

AutoUpdate

它在false行上炸弹。

错误消息是:

  

Array.prototype.slice:'这个'不是JavaScript对象

不太确定为什么会发生这种情况,因为它是组件上的第三方UI添加。

此异常是什么意思或如何解决此问题?

1 个答案:

答案 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