Object.getPrototypeOf(val).toString()是否可以安全地确保DOM类型?

时间:2016-11-09 10:51:48

标签: javascript html

我正在为我公司的内部开发编写一段库代码,所以这纯粹是一个个人满意的问题 - 如果有问题,我们的错误记录会很快记录下来,我们将能够进行更新。 ..如果可能,我只想避免这些:D

图书馆需要对传入的<th><td>值进行操作,这些值来自document.get...document.createElementonmousedown个事件。当错误的对象(即非th / td)进入函数时,我遇到了问题,因此我在函数的顶部放置了一个失败的子句: / p>

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+,Chrome)浏览器,它现在似乎有效:

  • IE返回"[object HTMLTableCellElementPrototype]"(适用于<TD>)或"[object HTMLTableCellHeaderElementPrototype]"(适用于<TH>
  • Chrome会同时返回"[object HTMLTableCellElement]"

我担心我依赖于未记录的实施细节,当我们转移到其他浏览器或浏览器时,事情就会破裂。

这是安全的,还是应该使用其他方法来确保输入正确?一些输入将来自用户点击的内容,因此肯定会有无效的输入进入该功能...

1 个答案:

答案 0 :(得分:2)

  

我应该使用其他方法来确保输入正确吗?

是。使用toString可能会有效,但检查类名永远不是一个好主意。

相反,只需使用.tagName来检查是否传递了正确类型的元素:

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

或者,您可以使用

中的DOM选择器
if (!cell.matches("td, th")) { return false; }

但是对.matches()的跨浏览器支持并不是那么好。