2014-09-20 70 views
0

这是我第一次尝试jQuery插件,并且我已经设法凑齐了几乎可以工作的东西。我有一个按钮,一旦按下,通过ajax发送一个ID以删除图像。我的问题是,当AJAX调用返回,我在我的萤火虫控制台窗口中收到以下错误:如何在Ajax调用之后引用jQuery插件实例(调用插件函数)

TypeError: self.releaseCropBoxIfSet is not a function 

下面是一个剥离下来我的插件的版本:

if(typeof Object.create !== 'function'){ 
    Object.create = function(obj){ 
     function F() {}; 
     F.prototype = obj; 
     return new F(); 
    }; 
} 

(function($, window, document, undefined) { 
    var uploadCrop = { 
     init: function (options, elem){ 
      var self = this; 
      self.elem = elem; 
      self.$elem = $(elem); 
      self.options = $.extend({}, $.fn.uploadCropPlugin.options, options); 
      self.deleteUploadedImageButton = $('#'+self.options.deleteUploadedImageButton); 
      self.ajaxurl = self.options.ajaxurl; 
      self.deleteUploadedImageButton.on('click', function(e) { 
       $(this).hide(); 
       $.ajax({ 
        url: self.ajaxurl, 
        type: 'post', 
        success: self.deleteSuccess, 
        error: self.deleteError, 
        data: { 
         IDtoDelete : IDtoDelete,     
         action : 'deleteImage' 
        } 
       }); 
      }); 
     }, 
     deleteSuccess: function(data) { 
      var self = this; 
      var returnedData = $.parseJSON(data); 
      self.releaseCropBoxIfSet(); // I am getting an error here 
     }, 
     releaseCropBoxIfSet: function() { 
      var self = this; 
      // REMOVE OLD JCROP 
      if (typeof self.jcrop_api != "undefined") { 
       self.jcrop_api.release(); 
       self.jcrop_api.destroy(); 
      } 
     } 
    }; 
    $.fn.uploadCropPlugin = function(options) { 
     return this.each(function() { 
      var thisUploadCropObj = Object.create(uploadCrop); 
      thisUploadCropObj.init(options, this); 
     }); 
    }; 
    $.fn.uploadCropPlugin.options = { 
     // my vars here 
    }; 
})(jQuery, window, document); 

我不知道是否有问题在Ajax调用期间self会丢失。所以我尝试发送self作为变量的函数,然后返回它,但我得到了错误的方式。我也尝试将self.位从函数调用的前面留下,但它仍然不起作用。

+0

尝试取出(个体经营)并调用该函数通常不知道这将有助于虽然。 – Tasos 2014-09-20 16:11:37

+0

@Tasos谢谢我尝试过,只是得到了:ReferenceError:releaseCropBoxIfSet没有被定义:-( – 2014-09-20 16:21:43

+0

好的。哪里是(self)引用。我不知道你是如何构造堵塞的,但通常它应该是(self = {myfunctiona:function(){},myfunctionb:function(){},myfunctionc:function(){})所以当你调用一个函数组(自我)eg(functionc)你(self.functionc() ) - 你有这样的结构 - 示例脚本--- http://nativedroid.godesign.ch/res/js/script.js – Tasos 2014-09-20 16:51:50

回答

1

要改写你正在运行到这个问题:以上

TypeError: self.releaseCropBoxIfSet is not a function 

意味着selfreleaseCropBoxIfSet属性不是一个功能。如果你确定你正在定义这个函数(你是哪个),那么问题一定是self不是你想象的那样(也就是说,它不是你想要的对象)。要解决这个问题,您可以将bindthis的值设置为您想要的值(预期)。

(function ($, window, document, undefined) { 
    var uploadCrop = { 
     init: function (options, elem){ 
      // ... 
      self.deleteUploadedImageButton.on('click', function(e) { 
       $(this).hide(); 
       $.ajax({ 
        url: self.ajaxurl, 
        type: 'post', 
        // Notice the call to `bind` 
        success: self.deleteSuccess.bind(self), 
        error: self.deleteError, 
        data: { 
         IDtoDelete : IDtoDelete,     
         action : 'deleteImage' 
        } 
       }); 
      }); 
     }, 
     deleteSuccess: function(data) { 
      var self = this; 
      var returnedData = $.parseJSON(data); 
      self.releaseCropBoxIfSet(); 
     } 
    }; 
})(jQuery, window, document); 

你可能想要为deleteError回调做同样的事情。

(另外,请不要别名thisself如果this === self,这是不必要的,混乱的。)

+0

天才!非常感谢你的帮助和y我们的建议。我会沿着我的(非常)漫长而艰苦的道路走上成为编程神的道路...... :-) – 2014-09-20 20:17:00