2012-01-27 203 views
0

我創建了一個插件來顯示一個Metro MessageBar,它很棒。我被要求支持callbacks併爲此目的在fadeIn功能中增加了一些代碼。我的jQuery回調失敗

由於某些原因,callback顯示爲有效的function,但不會調用?

這裏是控制檯消息我得到:

this.trigger is not a function 

...任何幫助表示讚賞。

這是如何利用插件:

this.showSubmitMessage = function() { 
    var options = { 
     message: "This is a test.", 
     messageType: "information" 
     }; 

    // self.btnSubmit.click IS a valid function!!! Use your own if you want. 
    nalco.es.rk.globals.messageBarManager.display(options, self.btnSubmit.click); 
}; 

這是OFFENDING IN THE PLUG-IN AREA-OF-CODE:

this.fadeIn = function (element, callback) { 
element.prependTo(self.container).centerToScrollTop().fadeIn(self.globals.fadeDuration, function() { 
     if (callback != null) 
      if ($.isFunction(callback)) 
       setTimeout(function() { 
        callback(); 
       }, self.globals.callbackDuration); 
    }); 
}; 

這是完整的用戶控制插件:
請注意代碼f或文件依賴項「jquery.Extensions.js」位於此發佈的底部。

<script src="Scripts/jQuery/Core/jquery-1.6.2.min.js" type="text/javascript"></script> 
    <script src="Scripts/jQuery/Core/jquery.tmpl.js" type="text/javascript"></script> 

    <script src="Scripts/jQuery/jquery.Extensions.js" type="text/javascript"></script> 

