当jQuery选择器不可用时会发生什么';没有找到?

当jQuery选择器不可用时会发生什么';没有找到?,jquery,Jquery,如果我将一个选择器作为参数传递给函数 // selector is an object function(selector) { selector.trigger('eventHere'); } 显然,如果传入的选择器没有此事件,则事件将永远不会触发,但我是否应该在触发事件之前进行一些条件检查?我的意思是: // selector is an object if(selector === 'matched'){ // then fire the event } else{ //

如果我将一个
选择器
作为
参数
传递给函数

// selector is an object
function(selector) {

  selector.trigger('eventHere');
}
显然,如果传入的
选择器
没有此
事件
,则
事件
将永远不会触发,但我是否应该在触发事件之前进行一些条件检查?我的意思是:

// selector is an object
if(selector === 'matched'){
  // then fire the event
}
else{
  // do nothing
}

或者干脆别管它…?

只要触发事件即可


但是选择器变量实际上应该是一个jQuery对象(使用您使用的语法)。

jQuery的优点是,如果选择器不匹配,它不会引发异常或导致错误。所以你不需要做任何额外的事情;这是一个安全的操作:

// selector **must** be a jQuery object
// the assumption here is that you've already done 
// var selector = $('selectorString'); elsewhere
// and have invoked this function with selector
function(selector){
  selector.trigger('eventHere');
}
但是请注意,您必须确保
选择器
是jQuery对象!否则,您可能会得到一个错误,指示
触发器
不是一个函数

// selector is an object
function(selector) {

  selector.trigger('eventHere');
}
编辑

Adam Terlson在评论中指出,“在对jquery对象执行函数之前,如果该对象为null或长度为0,则值得进行测试。仅仅因为它不会抛出错误,并不意味着不首先执行它就无法获得性能(jquery仍在尝试)。”


还有一个测试表明,每种技术的每秒运算速度都有明显的差异(不是时间!一开始我就不喜欢了)-在调用函数之前检查长度为
null
/
0
-length的jQuery对象,而不是简单地调用函数。

如果要确保事件仅针对某个元素类型触发,可以在触发事件之前检查

// selector is an object
function(selector) {

  selector.trigger('eventHere');
}
if (selector.is("type of element")) {
   //then fire event
}
或者,如果您想通过标记名进行检查

if (selector.get(0).tagName=="tag name") {
   //then fire event
}

jQuery总是返回一个元素数组,即使选择器根本没有返回任何元素,它也将包含一个空数组

您仍然可以在该空数组上执行任何函数,而jQuery不会抛出错误,因此无需检查返回的元素是否存在

如果元素没有要触发的事件,而您尝试触发它,那么不会发生任何事情,也不会抛出异常;不需要检查

还请注意,如果您坚持将选择器传递给对象,您仍然需要使用选择器获取对象,然后才能对其执行任何操作

function myTriggerFunction(selector)
{
  var elements = $(selector);
  elements.trigger('eventHere');
}

myTriggerFunction('.WeWillBeTriggered');

如果jQuery对象的创建与任何元素都不匹配,那么它仍然是一个jQuery对象,但内部没有元素。对jQuery对象执行的大多数方法都可以处理任意数量的元素,包括零,因此,如果您只想什么都不做,就不必进行任何检查

只有当集合为空时,您才需要检查集合,并通过检查
length
属性来执行此操作:

function(selection){
  if (selection.length > 0) {
    selection.trigger('eventHere');
  } else {
    // do something else because the selection was empty
  }
}

请注意,“选择器”是用于指定要放入jQuery对象中的元素的字符串,如code
$(“#main”)
中的字符串
#main
,因此将jQuery对象称为“选择器”可能会让人困惑。

jQuery选择器是纯字符串(例如
“div.main h2”
)所以我猜你给另一个概念起了这个名字。您能澄清一下吗?作为您伟大建议的一个脚注,在对jquery对象执行函数之前,如果jquery对象为null或长度为0,则值得对其进行测试。仅仅因为它不会抛出错误并不意味着不能通过不首先执行它来获得性能(jQuery仍在尝试)。@Adam这听起来是个好主意-但我可以想象,为选择器字符串查找匹配项将是jQuery最昂贵的操作。在元素上调用函数(一旦找到)应该相对便宜。思想?参考文件/编号是否显示其他内容?我想知道在上面的代码中添加
if(选择器)
是否会产生积极的影响。@NoGood-与一些性能问题相比,影响相对较小,但值得一做。这里有一个jsperf测试来证明这一点:我看到在Chrome中首先测试一个结果会提高19%。@Adam感谢您的展示-绝对值得记住。您认为是错误处理开销导致了速度减慢吗?公平地说,关于您的编辑,我没有创建jsperf测试,只是将其挖掘出来。至于原因,很简单,jQuery做了很多事情,不管长度如何。以jsperf的
remove()
为例,查看并搜索
remove:function
以查找定义。您将看到它正在测试各种类型、集合、执行事件解除绑定等。这不是由于错误处理——事实上,只有在极少数情况下,jQuery才真正需要使用try/catch块。jQuery选择器的全部要点您不是事先就知道的吗?根据OP,假设即使对于不支持注册事件的选择器(元素),也会调用该函数。在这种情况下,
selector.is(“元素类型”)
在您的示例中总是返回false,应该迭代。