2017-02-08 17 views
2

私はcanvas要素が「のgetContext(」WebGLの「)」を呼び出したときに好きな「NULL」の値を返すだろう。..純粋なJavaScriptでネイティブJS関数(キャンバスのgetContext())をオーバーライドするにはどうすればよいですか?

私はWebGLRenderingContextプロトタイプを見つけて、それを更新しようとしましたが、私はそれを見つけることができません。

WebGLRenderingContextおよびWebGLRenderingContextBaseは、prototype.getContextを有しない。

どうすれば 'null'値に戻すことができますか?

私は以下でテストしてみた

..

var test = document.createElement('canvas');` 
test.getContext("webgl");` 

これはWebGLRenderingContextオブジェクトを返します...

は私を助けてください:)ネイティブプロトタイプをいじり

答えて

2

?まあ、私はあなたが何をしているのか知っていると思います。そう、あなたが本当にgetContextプロトタイプメソッドを上書きする場合は、あなたがHTMLCanvasElement.prototype.getContextのための単純なデコレータでこれを達成することができます:だから

HTMLCanvasElement.prototype.getContext = function (orig) { 
    return function(type) { 
    return type !== "webgl" ? orig.apply(this, arguments) : null 
    } 
}(HTMLCanvasElement.prototype.getContext) 

を2D、3Dのような任意のコンテキストのために、それは意志、それが正常に動作しますが、「WebGLの」のためのnullとしてください。あなたがこれを必要とする理由はありません。

+0

ありがとうございました!私はそれを試して失敗しましたが、それは私のクロムバージョンの問題です。お返事ありがとうございます。 –

2

わからないあなたはこれをしたい理由が、あなたはこのようにそれを行うことができます™あなたはあなたがやっている内容を正確に把握仮定:

// store a reference to original vector 
 
HTMLCanvasElement.prototype.__oldGetContext = HTMLCanvasElement.prototype.getContext; 
 

 
// patch 
 
HTMLCanvasElement.prototype.getContext = function(type, options) { 
 
    if (type === "webgl" || type === "experimental-webgl") { 
 
    console.log("WebGL suppressed!");    // remove this in production 
 
    return null; 
 
    } 
 
    else return this.__oldGetContext(type, options); // call original vector 
 
} 
 

 
// test (assuming browser do indeed support *webgl...) 
 
var c = document.createElement("canvas"); 
 
var ctx = c.getContext("webgl") || c.getContext("experimental-webgl"); 
 

 
// works with 2D 
 
var c2 = document.createElement("canvas"); 
 
var ctx2 = c2.getContext("2d"); 
 
console.log("2d?", !!ctx2);

あなたがする必要があります。それが土地になるとprobablySupportsContext()のために同様のことをします。

他のコードがgetContext()コールを使用する前に、これを機能させるための鍵はパッチを当てることです。

自己責任で使用してください!

+0

ありがとうございます。私は実際の実装とその変更方法が不思議です。 –

+0

@ N.hwang主キーは、getContext()を使用するスクリプトの前にこれを実行することです。たとえば、ヘッダーにスクリプトブロックとして貼り付けることができます。 – K3N

+0

@ N.hwangネイティブのブラウザコードでBTWを使用する場合は、ブラウザのソースコードを使用し、コードの場所を見つけ、コードに関連して必要な変更を加え、再コンパイルする必要があります...私はそれを推奨していませんこれがあなたが意図したものである場合に備えて。より良い方法は、ロードするすべてのページの変更を行うブラウザ用のプラグインを作成するか、[greasemonkey](https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/)のようなものを使用することです。 )をFFに入れます。 – K3N

関連する問題