2017-08-30 16 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