2017-08-30 70 views
1

我刚刚升级到ASP.NET DevExpress 16.2,突然ASPxPopupControl无法工作。网页引发异常。获取Array.prototype.slice:'this'不是DevExpress的JavaScript对象ASPxPopupControl

下面是代码的地方炸弹:在canBeActiveElements = canBeActiveElements.concat([].slice.call(elements));线

ASPx.GetCanBeActiveElementsInContainer = function(container) { 
var canBeActiveTags = ["INPUT", "A", "UL", "BUTTON", "TEXTAREA", "SELECT", "IFRAME"], 
    canBeActiveElements = []; 
Data.ForEach(canBeActiveTags, function(tag) { 
    var elements = container.getElementsByTagName(tag); 
    canBeActiveElements = canBeActiveElements.concat([].slice.call(elements)); 
}); 

它炸弹。

的错误信息是:

Array.prototype.slice:“这”不是一个JavaScript对象

不太清楚为什么会这样,因为它是一个第三方UI插件在组件上。

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

回答

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