2012-02-23 93 views
9

我試圖讓一段JavaScript運行後,一些第三方代碼使模態對話框出現。我看到a pretty neat idea of hijacking the jQuery show function,但不幸的是它不工作。我猜這個想法早在2009年就開始使用jQuery的老版本,但現在不是最新版本。下面是與實施的jsfiddle和樣本:試圖在事件之前和事件後觸發jQuery show()

http://jsfiddle.net/mkmurray/drv5w/2/

你可以通過運行樣本看,它會提醒「beforeShow」事件,但不是「afterShow事件」,並與一些調試我可以看到它沒有完全調用'newCallback'函數。

非常感謝您提供任何幫助。

回答

9

貌似我能夠通過一個解決方案正常工作。它涉及到與原來走錯了幾個因素:

  1. 因爲我看到的代碼原有的書寫,jQuery的添加了一個名爲easing另一個可選參數。這真的與我通過調用_oldShow.apply(...)委託給jQuery中的原始show方法的方式非常混雜。
  2. 當我修復後,我發現有時show方法調用一系列其他方法,有時候遞歸地再次調用show。我需要一種方法來避免我的實現攔截這些遞歸調用;我發現如果有selector屬性,我可以信賴。

的工作實施可以在這裏找到在此的jsfiddle:

http://jsfiddle.net/mkmurray/drv5w/27/

這個實現是非常依賴於jQuery的,雖然沒有改變show方法的方法簽名。所以你幾乎必須決定是否要修改你的第三方jQuery插件而不是這樣做。無論哪種方式,如果你想獲得最新的第三方插件或最新的jQuery,一些新的變化可能會破壞你的實現。所以這個解決方案不一定比修改你的第三方插件更好或更差。

+2

'這個評論是被拒絕的編輯:'在上面的鏈接有一個錯誤。一個工作版本可以在http://jsfiddle.net/GDqNx/1/找到 – 2012-12-21 03:26:55

+0

我確實看到了改變的區別,但是這個錯誤是什麼? – mkmurray 2013-02-27 23:03:13

+0

我不確定這個bug是什麼。一些'anon'用戶試圖編輯你的答案,我知道這個編輯會被拒絕,但已經足夠保存它作爲評論。 – 2013-02-27 23:45:40

-1

我沒有測試過任何東西,但共享的幾件事情,我知道

  1. show有一個可選的第二個參數 - 寬鬆。 jQuery自動檢測到這一點,但對於一個完美的解決方案,您必須考慮這一點。

    _oldShow.apply(obj, [speed, null, newCallback]); 
    
  2. 回調纔有意義時,有一個延遲,這意味着對於speed值。如果有延遲,我希望你的afterShow事件會被觸發。如果沒有延遲,你可以調用_oldShow,這樣

    _oldShow.apply(obj, [speed, null, newCallback]); 
    if(!speed){ 
        obj.trigger('afterShow'); 
    } 
    

編輯後觸發它:

我累了一些東西,FRPM我學到了什麼,我建議你創建一個新節目功能而不是重寫。

jQuery.fn.extend({ 

    show2:function(speed, easing, callback) { 
     this.trigger('beforeShow'); 
     this.show(speed, easing, function(){ 
      $(this).trigger('afterShow'); 
      if ($.isFunction(callback)) { 
       callback.apply(this); 
      } 
     }); 
     if(!speed){ 
      this.trigger('afterShow');    
     }   
    } 


}); 

演示:http://jsfiddle.net/9F8ea/2/

+0

我試過包括easing參數,沒有改變。我也嘗試過一箇舊的回調填充,然後也沒有幫助。至於你最後的建議,我不能做show2,因爲show()的調用在第三方javascript中。我想重寫jQuery中的默認show()。 – mkmurray 2012-02-23 17:27:36

2

我在here上發現了另一個解決方案,只是稍微調整了一下。

(function($){ 
    $.each(['show','hide'],function(i,ev){ 
     var el = $.fn[ev];    
     $.fn[ev] = function(){ 
      this.trigger(ev); 
      return el.apply(this,arguments); 
     }; 
    });     
})(jQuery); 

它沒有提供其他示例的前後事件,但它當然可以詳細闡述。它到目前爲止都在爲我工作,並希望它繼續這樣做 - 這是一個很好的小方法,可以輕鬆擴展到其他jQuery函數,包括展示的各種替代方法。

**注意這也會觸發「隱藏」事件。

+0

與@mkmurray'beforeShow'事件相比,此解決方案看起來更快。在我的情況下,這種方法不會導致顯示元素的可見延遲。所以我選擇了這個答案。 – Spirit 2017-09-13 21:15:13