<style type="text/css"> 
    .messageBar { background-color: #DDDDDD; color: #666666; display: none; left: 0; padding: 15px; position: absolute; top: 0; width: 932px; z-index: 1000; } 
    .messageBar .content { width: 100%; } 
    .messageBar .content td.image { width: 70px; } 
    .messageBar .content td.button { width: 60px; } 
    .messageBar .button { margin-top: 0px; } 

    .messageBar .content .icon { background-repeat: no-repeat; height: 31px; overflow: hidden; width: 31px; } 
    .messageBar .content .message { } 
    .messageBar .content .image { background-repeat: no-repeat; height: 10px; overflow: hidden; width: 70px; } 

    .messageBar.error { background-color: #FFBABA; color: #D8000C; } 
    .messageBar.information { background-color: #99CCFF; color: #00529B; } 
    .messageBar.success { background-color: #DFF2BF; color: #4F8A10; } 
    .messageBar.warning { background-color: #FEEFB3; color: #9F6000; } 

    .messageBar.error .content .icon { background-image: url('/_layouts/images/error.png'); } 
    .messageBar.information .content .icon { background-image: url('/_layouts/images/info.png'); } 
    .messageBar.success .content .icon { background-image: url('/_layouts/images/success.png'); } 
    .messageBar.warning .content .icon { background-image: url('/_layouts/images/warning.png'); } 
</style> 

<script id="template-messageBar" type="text/html"> 
    <div class="messageBar"> 
     <table class="content"> 
      <tbody> 
       <tr> 
        <td> 
        </td> 
        <td> 
        </td> 
        <td> 
        </td> 
        <td class="button"> 
         <input type="button" value="Close" class="button metroButton" /> 
        </td> 
       </tr> 
      </tbody> 
     </table> 
    </div> 
</script> 

<script id="template-messageBar-icon" type="text/html"> 
    <div class="icon"> 
    </div> 
</script> 

<script id="template-messageBar-message" type="text/html"> 
    <div class="message"> 
     ${Message} 
    </div> 
</script> 

<script id="template-messageBar-image" type="text/html"> 
    <div class="image"> 
    </div> 
</script> 

    <script type="text/javascript"> 
     ;nalco.es.rk.source.MessageBarManager = (function ($) { 
      var publicInstances = {}; 

      publicInstances.Controller = Controller; 
      function Controller(options) { 

       var self = this; 

       this.messageTypes = { error: "error", information: "information", normal: null, success: "success", warning: "warning" }; 
       this.globals = { 
        callbackDuration: 2000, 
        fadeDuration: 700, 
        workingImageUrl: "url('/_layouts/images/Nalco.ES.SharePoint.UI/metro-ajax-loader-blue.gif')" 
       }; 
       this.defaults = { 
        message: "", 
        messageType: self.messageTypes.normal, 
        showIcon: false, 
        showWorkingImage: false 
       }; 

       this.container = $('body'); 

       this.templateMessageBarId = '#template-messageBar'; 
       this.templateMessageBarIconId = '#template-messageBar-icon'; 
       this.templateMessageBarMessageId = '#template-messageBar-message'; 
       this.templateMessageBarImageId = '#template-messageBar-image'; 

       this.selectors = { content: '.content', closeButton: '.button', root: '.messageBar' }; 

       this.initialize = function() { 
        self.display(options); 
       }; 
       this.display = function (options, callback) { 

        var empty = {}; 
        var settings = $.extend(empty, self.defaults, $.isPlainObject(options) ? options : empty); 

        if (settings.messageType != null) 
         if (settings.messageType.length == 0) 
          settings.messageType = self.messageTypes.normal; 

        if (settings.message.length == 0) 
         return; 

        var eleMessageBar = $(self.templateMessageBarId).tmpl(empty); 
        var eleContent = $(self.selectors.content, eleMessageBar); 
        var eleCellOne = $('td:eq(0)', eleContent); 
        var eleCellTwo = $('td:eq(1)', eleContent); 
        var eleCellThree = $('td:eq(2)', eleContent); 

        var eleMessage = $(self.templateMessageBarMessageId).tmpl({ Message: settings.message }); 
        var btnClose = $(self.selectors.closeButton, eleMessageBar); 

        if (settings.messageType != self.messageTypes.normal) { 
         eleMessageBar.addClass(settings.messageType); 

         if (settings.showIcon) { 
          var eleIcon = $(self.templateMessageBarIconId).tmpl(empty); 
          eleCellOne.css('width', '31px'); 
          eleIcon.appendTo(eleCellOne); 
         } 
        } 

        eleMessage.appendTo(eleCellTwo); 
        btnClose.click(function() { 
         eleMessageBar.fadeOut(self.globals.fadeDuration, function() { 
          eleMessageBar.remove(); 
         }); 
        }); 

        if (settings.showWorkingImage) { 
         var eleImage = $(self.templateMessageBarImageId).tmpl(empty); 
         eleCellThree.addClass('image'); 
         eleImage.css('background-image', self.globals.workingImageUrl); 
         eleImage.appendTo(eleCellThree); 
        } 

        var elePreviousMessage = $(self.selectors.root, self.container); 
        if (elePreviousMessage.length > 0) { 
         btnClose = $(self.selectors.closeButton, elePreviousMessage); 
         btnClose.click(); 
         setTimeout(function() { self.fadeIn(eleMessageBar, callback); }, self.globals.fadeDuration); 
        } 
        else 
         self.fadeIn(eleMessageBar, callback); 
       }; 
       this.fadeIn = function (element, callback) { 
        element.prependTo(self.container).centerToScrollTop().fadeIn(self.globals.fadeDuration, function() { 
         if (callback != null) 
          if ($.isFunction(callback)) 
           setTimeout(function() { 
            callback(); 
           }, self.globals.callbackDuration); 
        }); 
       }; 

       self.initialize(); 
      }; 

      return publicInstances; 
     })(jQuery); 

     function initializeMessageBarManager() { 
      nalco.es.rk.globals.messageBarManager = new nalco.es.rk.source.MessageBarManager.Controller(); 
     } 

     $(document).ready(function() { 
      initializeMessageBarManager(); 

      if (typeof (Sys) != "undefined") 
       Sys.WebForms.PageRequestManager.getInstance().add_endRequest(initializeMessageBarManager); 
     }); 
    </script> 

THIS IS擴展DEPENDENCY列在FILES上圖:

// ********************** 
// .centerToScrollTop 
// Use - 
// Centers an ELEMENT to the window's scrollTop. 
// 
// Example - 
// $('.myElement').centerToScrollTop(); 
// ********************** 
(function ($) { 
    $.fn.extend({ 
     centerToScrollTop: function (options) { 
      return this.each(function() { 
       var element = $(this); 
       var container = $(window); 
       var scrollTop = container.scrollTop(); 
       var buffer = 30; 
       var top = scrollTop + buffer; 
       var left = (container.width() - element.outerWidth())/2 + container.scrollLeft(); 

       element.css({ 'position': 'absolute', 'top': top, 'left': left }); 

       return element; 
      }); 
     } 
    }); 
})(jQuery); 
+0

您的'整個代碼'位通過'回調',而您的違規代碼位使用'self.callback()'。哪一個??沒有'this.callback = function(){}' – Benno 2012-01-27 22:58:23

+0

已更新...並已更正。 – 2012-01-27 23:06:58

+0

嗯,那很奇怪,因爲你的代碼中甚至沒有'this.trigger'?大聲笑。 Controller()函數中的'this.showSubmitMessage'也是?我能想到的是,如果它不在那裏,'self'可能不會在'this.showSubmitMessage'裏面工作?如果它在那裏......你可以在'this.display'中的任何部分獲得回調函數(如果你只是把'callback()'函數放在那裏測試) – Benno 2012-01-27 23:17:57

回答

0

這種類型的錯誤,如果你忘了,包括像jQuery的ui.min.js等一些文件,通常會出現仔細檢查是否添加了所有必要的參考文獻。