Javascript jquery插件中的这个插件正在返回未定义的

Javascript jquery插件中的这个插件正在返回未定义的,javascript,jquery,Javascript,Jquery,有人能解释一下为什么this.rel会返回未定义的,以及正则表达式应该做什么吗。 如果this.rel未定义,则正则表达式也将不起作用,并导致某种错误,因为下面的警报不会触发 $.fn.facebox= function(settings) { init(settings) function clickHandler() { $.facebox.loading(true) alert($(this).attr('rel')); //alert(String(this

有人能解释一下为什么this.rel会返回未定义的,以及正则表达式应该做什么吗。 如果this.rel未定义,则正则表达式也将不起作用,并导致某种错误,因为下面的警报不会触发

$.fn.facebox= function(settings) {
    init(settings)

    function clickHandler() {
      $.facebox.loading(true)
alert($(this).attr('rel'));
//alert(String(this.rel));
      // support for rel="facebox.inline_popup" syntax, to add a class
      // also supports deprecated "facebox[.inline_popup]" syntax
      var klass = this.rel.match(/facebox\[?\.(\w+)\]?/)
   alert(klass);
alert('ppp');
     // if (klass) klass = klass[1]

      //fillfaceboxFromHref(this.href, klass)
      return false
    }

    return this.click(clickHandler)
  }

谢谢,richard

jQuery对象有许多属性,其中之一是包含已找到元素的数组

您必须遍历此数组并将事件绑定到以下单个元素:

  jQuery.fn.extend({
facebox: function() 
{
      //here this is a jQuery-object
  function clickHandler() 
      {
        //here this is a DOMElement
        alert($(this).attr('rel'));
        return false
      }

  return this.each(function() {
              var self = jQuery(this);
              self.click(clickHandler)
           });

}}))

您不应该依赖JavaScript引擎向代码中添加分号。相信我,这会让调试变得很痛苦。我知道,但这并不会导致未定义的问题。像这样执行jQuery.fn.extend({facebox:function()我知道为什么this.rel不起作用。这是因为它不是img标记固有的。我在一个链接标记上测试了它,它起了作用。关于区别:我想说的是添加多个方法的重要选项。此外,$.extend使您能够确定是否存在使用名称的现有对象(如果有)应完全覆盖或仅扩展。您使用的分配实际上将始终覆盖。您的意思是,如果有一个facebox打开,而要使用其他方法打开另一个facebox,则第一个facebox也可以使用此方法。我认为使用此模式是因为它一次只允许打开一个窗口。我没有看到fancybox使用extend ei另外,它只是通过使用jquery自己的名称空间向jquery名称空间添加广告。我也想采用这种模式。不,我不是这个意思。扩展不适用于函数(插件通常是什么)。这更像是一种OOP,您可以添加新的或更改对象的现有属性。另外,创建自己的插件时可能更有趣的是extend()的可选第一个参数。如果设置为false,则不会过度编写现有函数。