我现在正在制作一个小脚本,主函数的 arg 的输入之一是一个元素。为了确保原始 JS 适用于这些东西,我正在做这些事情theelement.value
来获取变量的值。不幸的是,如果thelement
是一个 jquery 函数,例如$('#foo')
. 我需要这种兼容性的其他一些原因是我需要访问theelement.style
jquery 不支持的东西。我知道这些(等)有 jquery 解决方法,.css(), .val()
但如果我使用这些,那么常规的 js 输入(document.getElementbyId('foo')
)将不起作用。有没有办法使用一个“属性”并使其对元素的所有输入都通用(包括来自原型和 Dojo 等库的东西)?
2 回答
不,不可能使所有东西都通用。
如果你想处理 DOM 元素,输入需要是 DOM 元素,并且框架都有办法取出 DOM 元素。你不能神奇地制作一个可以与任何库一起工作的脚本,这就是为什么通用插件通常具有库特定的扩展来添加支持。
在我看来,您有一个带有参数的函数,并且在将不同类型作为该参数传递时遇到了问题:
function doSomething(element) {
// do something with element
}
您提到您希望元素有时是一个 jQuery 对象,有时只是一个 DOM 对象,然后您还提到了其他库(原型、Dojo)。
首先,如果您只是使用一致的类型调用您的函数,您的问题将完全消失。所有库中都可用的最简单的类型是 DOM 元素。因此,如果您只是强制将该元素作为 DOM 对象引用而不是 jQuery 对象或任何其他库对象传递,那么您的问题将完全消失。如果调用者正在使用其他库,然后想要调用您的函数,他们总是可以从该库中获取 DOM 对象并传递实际的 DOM 对象。例如,在 jQuery 中,您可以像这样获取 DOM 对象 `$("#foo").get(0)
如果你想让它更通用并接受多种类型,那么你必须编写代码来检测可能传递的每种类型,并从每种类型中获取 DOM 对象,这样你就可以对它们进行相同的处理。例如,如果你想检测 DOM 对象的 jQuery 对象,你可以这样做:
function doSomething(element) {
// normalize element to be just a DOM object
// if it's a jQuery object, then reach in to get the first DOM object
if (element.jquery) {
element = element.get(0);
}
// do something with element here which is a DOM object
}
如果您也想检测其他库中的对象,那么您必须为每个其他库编写类似的检测代码,并从其他库的对象中获取实际的 DOM 对象。