2011-09-23 68 views
3

我正在开发我的第一个jQuery插件,但希望它以与平常稍有不同的方式工作。我将首先解释它的用途:检测是否已指定选择器

非常简单,<输入>具有指定标题属性的字段将填充输入框中的属性值,重点是输入字段将删除值并允许用户键入框中。

我知道这不是新东西,可能以前做过100次,但它比最终结果更多的是学习曲线。

于是,我知道了在两个方面,到目前为止的工作,第一种方法是代码被称为在一个特定的元素:

$('input').fillForm(); 

另一种方法包括使用插件内的选择(被指定为一个选项),它会发现页面上的所有元素与特定的类和运行函数:

$().fillForm(); // Called from the document load 

$('.fillForm').each(function() {... // Within the plugin 

我的问题是,有没有一种方法来检测用户是否不符合规定选择:$('input').fillFo R M();该位以粗体突出显示。

这样,如果他们没有,那么我可以告诉它使用默认的CSS选择器。

这里是我的代码小提琴:http://jsfiddle.net/chricholson/HwkRw/

有两个版本存在,周围交换意见,尝试另一种方法。

+0

通常,在没有选择器的情况下调用的插件以'$ .fillForm'格式运行。 –

回答

1

我不知道究竟是你追求什么,而是你可以访问选择的构造jQuery对象的财产这样的:

console.log($("input").selector); // "input" 

从你的插件中,您可以这样做:

$.fn.myPlugin = function() { 
    console.log(this.selector); 
} 

$("p").myPlugin(); // "p" 
+0

我设法得到了一些工作:http://jsfiddle.net/chricholson/HwkRw/7/因此,正确的答案,因为这开始了它,但是,我会问更多的其他意见。 – Chris

+0

'.selector'属性没有记录,我们建议_not_在任何用户级代码中使用它,请参阅此处的讨论:http://bugs.jquery.com/ticket/6754以及重复项 – Rick

0

jQuery对象有一个.selector属性,您可以使用。下面是一个例子,http://jsfiddle.net/Akkuma/CGFpC/

如果你创建一个空的jQuery对象$().selector;将等于一个空字符串。如果你决定把它变成一个jQuery UI Widget,你不能从this.element.selector简单地访问它。

0

一个也许是更好的方法是什么,你正在尝试做的:有一个默认设置,并在需要时将其覆盖:这里

(function ($) { 
    $.fillForm = function (args) { 

     options = { 
      selector : '.fillForm' 
     } 

     $.extend(options, args); 

     alert(options.selector); 

     $(options.selector).each(function() { 
      var input = $(this); 

      input.val(input.attr('title')); 

      input.focus(function() { 
       if (input.val() == input.attr('title')) { 
        input.val(''); 
       } else { 
        setTimeout(function() { input.select(); }, 10); 
       } 
      }); 

      input.blur(function() { 
       if (input.val() == "") { 
        input.val(input.attr('title')); 
       } 
      }); 
     }); 

    }; 
})(jQuery); 

$(document).ready(function() { 

    $.fillForm({'selector' : '.foo'}); 

}); 

工作例如:http://jsfiddle.net/82t3K/

+0

如果我决定指定选择器,这是否覆盖** $(options.selector)**? – Chris

+0

邑,它的确如此。看小提琴http://jsfiddle.net/82t3K/。 $ .extend(foo,bar)的基本功能是将foo和bar对象组合起来,用foo中的属性覆盖foo中存在的任何属性。 看看这里,太棒了! http://api.jquery.com/jQuery.extend/ – vzwick

+0

你的'选项'var被泄漏到全球。 – Rick

0

jQuery对象的创建方法(而不是在fn命名空间中),可以在没有选择器的情况下调用它。现在

(function($) { 
    var defaultSelector = '.fillForm'; 

    // Use fillForm with your own selector. 
    $.fn.fillForm = function() { 
     // Blah blah blah. 
    }; 

    // Use fillForm with the default selector. 
    $.fillForm = function() { 
     $(defaultSelector).fillForm(); 
    }; 
})(jQuery); 

可以调用带$.fillForm()你的插件,它是一种较为常见的模式。

0

为什么不使用标准"placeholder"属性并编写使用它的回退?或者更好的是,使用已经编写的许多回退之一?到目前为止发布的每个答案都给出了不同程度的非常糟糕的建议

对于您的任务,我建议使用由Mike Taylor(来自Opera)编写的html占位符备份:jQuery-html5-placeholder。或者至少,用他的作品激励你自己。