Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery插件回调-jQuery样板_Javascript_Jquery_Plugins_Boilerplatejs - Fatal编程技术网

Javascript jQuery插件回调-jQuery样板

Javascript jQuery插件回调-jQuery样板,javascript,jquery,plugins,boilerplatejs,Javascript,Jquery,Plugins,Boilerplatejs,我正在使用我的插件模板。我需要从这个插件发送一些回调。此回调需要是具有偏移量坐标的某个变量 var coordinates = { x: x2, y: y2 }; 我尝试这样委派此回调: ;(function ($, window, document) { /* 'use strict'; */ // default options var name = "plugin", defaults = {}; // constructor function plugin (op

我正在使用我的插件模板。我需要从这个插件发送一些回调。此回调需要是具有偏移量坐标的某个变量

var coordinates = {
    x: x2, y: y2
};
我尝试这样委派此回调:

;(function ($, window, document) {

/* 'use strict'; */

// default options
var name = "plugin",
    defaults = {};

// constructor
function plugin (options, callback) {
    this.settings = $.extend({}, defaults, options);
    this.init();
    this.callback = callback;
}

plugin.prototype = {
    init: function () {
        var offset = $(this).offset(),
            x2 = (e.pageX - offset.left),
            y2 = (e.pageY - offset.top);

        $(document).on('mouseup', function() {
            var coordinates = {
                x: x2, y: y2
            };
            this.callback(coordinates);
        });
    }
};

// initialize
$.fn[name] = function (options, callback) {
    return this.each(function() {
        if (!$.data(this, "plugin_" + name)) {
            $.data(this, "plugin_" + name, new plugin(options, callback));
        }
    });
};

})(jQuery, window, document);

我有一个arror,callback不是这个对象的方法。有人能帮忙吗?

关注您如何,尤其是在哪里拨打回拨电话:

plugin.prototype = {
    init: function () {
        var offset = $(this).offset(),
            x2 = (e.pageX - offset.left),
            y2 = (e.pageY - offset.top);

        $(document).on('mouseup', function() {
            var coordinates = {
                x: x2, y: y2
            };
            this.callback(coordinates);
        });
    }
};
您正在创建一个匿名嵌套函数。默认情况下,匿名函数具有
此===窗口


编辑:多亏了KevinB的评论,我注意到我之前的陈述并非适用于所有情况,原因很简单,因为可以通过调用
.apply()
.call()
来更改函数的上下文,jQuery这样做是为了允许您简单地使用
$(这)
访问触发事件的元素

我想的是,如果在没有这两个方法的情况下调用匿名函数,那么它们将被调用,然后
this===window
。但对于直接作为函数而不是方法调用的方法也是如此。下面的方法也行不通

var obj = { foo : 'foo', bar : function(){console.log(this.foo);} };
$(document).on('mouseup', obj.bar);
首先是因为jQuery在调用回调时对上下文所做的上述更改,其次是因为一个简单的经验法则:上下文是点左边的任何内容。调用这样的回调时:
callback()
,点的左边没有任何内容,即不存在的
this===null
(不要点击我),因此它默认为
this===window


解决这个问题相当简单:只需引入一个引用插件实例的新变量。此变量通常称为
,即
。微小的改变应该可以实现您的目标:

init: function() {
    var offset = $(this).offset(),
        x2 = (e.pageX - offset.left),
        y2 = (e.pageY - offset.top),
        that = this;

    $(document).on('mouseup', function(){
        var coordinates = {
            x: x2, y: y2
        };
        that.callback(coordinates);
    });
}

但是要注意:按照插件当前的工作方式,它会在每次运行时将侦听器附加到
mouseup
事件。你不需要那么多。。。特别是因为如果你经常运行插件,它会导致延迟。我建议将事件侦听器连接一次,并在事件触发后逐个调用所有回调。

请提供有关如何调用回调的更多信息。这就是我所拥有的,我不知道如何做……我不相信你。你是说你把
function Plugin(){…}
换成了那段易怒的代码?如果是这样,您对回拨的呼叫就完全不合适了。你在网上有你的代码的链接吗?像要点一样?
this.callback(坐标)
不知道它在哪里。@Derija93这只是一个代码的和平,检查jquery样板模型,我需要将一些偏移坐标委托给某个变量,也许回调不是一个好主意…“匿名函数总是有这个===窗口”这是错误的,但是您的解决方案会修复它。在这种情况下,
这个
文档
@KevinB,它。。。这是真的。因为jQuery通过使用
.call()
调用函数。默认情况下我应该添加,谢谢。但我仍然有一个错误:Object#没有不应该发生的方法'callback'@Lukas。请确保不要将
that=this
放在匿名函数中,因为它不会对您以前拥有的内容产生影响。它必须在
init
的范围内。请注意,
HTMLDocument
document
的“类”,它支持我的猜测。