Javascript fn说的是;“不是一个函数”;

Javascript fn说的是;“不是一个函数”;,javascript,jquery,Javascript,Jquery,当我调用这个自定义函数时 $.fn.inputBoxHelper = function () { var args = arguments[0] || {}; var matchingElem = $.grep(this, function (e) { return $(e).val() == $(e).attr('title'); }); $(matchingElem).addClass(args.className); this.bind({

当我调用这个自定义函数时

$.fn.inputBoxHelper = function () {
    var args = arguments[0] || {};
    var matchingElem = $.grep(this, function (e) { return $(e).val() == $(e).attr('title'); });
    $(matchingElem).addClass(args.className);

    this.bind({
        focus: function(){
            if ($(this).val().trim() == $(this).attr('title')) { $(this).val(emptyString).removeClass('gray'); }
        },
        blur: function(){
            if ($(this).val().trim() == emptyString) { $(this).val($(this).attr('title')).addClass('gray'); }
        }
    });
    return this;
}
像这样

$('input:text').inputBoxHelper({ className: 'gray' });
当我调用它时,它会给我错误

$("input:text,input:checkbox").inputBoxHelper is not a function
file:///D:/repository/scripts/script_tests/test.js
Line 20
即使我将函数更改为

$.fn.inputBoxHelper = function () {return this;}

它做同样的事情。它似乎运行良好,工作正常,因为所有的功能都在输入框上工作,但出现了错误。有人有什么想法吗?

检查您没有将jQuery加载到页面中两次。一些插件或插件库喜欢包含jQuery。因此,它可以覆盖您现有的jQuery实例,并使用一个新的–fresh–实例覆盖
$
jQuery
变量,从而导致现有插件未定义。插件在定义时会添加到jQuery的原型中。因此,如果销毁该对象的唯一实例,则原型将重置为其原始形式。因此,这些插件不再是原型的一部分

另外,它可能没什么,报告您发布的函数定义的最后一行缺少分号。它应该是:

$.fn.inputBoxHelper = function () {
  var args = arguments[0] || {};
  var matchingElem = $.grep(this, function (e) { return $(e).val() == $(e).attr('title'); });
  $(matchingElem).addClass(args.className);

  this.bind({
     focus: function(){
          if ($(this).val().trim() == $(this).attr('title')) { $(this).val(emptyString).removeClass('gray'); }
      },
      blur: function(){
          if ($(this).val().trim() == emptyString) { $(this).val($(this).attr('title')).addClass('gray'); }
      }
  });
  return this;
};

通过JSlint运行所有javascript总是一个好主意。它可以帮助你找到你可能花数小时寻找的东西。

插件需要先加载才能使用


上面的评论证实OP在加载插件之前试图使用该插件。

您确定在创建插件之前没有在代码中调用该插件吗?您还依赖另一个库没有劫持$。创建插件时,使用jQuery.fn或(函数($){$.fn.etc})(jQuery)更安全;帕特里克:你说得太对了。尽管这一个上面的功能工作得很好,但出于某种原因,这一个直到后来才启动。谢谢,不客气。我将添加我的评论作为答案,以便您确认它已解决。谢谢@James解决了我的问题!:)我有这个问题。如果在执行$.fn之后再次加载jquery(包含到jquery中)。。。那么你的功能将disappear@adinas:这是因为新的jQuery实例正在覆盖
jQuery
$
变量。新实例的原型中没有添加新方法(插件)。为我解决了这个问题。正在加载两个不同版本的jquery!