如果找不到jQuery选择器会发生什么?

时间:2011-04-18 15:17:16

标签: jquery

如果我将selector作为parameter传递给函数。

// selector is an object
function(selector) {

  selector.trigger('eventHere');
}

显然,如果传入的event没有selectorevent将永远不会触发,但是我应该在触发事件之前进行一些条件检查吗?我的意思是:

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

或者只是留下它??

5 个答案:

答案 0 :(得分:5)

关于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');
}

请注意,您必须确保selector是jQuery对象!否则,您可能会收到错误消息,指出trigger不是函数。

修改

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

还有一个jsperf测试表明,每种技术的操作/秒都有明显的差异(现在不是时候!我先把我扔了) - 检查null / 0 - 调用函数与调用函数之前的长度jQuery对象。

答案 1 :(得分:5)

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

你仍然可以在没有jQuery抛出错误的情况下对该空数组执行任何函数,因此不需要检查返回的元素是否存在。

如果元素没有触发这样的事件,但是你尝试触发它,则不会发生任何事情,也不会再抛出任何异常;无需检查。

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

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

myTriggerFunction('.WeWillBeTriggered');

答案 2 :(得分:1)

只需触发事件..

但是 selector 变量实际上应该是一个jQuery对象(使用你使用的语法)。

答案 3 :(得分:1)

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

只有当你想要检查它的集合为空时你想要做一些特别的事情,并且你通过检查length属性来做到这一点:

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

请注意,“selector”是用于指定要放入jQuery对象的元素的字符串,如代码#main中的字符串$('#main'),因此调用jQuery对象“选择器“可能令人困惑。

答案 4 :(得分:0)

如果您想确保仅针对特定元素类型触发事件,您可以在触发事件之前检查该事件。

if (selector.is("type of element")) {
   //then fire event
}

或者,如果您想通过标签名称

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