1. 程式人生 > >ecshop之transport和jquery衝突之完美解決方案

ecshop之transport和jquery衝突之完美解決方案

眾所周知:ecshop的transport.js檔案和Jquery是衝突的,兩個檔案不能同時呼叫,現給出以下完美解決方案:

原因分析:
     在transport.js檔案中,大概 580行到590行之間,這個句用於格式化json,他重寫了object的結構,導致於js框架衝突。衝突的原因是jquery給一個object增加了很多元素,那麼在Object.prototype.toJSONString = function () 這個函式中 for (k in this) 語句中進行了無數次的迴圈,導致網頁很卡,並且在IE中會報錯。


解決方案:
    根本的解決辦法是不用transport.js中的json功能,那麼就要有一個相同的功能來代替它,這裡我選用jquery-json1.3.js。首先要把transport.js中的json功能刪除。由於實現json功能的函式有區別,所以要麻煩改掉原ecshop中各個地方用到的toJSONString()函式。


解決步驟:
   1. 下載附件中的js附件,並替換掉原檔案。(主要去掉了transport.js的json功能並新增新的json功能)
   2. page_header.lbi 中新增 {insert_scripts files='jquery.js,jquery.json-1.3.js'}
   3. 在所有的JS中。
       替換 *.toJSONString() 為 $.toJSON(*)
       替換 *.parseJSON() 為 $.evalJSON(*)
       替換(不是去掉)頁面所有的$(){}函式,防止jquery不生效(解釋:這一步是要替換掉原ecshop裡的$(){}這個函式,因為它與jquery是衝突的,解決的辦法很多,可以用其他函式代替,比如getId(){}等等,也可以用jquery本身來解決,在此,我就不具體做例子了,由於最近比較忙,好多天沒研究ecshop了。^_^ .還有一個解決辦法,大家自行研究吧:

     jQuery.noConflict()
執行這個函式將變數$的控制權讓渡給第一個實現它的那個庫。
這有助於確保jQuery不會與其他庫的$物件發生衝突。
在執行這個函式後,就只能使用jQuery變數訪問jQuery物件。例如,在要用到$("div p")的地方,就必須換成jQuery("div p")。
注意:這個函式必須在你匯入jQuery檔案之後,並且在匯入另一個導致衝突的庫之前使用。當然也應當在其他衝突的庫被使用之前,除非jQuery是最後一個匯入的。

     )

       注意:可能要替換掉很多地方,請大家不要怕麻煩


解決範例:
  1.在商品瀏覽頁,使用者評論這裡:
  Ajax.call('comment.php', 'cmt=' + cmt.toJSONString(), commentResponse, 'POST', 'JSON');

  替換為
  Ajax.call('comment.php', 'cmt=' + $.toJSON(cmt), commentResponse, 'POST', 'JSON');

  2.index.js 裡
   var res = result.parseJSON();
   替換為
   var res = $.evalJSON(result); 

摘要: 剛要用到juery的放大鏡 但用jquery和系統有衝突,具體原因是因為transport.js寫法。 在呼叫放大鏡的頁面放了 script type="text/javascript"if (Object.prototype.toJSONString){ var oldToJSONString = ...剛要用到juery的放大鏡 但用jquery和系統有衝突,具體原因是因為transport.js寫法。 在呼叫放大鏡的頁面放了<script type="text/javascript">
if (Object.prototype.toJSONString){
      var oldToJSONString = Object.toJSONString;
      Object.prototype.toJSONString = function(){
        if (arguments.length > 0){
          return false;
        }else{
          return oldToJSONString.apply(this, arguments);
        }
}
}</script> 結果好了。