2011-04-25 37 views
4

我有一個插件由我自己設置一些事情時使用jquery-ui的對話框。而不是調用的:jQuery:更改插件後選項

$("#popup").dialog(options); 

我用這個:

$("#popup").dialogPlugin(options); 

而且dialogPlugin將調用.dialog(options)(做一些東西后)。

在我的插件我可以修改一些功能對話框的像這樣的事件:

var originalCloseFn = options.close; 
options.close = function() { 
    //my own stuff. 
    originalCloseFn(); 
}; 

插件的偉大工程,但使用它一段時間後,我意識到,我不能改變對話框功能從外部插件是這樣的:

$("#popup").dialog("option", "close", newFunctionOnClose); 

如果我這樣做,插件添加到關閉功能的代碼將會丟失。

所以我在我的插件的beggining添加以下代碼:

if (options == "option") { 
    if (val == undefined) 
     return _this.dialog("option", name); 
    else 
     return _this.dialog("option", name, val); 
} 

現在我需要更改此代碼的第五行真正改變不的jQuery的UI我的插件的選項。 (選項.dialogPlugin功能,而不是.dialog)。我真的不知道我該怎麼做。請有任何想法嗎?

編輯

我知道,這個問題不是很清楚,我的英語不好並不讓我來解釋自己更多,所以我做了一個痘痘example

我想要的是在第七行(return $(this).dialog("option", name, val);)而不是修改(相當於optionsForJQuery.close)修改options.close。這樣我就可以避免影響插件的行爲。

回答

2

試試這個:

HTML:

<div id="popup">I'm a popup</div> 

JS:

(function ($) { 
    $.fn.dialogPlugin = function (options, name, val) { 

     var 
      // setter function close 
      fnClose = null, 

      // function when close 
      fnMyClose = function() { 
       alert("This is plugin's close behavior"); 
       if (fnClose) 
        fnClose(); 
      }; 

     if (options == "option") { 
      if (name == "close" && $.isFunction(val)) { 
       fnClose = val; 
       val = fnMyClose; 
      } 
     } 
     else { 
      if (options.close) 
       fnClose = options.close; 

      options.close = fnMyClose; 
     } 

     return (name) 
      ? $(this).dialog(options, name, val) //if var == 'undefined'is equal to not send parameters 
      : $(this).dialog(options); 
    }; 

})(jQuery); 


$("#popup").dialogPlugin({ 
    close: function() { 
     alert("This is user's first close behavior"); 
    } 
}); 


$("#popup").dialogPlugin("option", "close", function() { 
    alert("This is user's second close behavior"); 
}); 

編輯

以上古樸典雅:

(function($){ 

    var dialog_close = $.ui.dialog.prototype.close; 

    $.ui.dialog.prototype.close = function() { 

     var self = this; 

     alert("This is plugin's close behavior"); 

     dialog_close.apply(this, arguments); 


    }; 

})(jQuery); 
+0

哇。例如下降。 – 2012-10-28 03:38:38

+0

是的,我不刪除「jsfiddle」我不知道發生了什麼 – 2012-10-28 16:44:50

相關問題