2014-02-22 27 views
1

我正在使用jQuery鏈接選擇下拉框this site/script。我把它放在側邊欄中,它在主頁上工作正常,但它不適用於後期頁面,調試器指出這個錯誤。Uncaught TypeError:對象函數()沒有方法'替換'

Uncaught TypeError: Object function() 
{for(var a=[];this.length;)a.push(this.splice(Math.random()*this.length,1)); 
for(;a.length;)this.push(a.pop());return this} has no method 'replace' 

它說,有一個在escapeQuotes : function(str) {return str.replace(/([""\\])/g, "\\$1");

腳本的開頭的錯誤:

(function($) { 
    $.dynamicDropdown = { 
    /** 
    * Escape quotation marks and slashes 
    * @param {String} String to format 
    * @return {String} 
    */ 
    escapeQuotes : function(str) { 
     return str.replace(/([""\\])/g, "\\$1"); 
    }, 

這是我如何調用該函數。我使用JSON文件的選項文本和值拉入選擇框:

$(document).ready(function(){ 

    $.getJSON('suggest.json', function(data){ 

     var $select = $('#mySelectID'); 

     $.each(data, function (index, o) { 
      var $option = $("<option/>").attr("value", o.Box1ID + ":" + o.Box3).text(o.Box1 + "|" + o.Box2 + "|" + o.Box3); 
      $select.append($option); 
     }); 

     $("#mySelectID").dynamicDropdown({"delimiter":"|"}); 

    }); 
}); 

編輯:

似乎有一個隨機圖像旋轉我只是把網站上的衝突。我暫時刪除了旋轉器和鏈接選擇框工作正常。這裏有一個example來顯示錯誤。並且this沒有隨機旋轉器。

Array.prototype.shuffle = function() { 
       var s = []; 
       while (this.length) s.push(this.splice(Math.random() * this.length, 1)); 
       while (s.length) this.push(s.pop()); 
       return this; 
      } 

      var picData = [ 
       ['img1','url_1'], 
       ['img2','url_2'], 
       ['img3','url_3'], 

      picO = new Array(); 
      randIndex = new Array(); //array of random indexes 
      for(i=0; i < picData.length; i++){ 
       picO[i] = new Image(); 
       picO[i].src = picData[i][0]; 
       picO[i].alt = picData[i][1]; 
       randIndex.push(i); 
      } 
      randIndex.shuffle(); 
      window.onload=function(){ 
       var mainImgs = document.getElementById('carouselh').getElementsByTagName('img'); 


       for(i=0; i < mainImgs.length; i++){ 
        mainImgs[i].src = picO[randIndex[i]].src; //assign a random image 
        mainImgs[i].parentNode.href = picData[randIndex[i]][1]; 
        mainImgs[i].alt = picData[randIndex[i]][1]; 
       } 

      } 
+0

'str'是一個數組,一個對象,null或false。 – Ohgodwhy

+4

將錯誤的值傳遞給'escapeQuotes'。 'str'是一個函數而不是一個字符串。確保你正確地調用了函數,即傳遞一個字符串(因爲你沒有顯示函數是如何調用的,這就是所有可以說的)。 –

+0

@ FelixKling謝謝。我只是增加了額外的細節。 – RedGiant

回答

5
this script您使用

,這個問題是最有可能在這行代碼:

for (var i in parts) { 
     name += "[\"" + $.dynamicDropdown.escapeQuotes(parts[i]) + "\"]"; 
    ... 
} 

的一點是,使用for in循環不遍歷數組,因爲有可能是一個功能加入到其中Array.prototypefor in環陣列上顯示出來,簡單地改變爲:

for (var i=0;i<parts.length;i++) { 
     name += "[\"" + $.dynamicDropdown.escapeQuotes(parts[i]) + "\"]"; 
    ... 
} 

那麼這不會CAC還有那個功能。


當你添加到你的文章,原因正是我指出的。但如果你仍然堅持使用for in循環,你應該檢查的parts[i]類型是這樣的:

for (var i in parts) { 
     if(typeof parts[i] != "string") continue; 
     name += "[\"" + $.dynamicDropdown.escapeQuotes(parts[i]) + "\"]"; 
    ... 
} 

你有另一for in迴路同樣的問題:

for (var i in options) { 
    option = $(document.createElement("option")) 
     .val($.isArray(options[i]) ? i : options[i]) 
     .html(i) 
     .appendTo(select); 
} 

將其更改爲for (var i=0;i<options.length;i++)或增加這個:

if(typeof options[i] != "string") continue; 

到for循環的第一行。

+0

謝謝。它正在工作。我遵循了您的建議,但這些修改似乎在所有下拉框中添加了「隨機播放」的附加選項。 ([示例](http://painfulmouth.com/index4.php))是否有可能擺脫? – RedGiant

+1

@ user35295:關於這個問題,我更新了我的答案,查看了一下。 –

+0

很抱歉再次打擾您,但是當我添加任何一種方法時,選中的框被打破併發生錯誤。第一個說'未捕獲的ReferenceError:零件未定義'。它看起來像'setting'和'parts'是在選項'for in loop'之後定義的。第二個方法返回'Uncaught SyntaxError:Illegal continue statement'。那是 – RedGiant

相關問題