2017-08-30 9 views
1

私はちょうどASP.NET DevExpress 16.2にアップグレードしましたが、突然ASPxPopupControlは機能しません。 Webページが例外をスローします。ここでArray.prototype.sliceの取得: 'this'はDevExpress ASPxPopupControlのJavaScriptオブジェクトではありません

はコードどこに爆弾です:

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)); 
}); 

それはcanBeActiveElements = canBeActiveElements.concat([].slice.call(elements));ライン上の爆弾。

エラーメッセージは次のとおりです。

Array.prototype.slice:「これは」はサードパーティのUIのアドオンであるので、なぜこれが起こっているJavaScriptオブジェクト

はかなりわからないではありませんオンコンポーネント。

この例外は何を意味し、どのように修正するのですか?

答えて

0

AFAIK getElementsByTagName(tag)は、要素の配列として扱うことができるNodeListを返します。これらは単にホストオブジェクトです。 Array.prototype.sliceは実装に依存していることに注意してください。古いブラウザのバージョン(IE 8以前)have lack support of applying slice for host objects

この問題を回避するには、ホストのsliceが適用オブジェクト、古いブラウザで実行している場合slice.call方法の代わりとしてArray.prototype.push方法を利用するかどうかを決定するためにtry-catchブロックを作成することです:

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); 
     } 
    }); 
} 

NB:上記のJSコードがASPXページ内で使用されている場合(DevExpressによって提供される組み込みJSライブラリの一部ではない場合)、上記の変更が有効になる可能性があります。

参考:

"Array.prototype.slice: 'this' is not a JavaScript object" error in IE8

関連する問題