у вас есть несколько проблем:
переменные в области глобального окна
массив, объявленный с ключевым словом new
литерала
, пытающегося использовать переменные перед объявлением их
jQuery.inArray, который используется неправильно ( inArray возвращает число , а не true
или false
)
неэффективный код с циклом while
, который теоретически может привести к бесконечному циклу
теперь, второе в сочетании с третьим является главной проблемой здесь, так как при первом тестировании x
в массиве это undefined
(вы определяете его только внутри if
с помощью оператора var
таким образом, x сначала не определен) и, таким образом, он соответствует первому элементу в массиве (который равен undefined
, как вы объявили r
с new Array(6)
), и функция inArray возвращает 1, что приводит к бесконечному циклу.
Есть несколько вещей, которые вы можете сделать, чтобы исправить этот код, но я думаю,полное переписывание с другим подходом может быть лучше и вообще не требует jQuery.
Эта модифицированная версия вашего кода должна работать нормально:
var Show = 6, // Number of logos to show
TotalLogos = 21, // Total number of logos to choose from
FirstPart = '<img src="/wp-content/client-logos/logo',
LastPart = '.jpg" height="60" width="120" />',
array = [], // array with all avaiilable numbers
rnd, value, i,
logosElement = document.getElementById('client-logos');
for (i = 0; i < TotalLogos; i++) { // arrays are zero based, for 21 elements you want to go from index 0 to 20.
array[i] = i + 1;
}
for (i = 0; i < Show; i++) { // pick numbers
rnd = Math.floor(Math.random() * array.length);
value = array.splice(rnd,1)[0]; // remove the selected number from the array and get it in another variable
logosElement.innerHTML += (FirstPart + value + LastPart);
}
Чтобы объяснить немного, что я сделал здесь:
инициализируйте массив всеми возможными значениями (числа от 1 до 21)
запустите цикл только столько раз, сколько вы хотите выбрать.
сгенерируйте случайное число от 0 до максимального индекса, доступного в вашем массиве чисел
удаляет число по этому индексу из массива с помощью splice, а затем использует его для создания строки для вызова innerHTML ( splice возвращает элементы, удаленные из массива, как еще один новый массив ).
Кроме того, переменная logosElement
кэшируется в начале, поэтому вы выполняете только один DOM-поиск для элемента.
Есть и другие способыэтот код может быть переписан и даже очищен, но я решилэто был бы самый чистый способ помочь вам с вашей проблемой (и это кросс-браузер безопасно!нет необходимости добавлять jQuery, если вам не нужен другой функционал)