Вычисления на JavaScript в HTML-таблице

#javascript #jquery #html #html-table #calculator

#javascript #jquery #HTML #html-таблица #калькулятор

Вопрос:

Я довольно новичок в JavaScript, поэтому я даже не знаю, подходит ли этот язык для попытки этого, но я решил, что попробую. Я прочитал несколько других сообщений и не нахожу ничего, что действительно дало бы мне представление о том, как это сделать, поэтому я спрашиваю здесь. Все примеры, которые я прочитал, касаются введенных пользователем чисел и / или выборок. Но я предпочитаю статический способ вычисления. Я ввожу информацию в таблицу в HTML, и JavaScript вычисляет информацию и выводит информацию в ячейку таблицы. Вот код, который у меня есть для таблицы на данный момент (я знаю, что это не совсем лучший способ ее кодирования, я работаю над этим, я только что наткнулся на этот камень преткновения):

 <table>
<tr><td><font size="2"><strong>Retail Price:</strong></font></td>
<td name = "retailPrice" id="retailPrice"><font size="2"><del>$97.97</del></font></td></tr>

<tr><td><font size="2"><strong>Sale Price:</strong></font></td>
<td><font size="2"><del>$89.97</del></font></td></tr>

<tr><td><font size="3"><strong>Our Price:</strong></font></td>
<td name = "ourPrice" id="ourPrice"><font size="3" color="Red">$79.97</font></td></tr>
<tr><td><font size="2"><strong>You Save:</strong></font></td>
<td name = "yourSavings"><font font size="2" color="Red"></font></td></tr></table>
  

И вот единственный javascript, который я могу придумать, чтобы собрать воедино:

 <script type="text/javascript" >
$(function(){
var add = parseInt($("#retailPrice").val())   parseInt($("#ourPrice").val());
$("yourSavings").html(add);
}).keyup();
</script>
  

Я знаю, что, вероятно, я действительно ошибаюсь, но я подумал, что попробую заставить что-то работать, прежде чем обращаться за помощью. В принципе, мне нужно, чтобы скрипт взял значения в ячейке «ourPrice» и разделил их на значение в ячейке «retailPrice», затем вычел общую сумму из «1», чтобы получить сэкономленный процент, а затем вывел это в ячейку с именем «yourSavings». Я надеюсь, что это имеет смысл. Итак, в основном это работает следующим образом:

 (1-(ourPrice/retailPrice))
  

Любая помощь очень ценится.

Ответ №1:

val Метод предназначен для элементов формы, которые вы хотите использовать text для извлечения необработанного текста из ячеек вашей таблицы. Затем вы должны превратить это во что-то, что будут понимать анализаторы чисел, удалив нечисловой префикс:

 function money_to_number(raw) {
    return parseFloat(raw.replace(/.*$/, ''));
}
  

Также обратите внимание, что вы хотите, parseFloat а не parseInt поскольку вы имеете дело с нецелыми значениями. И вы хотите вычитать, а не добавлять, чтобы получить экономию.

Вам также понадобится id в ячейке, на которую вы ориентируетесь, используемый вами селектор ищет <yourSavings> элемент, а такого понятия не существует:

 <td name = "yourSavings" id="yourSavings">
    <font font size="2" color="Red">
    </font>
</td>
  

И вы захотите выбрать <font> внутри этого:

 $("#yourSavings font").html(savings);
  

Итак, ваш окончательный JavaScript должен выглядеть примерно так:

 function money_to_number(raw) {
    return parseFloat(raw.replace(/.*$/, ''));
}

var retail  = money_to_number($('#retailPrice').text());
var ours    = money_to_number($('#ourPrice').text());
var savings = retail - ours;
$("#yourSavings font").html(savings);
  

Форматирование savings и преобразование его в процент оставлено в качестве упражнения для читателя.

И живой пример:http://jsfiddle.net/ambiguous/bn7Wg /

Комментарии:

