2016-11-09 8 views
0

私は社内開発のためのライブラリコードを書いていますので、これはまったく個人的な満足感です。問題があれば、エラーログにはかなり早くそれが記録され、更新を行うことができます。 。私は、可能な場合は、それらのを避けたいのですが:DDOM型を保証するのにObject.getPrototypeOf(val).toString()は安全ですか?

ライブラリはどちらかdocument.get...document.createElementまたはonmousedownイベントから供給され、渡された<th>または<td>値を操作する必要があります。オブジェクトの間違ったソート(すなわち非th/tdが)機能に入ったとき、私は問題を持っていたので、私は、関数の先頭に失敗アウト条項を入れている:

function doSomething (cell) { 
    var _objName = Object.getPrototypeOf(cell).toString(); 
    if (_objName.indexOf("HTMLTableCellElement") === -1 && 
     _objName.indexOf("HTMLTableHeaderCellElement") === -1) { 
     // log error 
     return false; 
    } 

    // normal work here 
} 

はこれです安全?私たちの会社の中に、現代(IE 10+、クローム)のブラウザをターゲットだし、現時点で動作するようです:(<TH>用)

  • IEは(<TD>について)"[object HTMLTableCellElementPrototype]"を返すか、"[object HTMLTableCellHeaderElementPrototype]"
  • クロームリターンを両方

ため"[object HTMLTableCellElement]"は私が非文書化、実装の詳細に依存することだし、我々は他のブラウザに移動したり、ブラウザが更新されると物事が壊れしようとしていることを心配します。

これは安全ですか、正しく入力するために別の方法を使用する必要がありますか?この入力の中には、ユーザーがクリックしたものから生じるものがあるため、関数に行く無効な入力が間違いなくあります。

答えて

2

正しく入力するために別の方法を使用する必要がありますか?

はい。 toStringを使用すると動作するかもしれませんが、クラス名を確認することは決して良い考えではありません。

代わりに、単純に正しい種類の要素が渡されたかどうかをチェックするために.tagNameを使用します。

if (cell.tagName != "TD" && cell.tagName != "TH") { return false; } 

また、あなたは

if (!cell.matches("td, th")) { return false; } 

のようにDOMセレクタが、クロスブラウザのサポートを使用することができます.matches()についてはそれほど良くありません。

+0

ああ、それは非常に明白です、今私はそれがそこにあることを知っています...ありがとう! –

関連する問題