jQuery / JavaScript,为什么我需要在$()中包装变量才能使用它们?

时间:2014-11-07 11:42:24

标签: javascript jquery

假设我有一个元素数组的地图。回调函数获取数组中该位置的索引和值。

如果我在$()中包装回调接收的数组元素,它的行为与我期望的一样。如果我使用它而不将其包装在$()中,则会出错。

var nonHiddenElements = $( "form :input" ).not(':hidden');

nonHiddenElements.map(function(index, element){

    input_id = $(element).attr('id');  // this works

    input_id = element.attr('id') ;    // this gives an error

})

有人可以解释一下这是如何运作的。 这是一个jQuery怪癖,还是一个JavScript的东西?

我的nonHiddenElements数组究竟包含哪些类型的对象? 什么是传递给回调的元素? 主要是$()在做什么?

2 个答案:

答案 0 :(得分:4)

你需要了解jQuery实际上是如何工作的。我将尝试简要解释一下。

$只是一个普通的javascript函数。 jQuery === $,只是一个具有奇特名称的函数。此功能可以执行许多不同的操作,具体取决于您传递的内容。例如,如果传递一个字符串,它将被视为CSS选择器,jQuery内部将尝试查找相应的DOM元素。或者,如果您传递一个以<开头并以>结尾的字符串,jQuery将通过提供的HTML字符串创建一个新的DOM元素。

现在,如果您传递DOM元素或DOM元素的NodeCollection,它/它们将被包装到jQuery实例中,以便它们可以拥有jQuery原型方法。 jQuery提供了许多原型方法。例如textcssappendattr - 这些都是jQuery原型的方法。它们的定义基本上就像这样(简化):

jQuery.prototype.text = function() { ... }

普通的DOM元素没有jQuery提供的那些方便的方法。在mapeach之类的方法内部,如果像你一样检查this值或element参数,你会发现它们实际上不是jQuery实例:

element instanceof jQuery // => false

当然,你不能使用不是实例的实例方法。

因此,为了使用jQuery原型方法,你需要一个jQuery实例,如果你通过传入的DOM元素调用jQuery函数,你可以获得它:

$(element) instanceof jQuery // true

答案 1 :(得分:1)

Javascript是一种编程语言。

jQuery是一个JavaScript库。

使用jQuery:

$("some element")

在原生JavaScript中你必须做这样的事情。

getElementById('elementByID')

在此详细解释:https://developer.mozilla.org/en-US/docs/Web/API/document.getElementById

MDN对于初学者来说是一个很好的资源。 https://developer.mozilla.org/en-US/docs/Web/JavaScript