Fala rapaziada, bom dia.
Eu to estudando JS ultimamente e praticando por aqui e me deparei com uma situação, o ajax ta respondendo depois que o script já executou e por consequência a minha variável IP (linha 92) está retornando indefinida, pq o ajax só responde depois, desconfio que seja algo relacionado à callback/async/sync.
Segue o código completo abaixo e pra fins de aprendizado, se quiserem me dar alguma orientação no que remover/otimizar/adicionar/encurtar no script em geral, ficarei bastante grato pela sua orientação.
obs1: Não desejo mexer com jquery por enquanto.
obs2: Os dados estão retornando corretamente no return da linha 85, que no caso é um IP.
obs3: Havia feito uma function pro ajax da linha 93 em diante e chamei dentro do ajax anterior na linha 85, funcionou perfeitamente e pegou o IP, porém achei meio esquisito e não sei se é uma boa prática colocar ajax dentro de ajax e retornei o código na forma como está logo abaixo.
erro: variável ( ip ) indefinida na linha 92
possível causa: ajax da linha 80-91 é executado só depois que o script já carregou por completo e me retorna indefinido na variável IP.
Desde já agradeço a ajuda rapaziada, abração, bom dia e fiquem com Deus.
segue o código específico:
function ajx(idx,dm){
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
rt = JSON.parse(this.responseText);
return rt[idx]; // retorna o ip corretamente
}
}
xhr.open("GET","https://"+ dm +"/data/getData.php",true);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send();
};
var ip = ajx("ip",h); // retorna indefinido
segue o código completo:
function pushRADS(){
var p = window.location.href;
var u = new URL(p);
var s = u.searchParams.get("utm_source");
var c = u.searchParams.get("utm_campaign");
var m = u.searchParams.get("utm_medium");
var t = u.searchParams.get("utm_term");
var h = window.location.hostname;
var ck = document.cookie;
var dt = document.getElementById("rads");
var ln = navigator.language;
var pf = navigator.platform;
var agt = navigator.userAgent;
var ds = dt.dataset.device;
var vs;
var nf;
var bw = "unknown";
var v = "unknown";
if ((vs = agt.indexOf('Opera')) != -1) {
bw = 'Opera';
v = agt.substring(vs + 6);
if ((vs = agt.indexOf('Version')) != -1) {
v = agt.substring(vs + 8);
}
}
if ((vs = agt.indexOf('OPR')) != -1) {
bw = 'Opera';
v = agt.substring(vs + 4);
} else if ((vs = agt.indexOf('Edge')) != -1) {
bw = 'Microsoft Edge';
v = agt.substring(vs + 5);
} else if ((vs = agt.indexOf('MSIE')) != -1) {
bw = 'Microsoft Internet Explorer';
v = agt.substring(vs + 5);
} else if ((vs = agt.indexOf('Chrome')) != -1) {
bw = 'Chrome';
v = agt.substring(vs + 7);
} else if ((vs = agt.indexOf('Safari')) != -1) {
bw = 'Safari';
v = agt.substring(vs + 7);
if ((vs = agt.indexOf('Version')) != -1) {
v = agt.substring(vs + 8);
}
} else if ((vs = agt.indexOf('Firefox')) != -1) {
bw = 'Firefox';
v = agt.substring(vs + 8);
} else if (agt.indexOf('Trident/') != -1) {
bw = 'Microsoft Internet Explorer';
v = agt.substring(agt.indexOf('rv:') + 3);
} else if ((nf = agt.lastIndexOf(' ') + 1) < (vs = agt.lastIndexOf('/'))) {
bw = agt.substring(nf, vs);
v = agt.substring(vs + 1);
if (bw.toLowerCase() == bw.toUpperCase()) {
bw = navigator.appName;
}
}
bwv = "browser: " + bw + " | version: " + v;
if(screen.width <= 640){
dv = "mobile";
var mob = ["Android","webOS","iPhone","iPad","iPod","BlackBerry","Windows Phone"];
for (var i = 0;i < mob.length;i++) {
var re = new RegExp(mob[i], 'i');
if(navigator.userAgent.match(re)){
ua = mob[i] + " " + navigator.userAgent;
}
};
} else {
dv = "desktop";
ua = navigator.userAgent;
}
if(ck == "" && s && c && m && t && (dv == ds || ds == "all")){
var tm = dt.dataset.timeAd;
setTimeout(function(){
var ct = dt.dataset.cookieAd;
var d = new Date();
d = new Date(d.getTime() + 1000 * ct).toGMTString();
document.cookie = "utm_source="+s+"; expires="+d+";";
document.cookie = "utm_term="+t+"; expires="+d+";";
document.cookie = "utm_medium="+m+"; expires="+d+";";
function ajx(idx,dm){
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
rt = JSON.parse(this.responseText);
return rt[idx];
}
}
xhr.open("GET","https://"+ dm +"/data/getData.php",true);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send();
};
var ip = ajx("ip",h);
var xhttp = new XMLHttpRequest();
xhttp.open("POST","https://"+ h +"/ad/getDataAd.php",true);
xhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhttp.send("id_publisher="+t+"&id_campaign="+c+"&ad_source="+s+"&ad_type="+m+"&ip_client="+ip+"&device_source="+dv+"&device_type="+ua+"&device_lang="+ln+"&device_platform="+pf+"&browser="+bwv);
},tm);
}
}