【问题标题】:HTML button that's submitting an empty field even though it shouldn't be提交空字段的 HTML 按钮,即使它不应该是
【发布时间】:2016-06-24 02:55:51
【问题描述】:

这是我正在使用的 HTML 按钮:

<b>Other: </b><input type="number" id="AmntValue" data-target-element-id="SubmitAmnt" data-target-parameter="Amnt" onchange="setValueOnTarget(this);' +/* ' enableButton(SubmitAmnt);' */+ '"> 
<button class="button2" id="SubmitAmnt"  type="button" data-redirect-src="https://hub.deltasigmapi.org/donations/donations.aspx?appealid=1989&NumberOfPaymentsDisplay=0&GiftRecurrenceDisplay=0&GiftRecurrence=onetime&GiftAmount=" onclick="disableButton(this); addValueToQueryString(this); redirectPage(this);">Continue To Payment</button>

当有人点击按钮但“其他”文本字段为空白时,它应该重定向,而是显示错误消息。现在会显示错误消息,但只是在它重定向之前的一小会儿。

这是我完整的 JavaScript 代码:

function setValueOnTarget(sourceElem) {
    var targetId = sourceElem.getAttribute('data-target-element-id');
    if (targetId) {
        var targetElem = document.getElementById(targetId);
        if (targetElem) {
            var valueToSet;
            var parameterToSet;
            if (sourceElem.nodeName.toUpperCase() == 'SELECT') {
                valueToSet = sourceElem.options[sourceElem.selectedIndex].value;
            }
            if (sourceElem.nodeName.toUpperCase() == 'INPUT') {
                if (sourceElem.type.toUpperCase() == 'NUMBER' || sourceElem.type.toUpperCase() == 'TEXT') {
                    valueToSet = sourceElem.value;
                }
            }
            targetElem.setAttribute('data-value-set-by-other-element', valueToSet);
            parameterToSet = sourceElem.getAttribute('data-target-parameter');
            targetElem.setAttribute('data-target-parameter', parameterToSet);
            EnableButton(targetElem)
        }
    }
}

function disableButton(btn) {
    btn.disabled = true;
}

function EnableButton(btn) {
    btn.disabled = false;
}

function addValueToQueryString(elem) {
    var src = elem.getAttribute('data-redirect-src');
    var newValue = elem.getAttribute('data-value-set-by-other-element');
    var parameter = elem.getAttribute('data-target-parameter');
    if (newValue && parameter) {
        if (src && newValue && parameter) {
            var newSrc;
            newSrc = src + newValue;
            elem.setAttribute('data-redirect-src', newSrc);
        } else {
            displayError('Could not find the URL to redirect to');
        }
    } else {
        displayError('No value or parameter has been set. Please set a proper value.');
    }
}

function redirectPage(elem) {
    var src = elem.getAttribute('data-redirect-src');
    window.location = src;
}

function displayError(message) {
    var userMessage = document.getElementById('userMessage');
    userMessage.innerHTML = message;
    userMessage.style.backgroundColor = 'red';
    userMessage.style.color = 'white';
    userMessage.style.display = 'block';
}

function displaySuccess(message) {
    var userMessage = document.getElementById('userMessage1');
    userMessage.innerHTML = message;
    userMessage.style.backgroundColor = 'green';
    userMessage.style.color = 'white';
    userMessage.style.display = 'block';
}

我不确定我放在按钮或 JavaScript 中的代码是否有问题。任何和所有的帮助将不胜感激!

【问题讨论】:

  • 你需要删除redirectPage(this);从 onclick 并根据成功将其添加到 addValueToQueryString(elem) 函数。因此,如果 addValueToQueryString() 没有引发错误,则触发 redirectPage()
  • 应该避免标记中的代码的另一个原因。

标签: javascript html button htmlbutton


【解决方案1】:

默认禁用按钮

button 应默认禁用,并且仅应在检测到预期的input 值时启用。在您的示例中,您似乎已经有了一个机制,但是您首先需要克服一些障碍:

  1. button 默认应该是 disabled。在 HTML 中执行此操作:
    &lt;button disabled …&gt;Continue To Payment&lt;/button&gt;
  2. inputonchange 处理程序应该只调用setValueOnTarget(),因为这个函数已经调用了EnableButton()。在 HTML 中:
    &lt;input onchange="setValueOnTarget(this);" … &gt;
  3. buttononclick 处理程序中删除对redirectPage() 的调用,并在为newSrc 赋值后将其移至addValueToQueryString()
  4. 如果您希望允许用户修改input,请在调用displayError() 后添加对EnableButton() 的调用,然后重试。