1. Хорошее регулярное выражение. Хотел бы я лучше разбираться в регулярных выражениях, это немного упростило бы подобные вещи. 1 для скрипта… Я забыл, что на моем : (

2. @mu слишком короткое Когда я редактирую свой код, чтобы отразить предложенные вами изменения, ничего не отображается. Я запускаю Firefox и у меня есть надстройка для веб-разработчика. Это говорит о том, что ‘$ не определено’… Я понятия не имею, почему это. Есть идея? Должен ли скрипт быть в заголовке? В настоящее время я запускаю его прямо перед таблицей. Это должно быть в другом месте?

3. @Michael: Вы используете библиотеку jQuery? У вас должно быть что-то подобное script type="text/javascript" src="jquery.js"></script> в <head> элементе вашего файла.

4. @mu слишком короткое, и здесь начинается самое интересное, потому что в нем нет элемента <head> . Я предполагаю, что для того, чтобы испортить причину, по которой я делаю это в надежде на способ обойти это, это для шаблона в списке eBay. Если я включу тег <head> в шаблон, eBay не позволит мне перечислить товар. Итак, я нашел всевозможные способы решения их проблемы с обеспечением правильного и простого проектирования. ага… Я не знаю, помогает ли это… Могу ли я запустить HTML-файл и, таким образом, включить тег <head> в тег <table>? Это было бы вариантом, если это возможно. Но тогда я не знаю, загрузится ли jQuery…

5. @Michael: Хорошо, я увидел некоторые jQuery внизу и подумал, что вы уже разобрались с этой частью. Можете ли вы вообще включить <script> теги в список eBay или jQuery уже доступен? И вам не нужно помещать <script> теги внутри <head> , вам может сойти с рук размещение их где угодно, прежде чем они будут использованы.

Ответ №2:

Звучит так, как будто вы пытаетесь написать Excel в формате HTML и JavaScript, который запускается в браузере.

Я думаю, что jQuery стоило бы изучить. Это фреймворк JavaScript для управления DOM от Джона Ресига. Это одна из лучших программ, когда-либо написанных отдельным человеком, и сегодня она используется всеми веб-разработчиками.

Комментарии:

1. Было бы довольно широким обобщением сказать, что jQuery используется всеми веб-разработчиками.

2. Если вы посмотрите на его первоначальный вопрос, похоже, что он пробовал какой-то jQuery. Ваш совет звучит разумно, но не все согласятся с «используемым всеми …»

Ответ №3:

Мне пришлось внести некоторые изменения в ваш исходный код, но попробуйте это (я убрал форматирование и знаки $, чтобы заставить математику работать:

 <table>
<tr><td><font size="2"><strong>Retail Price:</strong></font></td>
<td name="retailPrice" id="retailPrice">97.97</td></tr>

<tr><td><font size="2"><strong>Sale Price:</strong></font></td>
<td><font size="2"><del>$89.97</del></font></td></tr>

<tr><td><font size="3"><strong>Our Price:</strong></font></td>
<td name = "ourPrice" id="ourPrice"><font size="3" color="Red">79.97</font></td></tr>
<tr><td><font size="2"><strong>You Save:</strong></font></td>
<td name ="yourSavings" id="yourSavings"></td></tr>
</table>


var rp = $("#retailPrice").text();
var op = $("#ourPrice").text();
var add = parseFloat(rp) - parseFloat(op);    

$("#yourSavings").html(add);
  

Ответ №4:

Похоже, у вас хорошее начало. То, что вам, вероятно, нужно больше всего, — это последовательный и надежный способ извлечения числового значения из ячеек. Одна вещь, которую я бы определенно рекомендовал в этом направлении мыслей, — это уменьшить количество устаревших стилей HTML, которые вы выполняете встраиваемыми. <font> теги и тому подобное слишком тесно привязывают презентацию к структуре документа, затрудняя построение и поддержку взаимосвязи между данными и представлением.

Итак, давайте немного очистим код и посмотрим, есть ли у нас более четкая картина:

 <style>
  .title {
    font-size : 100%;
    font-weight : bold;
  }
  .big {
    font-size : 120%;
  }
  .sale {
    text-decoration : line-through;
  }
  .our {
    color : red;
  }
  .savings {
    color : red;
  }
</style>
<table>
  <tr>
    <td class="title">Retail Price:</td>
    <td class="price retail" id="retailPrice">$97.97</td>
  </tr>
  <tr>
    <td class="title">Sale Price:</td>
    <td class="price sale" id="salePrice">$89.97</td>
  </tr>
  <tr>
    <td class="big title">Our Price:</td>
    <td class="price our big" id="ourPrice">$79.97</td>
  </tr>
  <tr>
    <td class="title">You Save:</td>
    <td class="savings" id="yourSavings"></td>
  </tr>
</table>
  

Ага, теперь у нас есть четкая структура документа и хороший чистый способ отделить наши стили от нашего HTML. Убрав это с пути, мы можем сосредоточиться на данных и поведении:

 (function(){
// put all your JavaScript in a closure so you don't pollute the global namespace
  function extract_float_from_price ( price ) {
    return parseFloat( price.replace(/$/,'') );
  }

  function evaluate_savings ( ) {
    var retail = extract_float_from_price( $('#retailPrice').text() ),
        ours = extract_float_from_price( $('#ourPrice').text() );
    $('#yourSavings').text( parseInt( ( 1 - ( ours / retail ) ) * 100 )   '%' );
  }

  $( evaluate_savings ); // binds to Dom Ready
})()
  

http://jsfiddle.net/wd66b / содержит рабочий пример приведенного выше кода.