2017-01-18 21 views
1

カスタムプロパティでカスタムオブジェクトを使用してHTMLElementインターフェイスを拡張したいと考えています。それも可能ですか?クラスでHTMLElementインターフェイスを拡張する

if (typeof HTMLElement.prototype.classList === "undefined") { 
    HTMLElement.prototype.classList = function ClassList() { return this.className.split(' '); }; 
    HTMLElement.classList.prototype.add = function(name) { 
     if (classList.indexOf(name) !== -1) { 
      return; 
     } 
     classList[classList.length] = name; 
     this.className = classList.join(' '); 
    }; 
    HTMLElement.classList.prototype.remove = function(name) { 
     var index = classList.indexOf(name); 
     if (index !== -1) { 
      this.className = classList.splice(index + 1, 1).join(' '); 
     } 
    } 
} 

は、これはあなたに私が必要なものについて良いアイデアを与える必要があります。

これは私が持っているものです。

IE9用に独自の機能を実装したいと考えています。 IEでは、これが定義されず、エラーが発生します。

これを実装する簡単な方法はありますか?

EDIT

私はしばらくの間、これで周りいじるしてきたが、私の知識が起こっている正確に理解するためにはまだ十分ではありません。私はまだdocument.getElementById('whatever').classList()に電話して "未定義"を避けなければなりません。私は中括弧なしでclassListを呼び出すことができるのが大好きです(ブラウザがclassListをサポートしていない場合)

+0

あなたは 'classlist'をチェックしていますが、' classList'を実装しています。それらは同じではありません。 – Xufox

+0

右...それはちょうどタイプミスだった、元の質問はthoのままです:) – DerpyNerd

答えて

1

ようにそれを設定することができます。 IE9で動作します。

function getClassList() 
{ 
    var element = this; 
    var classList = this.className.split(' '); 
    classList.add = function(name) { 
     if (classList.indexOf(name) !== -1) { 
      return; 
     } 
     classList.push(name); 
     element.className = classList.join(' '); 
    }; 
    classList.remove = function(name) { 
     var index = classList.indexOf(name); 
     if (index !== -1) { 
      classList.splice(index, 1); 
      element.className = classList.join(' '); 
     } 
    }; 
    return classList; 
} 

Object.defineProperty(HTMLElement.prototype, 'classList', { get: getClassList }); 
+0

私が家に帰るときを確認しますが、それ。私は現在作業中です。次のコマンドはIE9で動作するようです: 'Object.defineProperty(HTMLElement.prototype、 'classList'、{value:{}}); ' – DerpyNerd

+0

@RobbieVercammenこれをテストして修正しました。特に 'classList'は配列であるため、プロトタイプ(Array.prototype')に' add'メソッドと 'remove'メソッドを直接追加するのは便利ではありません。しかし、 'classList'(テストされていない)の配列ではなくカスタムオブジェクトを使用する[polyfills](https://github.com/remy/polyfills)があります。 –

+0

あなたの新しい提案をお試しください、ありがとうございます – DerpyNerd

1

私はあなたが間違ったプロトタイプをセットアップしたと思います。

classListにはHTMLElement.prototypeを割り当て、HTMLElementには直接割り当てないでください。それはネイティブに動作するようにそれにアクセスするには

、あなたはObject.definePropertyを使用し、ゲッター(括弧なしで呼び出すことができる機能)を定義するにはそう...

HTMLElement.prototype.classList = function() 
    // ... 
}; 

HTMLElement.prototype.classList.add = function() 
    // ... 
}; 

HTMLElement.prototype.classList.remove = function() 
    // ... 
}; 
+0

あなたは正しいですが、これは問題を解決しません。私は 'document.getElementById( 'whatever').classList()'を呼び出す必要があります。私は、中括弧なしでclassListを呼び出すことができたいです。 – DerpyNerd

+0

@RobbieVercammenプロトタイプではなく、その関数に直接割り当てます。例えば'HTMLElement.prototype.classList.add =/*あなたの関数* /' – alex

+0

私は前にそれを試したと思うかもしれませんが、家に帰るときにあなたの提案を試してみます – DerpyNerd

関連する問題