2017-01-04 2 views
0

У меня есть следующая таблица structre:Установленное значение тд на основе другого имени тд из AJAX

<tr> 
    <td class="name"> 
    Stock1 
    </td> 
    <td class="price"> 

    </td> 
</tr> 
<tr> 
    <td class="name"> 
     Stock2 
    </td> 
    <td class="price"> 

    </td> 
</tr> 

На основе Stock1 имен и stock2, мне нужно установить соответствующую цену в следующем td. Я веб-соскоб цены через AJAX и пытаюсь установить значение следующим образом:

Для Stock1:

$(document).ready(function() { 
    $.ajax({ 
      *everything else working fine* 
      success: function(data) { 
       if($('.name').html().indexOf("Stock1") != -1) { 
        $(this).closest('tr').find('.price').html(data); 
       } 
      } 
    }); 
}); 

В этом случае this не работает, что я ожидал бы td тега с классом name, где значение равно Stock1. Если я заменю this на ".name", код будет работать только в том случае, если есть name td. Когда у меня есть два тега td с классом name, он не работает.

Мне нужно сделать это, как только документ загрузится, а не на какое-либо событие, например, щелчок мышью или зависание.

+0

Я сделал, но так как у меня есть два 'td' теги с тот же класс, jquery не знает, какой из них выбрать, и он не работает. Как выбрать «.name», где значение «Stock1»? –

+2

'this' имеют область действия объекта ajax, а не вашу таблицу – Sojtin

+0

@Sojtin, как изменить объем' this' на мой стол или сделать эту работу любым другим способом? –

ответ

3

this не относится к td.name элемент не table.

:contains() Selector выбирает все элементы, которые содержат указанный текст для целевой td, а затем использование может использовать DOM отношение целевого немедленные следующий Sibling td с помощью .next().

$('td.name:contains("Stock1")').next('.price').html(data); 

или

$('td.name:contains("Stock1")').closest('tr').find('.price').html(data); 

Вы также можете использовать .filter()

var var1 = 'Stock1'; 
$('td.name').filter(function(){ 
    return this.textContent.indexOf(var1) != -1; 
}).closest('tr').find('.price').html(data); 

Согласно комментарию, теперь вы возвращаете массив. Поэтому необходимо перебрать объект data и запрограммировать нужный элемент.

var data = [{ 
    name: "Stock1", 
    price: "$12" 
}, { 
    name: "Stock2", 
    price: "$15" 
}] 
$.each(data, function(_, d){ 
    $('td.name').filter(function() { 
     return this.textContent.indexOf(d.name) != -1; 
    }).closest('tr').find('.price').html(d.price); 
}) 

DEMO

+0

Если я использую переменную 'var1' вместо строки« Stock1 », просто замените« Stock1 »на var1 без qoutes? –

+1

@BivoKasaju, '$ ('td.name:contains ("' + var1 + '")')' – Satpal

+0

Я думаю, что цикл for и ajax не работают вместе, поэтому я получаю только цену за фамилию в списке. Поэтому, как предложил @vijayP, я возвратил оба имени и цены в ajax с сервера. Как бы вы сделали редактирование, чтобы интегрировать это в код? 'success: function (data)' и 'data.name',' data.price' не работает. –

0
success: function(data) { 
    $('.name').each(function(index, element) { 
    if ($(element).html().indexOf("Stock1") != -1) { 
     $(element).closest('tr').find('.price').html(data); 
    } 
    } 
} 
+1

Сброс кода не полезен. Пожалуйста, добавьте несколько строк для объяснения. – Satpal

1

Используйте следующий код в методе успеха, предполагая данные будут в формате указанной ниже.

success:function(data) 
     // Assigning dummy values for assumption 
     var data = [{ 
     stockName: "Stock1", 
     price: "$12" 
     }, { 
     stockName: "Stock2", 
     price: "$15" 
     }] 
    // Iterating throw all td which has name [class] elements 
     $(".name").each(function(i, obj) { 
     // Dummy Validation as per the mock data to repalce the data as per the stockName 
     if ($(this).closest('tr').find('.name').text().trim() === data[i].stockName){ 
      $(this).closest('tr').find('.price').html(data[i].price); 
     } 
     }) 
}); 

FIDDLE

0

Текущая реализация не может работать правильно, если у Вас есть несколько Stocks присутствуют на вашей странице. Поэтому я предлагаю вам немного изменить код на стороне сервера, чтобы вернуть имя узла (например, Stock1), а также его цену. Так что ваш успех ajax data будет содержать 2 компонента; как data.name и data.price.первый один привыкнет к целевой DOM тд, а затем один будет использоваться для установки текста цены следующим образом:

Для Stock1:

$(document).ready(function(){ 

    $.ajax({ 
     url: "someBaseURL?name=Stock1" 
     success: function(data) { 
      var name = data.name; //grab the stock name 
      var price = data.price; //grab the stock price 
      //iterate over all the names and target the one associated 
      $('.name').each(function(){ 
       if($.trim($(this).text()).indexOf(name) != -1) 
        $(this).closest('tr').find('.price').html(price); 
      }); 
     } 
    }); 
}); 
+0

Как мне вернуть данные с сервера, в каком формате? Я использую 'string name =" Stock1 "; строка цена = "15"; string [] returndata = {name, price}; return Json (returndata, JsonRequestBehavior.AllowGet); 'Будет ли это работать с кодом выше? –

+0

вам нужно вернуть его так: 'string name =" Stock1 "; строка цена = "15"; return Json (new {name = name, price = price}, JsonRequestBehavior.AllowGet); ' – vijayP

+0

Ох .. Я просто использовал данные [0] и данные [1] для моего метода кода на стороне сервера, и он работал lol –

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