2015-01-26 4 views
0

У меня есть одна проблема с этим кодом. он выбирает первые три ключевых слова. что, если я хочу выбрать ключевое слово в случайном числе? в настоящее время он имеет 7 ключевых слов и выбирает первые три. что, если я хочу выбрать ключевое слово 3,6,7. как я могу сделать здесь случайную функцию?как выбрать случайное ключевое слово?

(function($) { 
    $.fn.replacetext = function (target, replacement, max) { 
     var limit = max || -1; 


     var $textNodes = this 
      .find("*") 
      .andSelf() 
      .contents() 
      .filter(function() { 
      return this.nodeType === 3 && !$(this).parent("a").length; 
     }); 

     $textNodes.each(function (index, element) { 
      var $element = $(element); 
      var words = $element.text().split(/\b/); 
      var matches = 0; 
      var text = words.map(function (word, index) { 
       if (matches >= limit) { 
        return word; 
       } 

       if (word.match(target)) { 
        ++matches; 
        return word.replace(target, replacement); 
       } 

       return word; 
      }); 

      $element.replaceWith(text.join('')); 
     }); 
    }; 
})(jQuery); 


$("p").replacetext(/\bdress\b/gi, "<a href='http://www.google.com'>$&</a>", 3); 
+0

Третий параметр 'replacetext' является то, что вы ищете. –

+0

ваш '$ textNodes.each' выполняет итерацию по массиву в последовательности, начиная с первого элемента. Вместо этого вы захотите создать функцию «rand», а не – vol7ron

+0

@GabrielGarcia no, я думаю, что это счет того, сколько раз делать замену, а не порядок замены. – vol7ron

ответ

0

Вы можете достичь следующего поведения, используя следующий путь:

В то время как вы зацикливание для текстовых узлов, найти максимальное случайное число в каждом текстовом узле, используя следующий код:

var ranMax = $element.text().match(target).length 

Тогда generate a set of random number между следующим диапазоном (от 1 до максимального случайного числа)

var arr = [] 
while (arr.length < max) { 
    var randomnumber = Math.ceil(Math.random() * ranMax) 
    var found = false; 
    for (var i = 0; i < arr.length; i++) { 
     if (arr[i] == randomnumber) { 
      found = true; 
      break 
     } 
    } 
    if (!found) arr[arr.length] = randomnumber; 
} 

Проверьте, соответствует ли индекс совпадений в наборе случайных чисел, replace the value, иначе верните исходное значение.

var nth = 0; 
value = value.replace(target, function (match, i, original) { 
    nth++; 
    return jQuery.inArray(nth, arr) > -1 ? 
     match.replace(target, replacement) : 
     match; 
}); 

Следуя приведенным выше шагам, вы можете достичь ожидаемого поведения.

Для рабочего примера, пожалуйста, обратитесь к следующей скрипкой: http://jsfiddle.net/zeskysee/14xjw4dr/2/

Будем надеяться, что это поможет: D

+0

Я только что заметил, он работает хорошо, но я получил одну ошибку, TypeError: Не могу прочитать свойство «длина» нулевого «почему?» – rmdsf

+0

Можете ли вы показать мне свою скрипку, чтобы я мог помочь вам взглянуть. – Zesky

Смежные вопросы