0

我只是在问自己如果一个插件不止一次地应用于一个元素会发生什么

假设我做$("#my_element").plugin();了然后不知何故我做了完全相同的事情$("#my_element").plugin();

  1. 最好避免这种情况?
  2. jQuery 是否知道不能再次应用该插件?

如果这个问题不属于这里,我很抱歉。告诉我,我会删除它。

4

1 回答 1

2

这完全由插件编写者决定。jQuery 没有“真正的”方式说“嘿,不要那样做!” 但是,一个好的插件编写器通​​常会有一个“初始化”方法,可以将类或数据变量分配给调用插件的原始元素。就像是:

/*  Example Plug-in Setup   */
(function($) {
    if (!$.myExample) {
        $.extend({
            myExample: function(elm, command, args) {
                return elm.each(function(index){
                    //  here a check is made to see if this plugin has touched this element before
                    if (!$(this).hasClass('my-example')) {
                        $.myExample.init.apply($(this), arguments);
                    }
                    else {
                        // do work to each element as its passed through
                    }
                });
            }
        });
        $.fn.extend({
            myExample: function(command) {
                return $.myExample($(this), command, Array.prototype.slice.call(arguments, 1));
            }
        });
        $.myExample.init = function() {
            //  here we initialize the plugin on this element for the first time
            //  Assign element the class stating "hey, you've been here!"
            this.addClass('my-example');
        };
    }
})(jQuery);

请记住,这只是一个示例,根据不同的需求设计插件有很多不同的方法,但这应该让您对插件如何在“破坏自身”之前“自我检查”有一个基本的了解!


"Do you know what could happen if that check isn't present?"

嗯,这是一个“加载的问题”。这实际上取决于编写插件的“目的”。可能会发生许多不同的事情。

例如,如果您编写了一个插件来克隆一个表单并在 DOM 上隐藏一个副本,那么每次您在该表单上调用该插件时,都会将一个新副本保存到 DOM 中!如果目的是为数据库上传保留特定信息,这可能是可怕的。

再说一次,它可能只是一个重写元素“内部” HTML 的插件,因此它只会在再次调用时被重写,并且可能看起来根本没有效果。

简而言之,无论发生什么都取决于插件编写器,但不要将插件视为“外来对象”。它们只是 JavaScript,在这种情况下使用 jQuery,包装在文件和/或插件方法中。这并不能帮助它们取代您已经在 J​​avaScript 代码中看到的任何内容。它只是意味着“扩展”一个库。从而为您提供“预先编写”的代码,否则您需要自己编写。

于 2013-07-10T13:04:39.640 回答