【问题标题】:calculating form field input value from other values with onfocus使用 onfocus 从其他值计算表单字段输入值
【发布时间】:2018-10-06 12:08:04
【问题描述】:

第一次来电,长期听话.. 我试图在通过表单操作按钮将表单提交到我的数据库之前计算 php 表单上的两个用户填写的输入字段以确定另一个输入字段的值。我更喜欢在字段中使用标签,并通过 onfocus 自动计算,就像在我的 msaccess 表单中所做的那样。

这是我所能得到的最接近的。它需要一个按钮并使用文本区域,而不是输入。我愿意使用 ajax,我不想在外部链接 .js 文件

这是一个Fiddle,它可以完成这项工作,但需要点击,而不是表单“输入”。如果我将表单字段从 textarea 更改为 input,它将停止工作。

edit - 我希望字段类型为“输入”而不是“文本区域”是不是错了?

HTML:

<ul class="form-section">
 <li class="form-line" >
  <label for="WG_Collected">WG Collected</label>
  <div>
  <input type="number" id="WG_Collected" name="WG_Collected" value="15.0" min="0" step="0.1" required>
  </div>
 </li>
 <li class="form-line" >
  <label for="Proof">Proof</label>
   <div>
   <input type="number" id="Proof" name="Proof" Value="79.4" min="0" step="0.1" required>
   </div>
 </li>
 <li class="form-line" >
  <label for="PG_Collected">PG Collected</label>
   <div>
   <textarea type="number" id="PG_Collected" name="PG_Collected"></textarea>
   </div>
  <input type="button" value="Calculate PG" id="submitButton" />
 </li>
</ul>

脚本

var button = document.getElementById("submitButton");
button.addEventListener("click", function() {
 var num1 = document.getElementById('WG_Collected').value;
 var num2 = document.getElementById('Proof').value;
 var PG_Collected = parseFloat(num1) * parseFloat(num2)/100;
 document.getElementById('PG_Collected').innerHTML = PG_Collected.toFixed(2);
 }, true);

【问题讨论】:

  • 您是否查看了字段上的changekeyup 事件来触发您的功能?
  • 我希望在我点击该字段时进行计算...在其他字段更改时更改它是不可取的,但我会探索。 Chris G - 那个文件是非操作性的 - 更正,直到我输入其他值字段时它才起作用,当我在字段中输入时它不起作用,我不确定这是否直观,但它可能会更好比我有的,谢谢。

标签: javascript php ajax forms


【解决方案1】:

input 事件将触发值更改

https://developer.mozilla.org/en-US/docs/Web/Events/input

function PGCollectedCalc() {
    var num1 = document.getElementById('WG_Collected').value;
    var num2 = document.getElementById('Proof').value;
    var PG_Collected = parseFloat(num1) * parseFloat(num2)/100;
    document.getElementById('PG_Collected').innerHTML = PG_Collected.toFixed(2);
}

document.getElementById("WG_Collected").addEventListener("input", PGCollectedCalc, true);
document.getElementById("Proof").addEventListener("input", PGCollectedCalc, true);

input 的原因是 change 只有在您从输入中移除焦点后才会触发。 http://jsfiddle.net/1wrnL3jp/4/http://jsfiddle.net/1wrnL3jp/5/

【讨论】:

  • 谢谢,好像比我的好!我希望在焦点上完成计算,就像在切换时一样......而且,我希望该字段是“输入”,而不是“文本区域”。当我在任何一个小提琴中更改它时,它都会停止工作。
  • 我把你的小提琴放在我的系统上,甚至被剥得光秃秃的,我不能让它像在 jsfiddle 上那样工作,有什么线索吗? Here is a jsfiddle 我的页面是什么样子的,不确定 fiddle 是否允许在 html 部分使用脚本,但它不起作用。
  • 问题是javascript在输入出现在页面之前执行。您需要delay your javascript execution,或将您的脚本移至表格之后。例如jsfiddle.net/L69yaj30/2jsfiddle.net/L69yaj30/1
【解决方案2】:

http://jsfiddle.net/7mwge85c/

HTML

<ul class="form-section">
 <li class="form-line" >
  <label for="WG_Collected">WG Collected</label>
  <div>
  <input type="number" id="WG_Collected" name="WG_Collected" value="15.0" min="0" step="0.1" required>
  </div>
 </li>
 <li class="form-line" >
  <label for="Proof">Proof</label>
   <div>
   <input type="number" id="Proof" name="Proof" Value="79.4" min="0" step="0.1" required>
   </div>
 </li>
 <li class="form-line" >
  <label for="PG_Collected">PG Collected</label>
   <div>
   <textarea type="number" id="PG_Collected" name="PG_Collected"></textarea>
   </div>
  <input type="button" value="Calculate PG" id="submitButton" />
 </li>
</ul>

使用 keyup 或 onfocus(focus) 的脚本

var button = document.getElementById("submitButton");
var inputOne = document.getElementById("WG_Collected");
var inputTwo = document.getElementById("Proof");

//keyup if you press any key
inputOne.addEventListener("keyup", function() {
    calcPG();
}, true);
inputTwo.addEventListener("keyup", function() {
    calcPG();
}, true);

//if some of the inputs get focus
inputOne.addEventListener("focus", function() {
    calcPG();
}, true);
inputTwo.addEventListener("focus", function() {
    calcPG();
}, true);

//your button click
button.addEventListener("click", function() {
    calcPG();
 }, true);

function calcPG (){
    var num1 = document.getElementById('WG_Collected').value;
    var num2 = document.getElementById('Proof').value;
    var PG_Collected = parseFloat(num1) * parseFloat(num2)/100;
    document.getElementById('PG_Collected').innerHTML = PG_Collected.toFixed(2);
}

【讨论】:

  • 我希望它与要输入的字段类型一起使用是不正确的吗?
  • 我尝试在我的环境中使用它,我什至把它降到最低限度,但它不起作用,我所拥有的基本上就像this fork of your fiddle。有什么线索说明它不起作用吗?
  • 不,两个版本都应该工作...但是如果您使用输入字段,则需要设置值,而不是 innerHTML(并且输入字段更可定制,例如您可以使用的只读选项用于您的 PG_Collected)。该代码不起作用,因为您没有加载代码,因此不会设置任何侦听器。我添加了一个简单的 window.onload = function(){}。这里的工作小提琴:jsfiddle.net/ztLddcqf/4
猜你喜欢
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
相关资源
最近更新 更多