2014-12-06 3 views
0

Я пытаюсь добавить или удалить классы для некоторых div. Этим divs должны быть назначены разные классы в зависимости от значения их html. Я не уверен, что я делаю неправильно, но мой код не работает.Создать массив Jquery из ответа ajax

Это мой код:

$.ajax({ 
    type: 'POST', 
    url: 'loc/bcheck.php', 
    success: function(data){ 
     tArrx = new Array(data); 
    }, 
    complete: function(){ 
     $('.bHr').each(function(){ 
      curElm = $(this); 
      var bTm = curElm.html(); 
      if ($.inArray(bTm, tArrx) !== -1){ 
       curElm.addClass('disabled'); 
       curElm.removeClass('available'); 
      } 
      else{ 
       curElm.addClass('available'); 
       curElm.removeClass('disabled'); 
      } 
     }); 
    } 
}); 

<div class="bHr">1</div> 
<div class="bHr">5</div> 

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

'данные' является 1" , "2", "3", "4 и используя console.log он возвращает [" 1" , "2", "3", "4"]

+0

где вы получаете bTm? я думаю, что это должно быть Tbm –

+0

'var bTm = curElm.html(). trim();' –

+0

попытайтесь установить 'dataType: 'json'' для запроса ajax, тогда' tArrx = data; '... –

ответ

0

Итак, я понял. Проблема заключалась в том, что ответ PHP не был массивом PHP.Чтобы исправить это, я сделал свой ответ массив и добавил это мой PHP файл:

json_encode($tArrx); 

И изменил мою JQuery следующим образом:

$.ajax({ 
    type: 'POST', 
    url: 'loc/bcheck.php', 
    dataType: 'json', 
    success: function (data) { 
     tArrx = data; 
    }, 
    complete: function(){ 
     $('.bHr').each(function(){ 
      curElm = $(this); 
      var bTm = curElm.html(); 
      if ($.inArray(bTm, tArrx) !== -1){ 
       curElm.addClass('disabled'); 
       curElm.removeClass('available'); 
      } 
      else{ 
       curElm.addClass('available'); 
       curElm.removeClass('disabled'); 
      } 
     }); 
    } 
}); 

Я использовал примеры из всех вас, ребята, для достижения этой цели и я благодарю вас за это. Не могли бы сделать это без вашей помощи!

0

мне кажется, что вы должны бросить переменные:

if ($.inArray(bTm.toString(), tArrx) !== -1) 
+0

Если я определяю tArrx вручную, функция работает нормально, без необходимости добавлять '.toString()'. Проблема возникает, когда я создаю массив, используя «данные». – user1885099

+0

Ну, я предполагаю, что функция 'toString' не решает проблему. Я еще подумаю. – Verhaeren

0

у вас есть опечатка в этой строке:

if ($.inArray(bTm, tArrx) !== -1){ 

она не должна быть:

if ($.inArray(Tbm, tArrx) !== -1){ 
1

Я думаю, что проблема new Array(data), если данные строкового типа, то он создает массив с одним элементом, который является строкой, в противном случае, если данные является массивом, то tArrx будет массив с 1 элементом, это массив, поэтому ваш $.inArray() всегда будет возвращать -1.

$.ajax({ 
    type: 'POST', 
    url: 'loc/bcheck.php', 
    //set datatype as json 
    dataType: 'json', 
    success: function (data) { 
     var tArrx = data; 
     $('.bHr').each(function() { 
      var curElm = $(this); 
      //wrong variable name& you might have to trim the html contents 
      var bTm = curElm.html().trim(); 
      if ($.inArray(bTm, tArrx) !== -1) { 
       curElm.addClass('disabled'); 
       curElm.removeClass('available'); 
      } else { 
       curElm.addClass('available'); 
       curElm.removeClass('disabled'); 
      } 
     }); 
    } 
}); 
+0

Теперь я просто 'tArrx не определен'. – user1885099

+0

@ user1885099 удалите 'var' infront из' var tArrx = data; ', я думаю, вы используете его еще там, где также –

+0

Хорошо, если я использую функцию .each внутри« успеха », она ничего не делает, когда значение находится в массиве (нет ошибки, просто ничего). Если я использую функцию .each в 'complete', я получаю ошибку 'tArrx is not defined', хотя я попытался удалить 'var' из 'tArrx'. – user1885099

1

Вы фактически создали многомерный массив

tArrx = new Array(data); 

Так вот как вы бы соответствовать ваш массив

var data = ["1","2","3","4"]; 
var tArrx = new Array(data); 
confirm(tArrx[0]); 
confirm(data); 
confirm($.inArray('1', tArrx[0]) !== -1); 

еще лучше просто не отбрасывают данные в массив

var data = ["1","2","3","4"]; 
confirm(data); 
confirm($.inArray('1', data) !== -1); 

Working example HERE

Я изменил пример, чтобы скопировать ваши условия как можно ближе.

var data = '1","2","3","4'; 
var tArrx = new Array(data); 
console.log('data '+data); 
console.log('data.length '+data.length); 
console.log('data[0] '+data[0]); 
console.log('data[1] '+data[1]); 
console.log('data[2] '+data[2]); 
console.log('data[3] '+data[3]); 
console.log(tArrx.length); 
console.log(tArrx[0].length); 
console.log(tArrx); 
console.log(tArrx[0]); 
$('.bHr').each(function(){ 
    curElm = $(this); 
    var bTm = curElm.html(); 
    console.log(typeof bTm); 
    console.log($.inArray(bTm, tArrx) !== -1); 
    console.log($.inArray(bTm, tArrx[0]) !== -1); 
    console.log($.inArray(bTm, data) !== -1); 
}); 

Не имея начало и конец цитаты возвращаемой из вашего запроса PHP вызывает назначение массива возвращает массив длина 1, заполненной строкой длины 13. Это приведет jQuery.inArray() метода не найти соответствие между 1 и 13 символов. Он может найти 1, если вы передадите строку. Исправление недостающих начальных и конечных qoutes будет вашим лучшим решением. Просмотрите журнал консоли из обновленного рабочего примера.

data 1","2","3","4 
data.length 13 
data[0] 1 
data[1] " 
data[2] , 
data[3] " 
1 
13 
["1","2","3","4"] 
1","2","3","4 
string 
false 
true 
true 
string 
false 
false 
false 
+0

'data' - ответ PHP-файла – user1885099

+0

@ user1885099 У меня такой же вопрос, как EGP: Можете ли вы показать консольный журнал для tArrx? консоли журнала для tArrx из моего примера выглядит следующим образом: [Array [4]] 0: Array [4] 0: "1" 1: "2" 2: "3" 3: «4 " длина: 4 __proto__: Array [0] длина: 1 – Threadid

+0

@ user1885099 Вы запрашивали длину данных? console.log (data.length); – Threadid