3 回答

TA貢獻1906條經驗 獲得超10個贊
這在某種程度上是一種競爭條件。
在document.ready事件中,您正在設置點擊事件處理程序
在單擊處理程序中,您正在設置focusout事件處理程序
由于單擊處理程序仍在執行,因此代碼立即運行以顯示 scart 和 formname 的值。
那時,formname仍然是空的,因為當前函數(單擊事件處理程序)仍在執行,并且 focusout 事件即使觸發,也會在執行該代碼后觸發。
您應該將focusout處理程序聲明代碼移到單擊處理程序代碼之外,然后將在 document.ready() 事件上設置兩個處理程序。
以下是正在發生的事情和時間的細分:
var formname;
$(document).ready(function() {
這在加載 DOM 時觸發(document.ready事件)
$(document).on('click', '#check_out_cart', function(){
當用戶點擊某個帶有 ID 的元素時會觸發 check_out_cart
$('input#namef').on('focusout', function(){
此事件處理程序僅在用戶單擊購物車時設置,但尚未執行!
formname= $('input#namef').val();
console.log(formname);
});
一旦為 設置了事件處理程序,此代碼就會觸發focusout,但仍未執行。即使focusout觸發了一個事件,它也只會在當前函數退出時執行。
var scart_add = $("input[name='scart_add']").val();
console.log("Scart value is "+scart_add);
正確地,此時您將看到它formname是空的。
console.log("Name is "+formname);
...
});
});
希望這能解釋您所看到的流程;
在 Ryan Wilson 的回答中快速修復,將焦點處理程序聲明移動到單擊處理程序之外的 document.ready 處理程序的范圍內。

TA貢獻2036條經驗 獲得超8個贊
使用Unable to fetch values from an input element in Bootstrap's popover 中的解決方案,我能夠調整我的 JS 代碼,以使用 popover JS 添加的 .popover-content 類中的 .find 來獲取值。
var formname;
var formemail;
$(document).ready(function() {
//shopping cart
/*load functions*/
load_product();
load_cart_data();
$('#cart-popover').popover({
html : true,
container: 'body',
content:function(){
return $('#popover_content_wrapper').html();
}
});
$(document).on('click', '#cart-popover', function(){
$('input#namef').focus();
});
$(document).on('focusout', '#namef', function(){
formname = $('.popover-content').find('#namef').val();
});
$(document).on('focusout', '#emailf', function(){
formemail = $('.popover-content').find('#emailf').val();
});
$(document).on('click', '#check_out_cart', function(){
var scart_add = $("input[name='scart_add']").val();
var nameval = $("input#namef").val();
alert("Scart value is "+scart_add);
alert("Name is "+formname);
alert("Email is "+formemail);
});
});
添加回答
舉報