为什么我的 jQuery focusout(或模糊)事件没有被触发?
Why is my jQuery focusout (or blur) event not being fired?
在 jsfiddle here 的底部,我有这个 HTML:
<input type="text" id="BLAboxPaymentAmount" value="2">
</br>
<input type="text" id="BLAboxSection5Total" value="3">
..还有这个 jQuery:
$(document).on("focusout", '[id$=boxSection5Total]', function (e) {
var totalvalue = $(this).val();
//alert("boxSection5Total val is " + totalvalue);
var paymenttotalvalue = $('[id$=boxPaymentAmount]').val();
//alert("Payment Total val is " + paymenttotalvalue);
if (totalvalue !== paymenttotalvalue) {
alert("The value in 'Total' does not equal the previous value in 'Payment Total'");
} else {
alert("values ARE equal");
}
});
它在 jsfiddle 中工作正常,但事件没有在我的 Sharepoint 页面中触发 - 我在 boxPaymentAmount ("5") 中输入一个值,在 boxSection5Total ("6") 中输入另一个值,关闭 boxSection5Total,基于此 jQuery,我没有看到任何警报,这实际上与 jsfiddle 中的内容相同:
$(document).on("focusout", '[id$=boxSection5Total]', function (e) {
alert("focusout event has fired");
var totalvalue = $(this).val();
var paymenttotalvalue = $('[id$=boxPaymentAmount]').val();
if (totalvalue !== paymenttotalvalue) {
alert("The value in 'Total' does not equal the previous value in 'Payment Total'");
}
});
所以事件甚至没有被触发 - 为什么不呢?
我 运行 Chrome 和 F12d 中的页面,在控制台中查找错误消息,但发现 none.
更新
对于 A.(不是 "The")沃尔夫:
这就是我在代码隐藏中创建元素的方式:
boxPaymentAmount = new TextBox
{
CssClass = "dplatypus-webform-field-input"
};
我还在 jsfiddle 的 HTML 中将 "textarea" 更改为 "text"。
更新 2
乔纳森(不是罗素)克劳:
我将 jQuery 更改为以下内容:
$(document).on("blur", "[id$=boxSection5Total]", function (e) {
alert("blur event has fired");
console.log("blur event has fired");
var totalvalue = $(this).val();
var paymenttotalvalue = $('[id$=boxPaymentAmount]').val();
if (totalvalue !== paymenttotalvalue) {
alert("The value in 'Total' does not equal the previous value in 'Payment Total'");
console.log("The value in 'Total' does NOT equal the previous value in 'Payment Total'");
}
else {
console.log("The value in 'Total' DOES equal the previous value in 'Payment Total'");
}
});
...并且在该事件处理程序的控制台中仍然看不到任何内容。
更新 3
我有 许多 其他 functions/handlers 火得很好;所以为什么这个不是一个难题。也许如果我展示我得到的东西(省略一些血淋淋的细节),它可能会阐明正在发生的事情(失败的功能是 last/at 底部):
$(document).ready(function () {
console.log('The ready function has been reached; Requester and Payee Status sections should be slid up'); /* This is a "sanity check" so it can be verified that this jQuery script is running/ran */
});
/* NOTE: Things that need to take place after all the elements have been constructed need to go here; the ready function can be too early */
$(window).load(function () {
$('[id$=_AddressRows]').slideUp();
$('[id$=panelSection2]').slideUp();
$('[id$=panelSection3]').slideUp();
$('[id$=ddlPayToVendor]').hide();
});
/* NOTE: this checkbox is only visible if they are not already authenticated; If they select "Yes" (self-identify as UCSC Faculty, Staff, or Student), prompt them to log in */
$(document).on("change", '[id$=ckbxUCSCFacultyStaffOrStudent]', function () {
var ckd = this.checked;
. . . code elided for brevity
});
/* If user selects "payment for self" (they are seeking payment for themselves, as opposed to someone else), omit (invisibilize) sections 2 and 3 on the form TODO: Should I change these from "change" to "click" */
$(document).on("click", '[id$=rbPaymentForSelf]', function () {
if (this.checked) {
. . . code elided for brevity
}
});
/* If user selects "payment for someone else" (they are seeking payment for someone else, as opposed to themselves), make sections 2 and 3 on the form visible */
$(document).on("click", '[id$=rbPaymentForSomeoneElse]', function () {
if (this.checked) {
. . . code elided for brevity
}
});
$(document).on("click", '[id$=rbPaymentToIndividual]', function () {
if (this.checked) {
$('[id$=ddlPayToVendor]').slideUp();
$('[id$=ddlPayToIndividual]').slideDown();
}
});
$(document).on("click", '[id$=rbPaymentToVendor]', function () {
if (this.checked) {
$('[id$=ddlPayToIndividual]').slideUp();
$('[id$=ddlPayToVendor]').slideDown();
}
});
// Refactor this to populate the elements below (description, account codes, tax 1099); may pull from Lists rather than use the hardcoded vals, but if need to do the latter, see http://jsfiddle.net/clayshannon/x8npcpss/3/
$(document).on("change", '[id$=ddlPayToIndividual]', function () {
var value = $(this).val();
. . . code elided for brevity
});
// Refactor this ... (see comment above)
$(document).on("change", '[id$=ddlPayToVendor]', function () {
var value = $(this).val();
. . . code elided for brevity
});
/* Disallow anything other than 0..9 in the "SSN or ITIN" textbox */
$(document).on("keypress", '[id$=txtbxSSNOrITIN]', function (e) {
var k = e.which;
if (k < 48 || k > 57) { e.preventDefault(); }
});
$(document).on("click", '[id$=btnAddFoapalRow]', function (e) {
var textboxHeight = 15;
. . . code elided for brevity
});
$(document).on("keyup", "[id$=explainPaymentTextBox]", function (e) {
console.log("explainPaymentTextBox keyup reached");
while ($(this).outerHeight() < this.scrollHeight + parseFloat($(this).css("borderTopWidth")) + parseFloat($(this).css("borderBottomWidth"))) {
$(this).height($(this).height() + 1);
};
});
HERE IS THE RECALCITRANT ONE (DOESN'T FIRE):
/* Verify that amount in "Total" equals amount in Section 1 "Payment Amount"; this is not working at present; I first tried "focusout" instead of "blur" but neither event fires... */
$(document).on("blur", "[id$=boxSection5Total]", function (e) {
alert("boxSection5Total's blur event has fired");
console.log("boxSection5Total's blur event has fired");
var totalvalue = $(this).val();
var paymenttotalvalue = $('[id$=boxPaymentAmount]').val();
if (totalvalue !== paymenttotalvalue) {
alert("The value in 'Total' does not equal the previous value in 'Payment Total'");
console.log("The value in 'Total' does NOT equal the previous value in 'Payment Total'");
}
else {
console.log("The value in 'Total' DOES equal the previous value in 'Payment Total'");
}
});
您是否尝试过使用 blur
而不是 focusout
?可以找到这两个事件之间的区别 here,在您的情况下,您只想捕获文本区域的事件,因为它里面没有任何项目。
这是一个 "rookie mistake" - 我忘记为元素分配 ID。一旦我更改了代码:
boxSection5Total = new TextBox()
{
CssClass = "dplatypus-webform-field-input"
};
this.Controls.Add(boxSection5Total);
...为此:
boxSection5Total = new TextBox()
{
CssClass = "dplatypus-webform-field-input",
ID = "boxSection5Total"
};
this.Controls.Add(boxSection5Total);
...我看到了进入活动的提醒
因此 UPDATE 显示了错误代码,尽管需要习惯于在 C# 中动态创建 html 元素的人才能捕捉到它。
对于 "full disclosure,",这里是 jQuery 现在的状态(按设计工作):
$(document).on("blur", "[id$=boxSection5Total]", function (e) {
var totalvalue = $(this).val();
var paymenttotalvalue = $('[id$=boxPaymentAmount]').val();
if (totalvalue !== paymenttotalvalue) {
console.log("The value in 'Total' does not equal the previous value in 'Payment Total'");
alert("The value in 'Total' does NOT equal the previous value in 'Payment Total'");
}
else {
console.log("The value in 'Total' DOES equal the previous value in 'Payment Total'");
}
});
这个"dawned on me"当我"inspected element"在F12工具里看到:
<input name="ctl00$ctl24$g_5f3fedca_19f7_4bc3_b84e_efbef0c48a33$ctl00$ctl153" type="text" class="dplatypus-webform-field-input">
(无 ID)。
在 jsfiddle here 的底部,我有这个 HTML:
<input type="text" id="BLAboxPaymentAmount" value="2">
</br>
<input type="text" id="BLAboxSection5Total" value="3">
..还有这个 jQuery:
$(document).on("focusout", '[id$=boxSection5Total]', function (e) {
var totalvalue = $(this).val();
//alert("boxSection5Total val is " + totalvalue);
var paymenttotalvalue = $('[id$=boxPaymentAmount]').val();
//alert("Payment Total val is " + paymenttotalvalue);
if (totalvalue !== paymenttotalvalue) {
alert("The value in 'Total' does not equal the previous value in 'Payment Total'");
} else {
alert("values ARE equal");
}
});
它在 jsfiddle 中工作正常,但事件没有在我的 Sharepoint 页面中触发 - 我在 boxPaymentAmount ("5") 中输入一个值,在 boxSection5Total ("6") 中输入另一个值,关闭 boxSection5Total,基于此 jQuery,我没有看到任何警报,这实际上与 jsfiddle 中的内容相同:
$(document).on("focusout", '[id$=boxSection5Total]', function (e) {
alert("focusout event has fired");
var totalvalue = $(this).val();
var paymenttotalvalue = $('[id$=boxPaymentAmount]').val();
if (totalvalue !== paymenttotalvalue) {
alert("The value in 'Total' does not equal the previous value in 'Payment Total'");
}
});
所以事件甚至没有被触发 - 为什么不呢?
我 运行 Chrome 和 F12d 中的页面,在控制台中查找错误消息,但发现 none.
更新
对于 A.(不是 "The")沃尔夫:
这就是我在代码隐藏中创建元素的方式:
boxPaymentAmount = new TextBox
{
CssClass = "dplatypus-webform-field-input"
};
我还在 jsfiddle 的 HTML 中将 "textarea" 更改为 "text"。
更新 2
乔纳森(不是罗素)克劳:
我将 jQuery 更改为以下内容:
$(document).on("blur", "[id$=boxSection5Total]", function (e) {
alert("blur event has fired");
console.log("blur event has fired");
var totalvalue = $(this).val();
var paymenttotalvalue = $('[id$=boxPaymentAmount]').val();
if (totalvalue !== paymenttotalvalue) {
alert("The value in 'Total' does not equal the previous value in 'Payment Total'");
console.log("The value in 'Total' does NOT equal the previous value in 'Payment Total'");
}
else {
console.log("The value in 'Total' DOES equal the previous value in 'Payment Total'");
}
});
...并且在该事件处理程序的控制台中仍然看不到任何内容。
更新 3
我有 许多 其他 functions/handlers 火得很好;所以为什么这个不是一个难题。也许如果我展示我得到的东西(省略一些血淋淋的细节),它可能会阐明正在发生的事情(失败的功能是 last/at 底部):
$(document).ready(function () {
console.log('The ready function has been reached; Requester and Payee Status sections should be slid up'); /* This is a "sanity check" so it can be verified that this jQuery script is running/ran */
});
/* NOTE: Things that need to take place after all the elements have been constructed need to go here; the ready function can be too early */
$(window).load(function () {
$('[id$=_AddressRows]').slideUp();
$('[id$=panelSection2]').slideUp();
$('[id$=panelSection3]').slideUp();
$('[id$=ddlPayToVendor]').hide();
});
/* NOTE: this checkbox is only visible if they are not already authenticated; If they select "Yes" (self-identify as UCSC Faculty, Staff, or Student), prompt them to log in */
$(document).on("change", '[id$=ckbxUCSCFacultyStaffOrStudent]', function () {
var ckd = this.checked;
. . . code elided for brevity
});
/* If user selects "payment for self" (they are seeking payment for themselves, as opposed to someone else), omit (invisibilize) sections 2 and 3 on the form TODO: Should I change these from "change" to "click" */
$(document).on("click", '[id$=rbPaymentForSelf]', function () {
if (this.checked) {
. . . code elided for brevity
}
});
/* If user selects "payment for someone else" (they are seeking payment for someone else, as opposed to themselves), make sections 2 and 3 on the form visible */
$(document).on("click", '[id$=rbPaymentForSomeoneElse]', function () {
if (this.checked) {
. . . code elided for brevity
}
});
$(document).on("click", '[id$=rbPaymentToIndividual]', function () {
if (this.checked) {
$('[id$=ddlPayToVendor]').slideUp();
$('[id$=ddlPayToIndividual]').slideDown();
}
});
$(document).on("click", '[id$=rbPaymentToVendor]', function () {
if (this.checked) {
$('[id$=ddlPayToIndividual]').slideUp();
$('[id$=ddlPayToVendor]').slideDown();
}
});
// Refactor this to populate the elements below (description, account codes, tax 1099); may pull from Lists rather than use the hardcoded vals, but if need to do the latter, see http://jsfiddle.net/clayshannon/x8npcpss/3/
$(document).on("change", '[id$=ddlPayToIndividual]', function () {
var value = $(this).val();
. . . code elided for brevity
});
// Refactor this ... (see comment above)
$(document).on("change", '[id$=ddlPayToVendor]', function () {
var value = $(this).val();
. . . code elided for brevity
});
/* Disallow anything other than 0..9 in the "SSN or ITIN" textbox */
$(document).on("keypress", '[id$=txtbxSSNOrITIN]', function (e) {
var k = e.which;
if (k < 48 || k > 57) { e.preventDefault(); }
});
$(document).on("click", '[id$=btnAddFoapalRow]', function (e) {
var textboxHeight = 15;
. . . code elided for brevity
});
$(document).on("keyup", "[id$=explainPaymentTextBox]", function (e) {
console.log("explainPaymentTextBox keyup reached");
while ($(this).outerHeight() < this.scrollHeight + parseFloat($(this).css("borderTopWidth")) + parseFloat($(this).css("borderBottomWidth"))) {
$(this).height($(this).height() + 1);
};
});
HERE IS THE RECALCITRANT ONE (DOESN'T FIRE):
/* Verify that amount in "Total" equals amount in Section 1 "Payment Amount"; this is not working at present; I first tried "focusout" instead of "blur" but neither event fires... */
$(document).on("blur", "[id$=boxSection5Total]", function (e) {
alert("boxSection5Total's blur event has fired");
console.log("boxSection5Total's blur event has fired");
var totalvalue = $(this).val();
var paymenttotalvalue = $('[id$=boxPaymentAmount]').val();
if (totalvalue !== paymenttotalvalue) {
alert("The value in 'Total' does not equal the previous value in 'Payment Total'");
console.log("The value in 'Total' does NOT equal the previous value in 'Payment Total'");
}
else {
console.log("The value in 'Total' DOES equal the previous value in 'Payment Total'");
}
});
您是否尝试过使用 blur
而不是 focusout
?可以找到这两个事件之间的区别 here,在您的情况下,您只想捕获文本区域的事件,因为它里面没有任何项目。
这是一个 "rookie mistake" - 我忘记为元素分配 ID。一旦我更改了代码:
boxSection5Total = new TextBox()
{
CssClass = "dplatypus-webform-field-input"
};
this.Controls.Add(boxSection5Total);
...为此:
boxSection5Total = new TextBox()
{
CssClass = "dplatypus-webform-field-input",
ID = "boxSection5Total"
};
this.Controls.Add(boxSection5Total);
...我看到了进入活动的提醒
因此 UPDATE 显示了错误代码,尽管需要习惯于在 C# 中动态创建 html 元素的人才能捕捉到它。
对于 "full disclosure,",这里是 jQuery 现在的状态(按设计工作):
$(document).on("blur", "[id$=boxSection5Total]", function (e) {
var totalvalue = $(this).val();
var paymenttotalvalue = $('[id$=boxPaymentAmount]').val();
if (totalvalue !== paymenttotalvalue) {
console.log("The value in 'Total' does not equal the previous value in 'Payment Total'");
alert("The value in 'Total' does NOT equal the previous value in 'Payment Total'");
}
else {
console.log("The value in 'Total' DOES equal the previous value in 'Payment Total'");
}
});
这个"dawned on me"当我"inspected element"在F12工具里看到:
<input name="ctl00$ctl24$g_5f3fedca_19f7_4bc3_b84e_efbef0c48a33$ctl00$ctl153" type="text" class="dplatypus-webform-field-input">
(无 ID)。