私が取得しようとしているのは:
document.createElement('div') //=> true
{tagName: 'foobar something'} //=> false
tagName
私自身のスクリプトでは、プロパティとして必要なかったので、これを単に使用していました。
if (!object.tagName) throw ...;
そこで、2 番目のオブジェクトについては、簡単な解決策として次のものを思いつきました。これは、ほぼ機能します。 ;)
問題は、読み取り専用プロパティを適用するブラウザに依存しており、すべてのブラウザがそうするわけではないことです。
function isDOM(obj) {
var tag = obj.tagName;
try {
obj.tagName = ''; // Read-only for DOM, should throw exception
obj.tagName = tag; // Restore for normal objects
return false;
} catch (e) {
return true;
}
}
良い代替品はありますか?
ベストアンサー1
これは興味深いかもしれません:
function isElement(obj) {
try {
//Using W3 DOM2 (works for FF, Opera and Chrome)
return obj instanceof HTMLElement;
}
catch(e){
//Browsers not supporting W3 DOM2 don't have HTMLElement and
//an exception is thrown and we end up here. Testing some
//properties that all elements have (works on IE7)
return (typeof obj==="object") &&
(obj.nodeType===1) && (typeof obj.style === "object") &&
(typeof obj.ownerDocument ==="object");
}
}
それはDOM、レベル2。
更新 2 : これは私が自分のライブラリに実装した方法です: (前のコードは Chrome では動作しませんでした。Node と HTMLElement は期待されるオブジェクトではなく関数だからです。このコードは FF3、IE7、Chrome 1、Opera 9 でテストされています)。
//Returns true if it is a DOM node
function isNode(o){
return (
typeof Node === "object" ? o instanceof Node :
o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName==="string"
);
}
//Returns true if it is a DOM element
function isElement(o){
return (
typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName==="string"
);
}