例如:

function setValueOnTarget(sourceElem) {
    var targetId = sourceElem.getAttribute('data-target-element-id');
    if (targetId) {
        var targetElem = document.getElementById(targetId);
      console.log(targetElem);
        if (targetElem) {
            var valueToSet;
            var parameterToSet;
            if (sourceElem.nodeName.toUpperCase() == 'SELECT') {
                valueToSet = sourceElem.options[sourceElem.selectedIndex].value;
            }
            if (sourceElem.nodeName.toUpperCase() == 'INPUT') {
                if (sourceElem.type.toUpperCase() == 'NUMBER' || sourceElem.type.toUpperCase() == 'TEXT') {
                    valueToSet = sourceElem.value;
                }
            }
            targetElem.setAttribute('data-value-set-by-other-element', valueToSet);
            parameterToSet = sourceElem.getAttribute('data-target-parameter');
            targetElem.setAttribute('data-target-parameter', parameterToSet);
            EnableButton(targetElem);
        }
    }
}

function disableButton(btn) {
    btn.disabled = true;
}

function EnableButton(btn) {
    btn.disabled = false;
}

function addValueToQueryString(elem) {
    var src = elem.getAttribute('data-redirect-src');
    var newValue = elem.getAttribute('data-value-set-by-other-element');
    var parameter = elem.getAttribute('data-target-parameter');
    if (newValue && parameter) {
        if (src && newValue && parameter) {
            var newSrc;
            newSrc = src + newValue;
            elem.setAttribute('data-redirect-src', newSrc);
            redirectPage(elem);
        } else {
            displayError('Could not find the URL to redirect to');
        }
    } else {
        displayError('No value or parameter has been set. Please set a proper value.');
        EnableButton(elem);
    }
}

function redirectPage(elem) {
    var src = elem.getAttribute('data-redirect-src');
    window.location = src;
}

function displayError(message) {
    var userMessage = document.getElementById('userMessage');
    userMessage.innerHTML = message;
    userMessage.style.backgroundColor = 'red';
    userMessage.style.color = 'white';
    userMessage.style.display = 'block';
}
<b>Other: </b>
<input
       type="number"
       id="AmntValue"
       data-target-element-id="SubmitAmnt"
       data-target-parameter="Amnt"
       onchange="setValueOnTarget(this);"> 
<button
        disabled
        class="button2" 
        id="SubmitAmnt"
        type="button"
        data-redirect-src="https://hub.deltasigmapi.org/donations/donations.aspx?appealid=1989&NumberOfPaymentsDisplay=0&GiftRecurrenceDisplay=0&GiftRecurrence=onetime&GiftAmount="
        onclick="disableButton(this); addValueToQueryString(this);">Continue To Payment</button>

<div id="userMessage"></div>

【讨论】:

  • 我只是想反驳说,在某些情况下,这一直是我所从事的产品的可用性问题。在必填字段未立即明确的非常大的表单中,当人们看到“提交”被禁用时,他们不确定该去哪里。启用它并在提交时执行验证意味着页面会显示对遗漏的任何内容的更改(并希望向上滚动)。
  • 当然,如果这是一个非常大的表格,我可能会给出不同的答案。孤立地,我们只有一个输入和一个按钮。很明显,在您做出某种输入之前,您无法提交。在这种情况下,只需输入一个数字即可启用该按钮。关于这个脚本,我还会更改其他几件事,但我试图尽可能地尊重 OP 的初衷。并且代码已经包含了这个功能,但是没有正确实现。
  • gfullam,非常感谢!我知道我有我想要的基础;我没有意识到我只是错误地放置了代码,如果你愿意的话。我感谢您的帮助,一切正常,现在应该如此!至于可用性问题,我同意在更大的表单上需要更多内容,但此脚本适用于您在此处看到的单个输入字段。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 2015-08-07
  • 1970-01-01
  • 2013-10-29
相关资源
最近更新 更多