Man ir neliela problēma ar jquery $.ajax() funkciju.
Man ir veidlapa, kurā katrs radio pogas klikšķis vai izvēle no nolaižamajā izvēlnē rada sesijas mainīgo ar izvēlēto vērtību.
Tagad - man ir viena no nolaižamajām izvēlnēm, kurā ir 4 opcijas - pirmajai (ar etiķeti None) ir value="" pārējām ir to id.
Es gribu, lai None opcija (ar tukšu vērtību) noņemtu sesiju, bet pārējās - lai izveidotu sesiju, bet tikai tad, ja sesija ar šo konkrēto izvēles nosaukumu vēl nepastāv - jo visām pārējām opcijām ir piešķirta tāda pati summa - tā tikai norāda, kura no tām tika izvēlēta.
Neesmu pārliecināts, vai tas ir saprotams, bet paskatieties kodu - varbūt tas padarīs to skaidrāku:
$("#add_ons select").change(function() {
// get current price of the addons
var order_price_addon = $(".order_price_addon").text();
// get price of the clicked radio button from the rel attribute
var add = $(this).children('option').attr('label');
var name = $(this).attr('name');
var val = $(this).val();
if(val == "") {
var price = parseInt(order_price_addon) - parseInt(add);
removeSession(name);
} else {
if(isSession(name) == 0) {
var price = parseInt(order_price_addon) + parseInt(add);
}
setSession(name, val);
}
$(".order_price_addon").html(price);
setSession('order_price_addon', price);
updateTotal();
});
Tātad - pirmkārt, kad #add_ons izvēlnes izvēle aktivizē "change", mēs iegūstam dažas vērtības no dažiem elementiem aprēķiniem.
mēs iegūstam opcijas etiķetes atribūtu no mūsu select, kurā tiek saglabāta vērtība, kas jāpieskaita kopsummai, select nosaukumu, lai izveidotu sesiju ar šo nosaukumu un vērtību, lai vēlāk pārbaudītu, kurš no tiem tika izvēlēts.
tagad - pārbaudām, vai val == "" (kas norādītu, ka nav izvēlēta neviena opcija), un atskaitām summu no kopsummas, kā arī noņemam sesiju ar sekta nosaukumu.
Pēc tam sākas problēma - else paziņojums.
Else - mēs vēlamies pārbaudīt, vai funkcija isSession() ar mūsu selektora nosaukumu atdod 0 vai 1 - ja tā atdod 0, tad mēs summai pieskaitām etiķetes atribūtā saglabāto vērtību, bet, ja tā atdod 1 - tas liecinātu, ka sesija jau pastāv - tad mēs tikai mainām šīs sesijas vērtību, to atjaunojot, bet summa tai netiek pieskaitīta.
Tagad funkcija isSession izskatās šādi:
function isSession(selector) {
$.ajax({
type: "POST",
url: '/order.html',
data: ({ issession : 1, selector: selector }),
dataType: "html",
success: function(data) {
return data;
},
error: function() {
alert('Error occured');
}
});
}
Tagad - problēma ir tāda, ka es nezinu, vai, izmantojot "return", tiks atgriezts funkcijas rezultāts, jo šķiet, ka tas nedarbojas, tomēr, ja es ievietoju "data" sekcijā success: brīdinājumā, šķiet, ka tiek atgriezta pareizā vērtība.
Vai kāds zina, kā atgriezt vērtību no funkcijas un pēc tam to salīdzināt nākamajā paziņojumā?
Paldies, puiši - es esmu mēģinājis to šādā veidā:
function isSession(selector) {
$.ajax({
type: "POST",
url: '/order.html',
data: ({ issession : 1, selector: selector }),
dataType: "html",
success: function(data) {
updateResult(data);
},
error: function() {
alert('Error occured');
}
});
}
tad updateResult() funkcija:
funkcija updateResult(data) { result = data; }
result - ir globālais mainīgais, kuru es pēc tam mēģinu nolasīt:
$("#add_ons select").change(function() {
// get current price of the addons
var order_price_addon = $(".order_price_addon").text();
// get price of the clicked radio button from the rel attribute
var add = $(this).children('option').attr('label');
var name = $(this).attr('name');
var val = $(this).val();
if(val == "") {
var price = parseInt(order_price_addon) - parseInt(add);
removeSession(name);
} else {
isSession(name);
if(result == 0) {
var price = parseInt(order_price_addon) + parseInt(add);
}
setSession(name, val);
}
$(".order_price_addon").html(price);
setSession('order_price_addon', price);
updateTotal();
});
bet kaut kāda iemesla dēļ - tas nedarbojas - kāda ideja?
Problēma ir tā, ka nevarat atgriezt vērtību no asinhronā izsaukuma, piemēram, AJAX pieprasījuma, un sagaidīt, ka tas darbosies.
Iemesls ir tāds, ka līdz atbildes saņemšanas brīdim kods, kas gaida atbildi, jau ir izpildīts.
Šīs problēmas risinājums ir nepieciešamā koda *ievietošana success:
atpakaļsaukumā. Tādējādi tas piekļūst datiem
tikai tad, kad tie ir pieejami.
function isSession(selector) {
$.ajax({
type: "POST",
url: '/order.html',
data: ({ issession : 1, selector: selector }),
dataType: "html",
success: function(data) {
// Run the code here that needs
// to access the data returned
return data;
},
error: function() {
alert('Error occured');
}
});
}
Cita iespēja (kas faktiski ir tas pats) ir izsaukt funkciju jūsu success:
izsaukuma atgriezeniskajā saitē, kas nodod datus, kad tie ir pieejami.
function isSession(selector) {
$.ajax({
type: "POST",
url: '/order.html',
data: ({ issession : 1, selector: selector }),
dataType: "html",
success: function(data) {
// Call this function on success
someFunction( data );
return data;
},
error: function() {
alert('Error occured');
}
});
}
function someFunction( data ) {
// Do something with your data
}
Ir vairāki veidi, kā iegūt jQuery AJAX atbildi. Es dalīšos ar jums ar divām izplatītākajām pieejām:
Pirmā: Pirmā:
izmantojiet async=false un funkcijas ietvaros atdodiet ajax-objektu un vēlāk iegūstiet atbilde ajax-object.responseText
/**
* jQuery ajax method with async = false, to return response
* @param {mix} selector - your selector
* @return {mix} - your ajax response/error
*/
function isSession(selector) {
return $.ajax({
type: "POST",
url: '/order.html',
data: {
issession: 1,
selector: selector
},
dataType: "html",
async: !1,
error: function() {
alert("Error occured")
}
});
}
// global param
var selector = !0;
// get return ajax object
var ajaxObj = isSession(selector);
// store ajax response in var
var ajaxResponse = ajaxObj.responseText;
// check ajax response
console.log(ajaxResponse);
// your ajax callback function for success
ajaxObj.success(function(response) {
alert(response);
});
Sekundes:
izmantot $.extend metodi un izveidojiet jaunu funkciju, piemēram, ajax
/**
* xResponse function
*
* xResponse method is made to return jQuery ajax response
*
* @param {string} url [your url or file]
* @param {object} your ajax param
* @return {mix} [ajax response]
*/
$.extend({
xResponse: function(url, data) {
// local var
var theResponse = null;
// jQuery ajax
$.ajax({
url: url,
type: 'POST',
data: data,
dataType: "html",
async: false,
success: function(respText) {
theResponse = respText;
}
});
// Return the response text
return theResponse;
}
});
// set ajax response in var
var xData = $.xResponse('temp.html', {issession: 1,selector: true});
// see response in console
console.log(xData);
Jūs varat to izveidot tik lielu, cik vēlaties...
Tas ir diezgan vecs un neglīts, nedariet to. Jums vajadzētu izmantot atpakaļsaukumus: https://stackoverflow.com/a/5316755/591257 Bija tāda pati problēma, atrisināju to šādā veidā, izmantojot global var. Neesmu pārliecināts, vai tas ir labākais, bet noteikti darbojas. Kļūdas gadījumā jūs saņemat tukšu virkni (myVar = '''), tāpēc varat to apstrādāt pēc vajadzības.
var myVar = '';
function isSession(selector) {
$.ajax({
'type': 'POST',
'url': '/order.html',
'data': {
'issession': 1,
'selector': selector
},
'dataType': 'html',
'success': function(data) {
myVar = data;
},
'error': function() {
alert('Error occured');
}
});
return myVar;
}