Uncaught TypeError: Функция объекта () не имеет метода replace

Я использую выпадающий список выбора jQuery с этого сайта/ скрипта. Я поместил его в боковую панель, и он отлично работает на домашней странице, но не работает на страницах сообщений, и отладчик указывает на эту ошибку.

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":"|"});

    });
});

Отредактировано:

Кажется, есть конфликт со случайным ротатором изображения, который я только что выложил на сайт. Я временно убрал ротатор и цепочка выбора работает нормально. Вот пример, чтобы показать ошибку. И это без случайного ротатора.

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];
                }

            }

1 ответ

Решение

В этом скрипте, который вы используете, проблема, скорее всего, в следующих строках кода:

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

Дело в том, что не перебирайте массив, используя for in цикл, так как, вероятно, к Array.prototype который появляется в for in цикл по массиву, просто измените его на:

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

тогда эта функция больше не будет действовать.


как вы добавили в свой пост, причина именно в том, что я указал. но если вы все еще настаиваете на использовании 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.

Другие вопросы по тегам