Я разрабатываю сайт, который будет предоставлять расписания, созданные людьми. Я использую Alienware для его разработки, и код ajax всегда отлично работает на ноутбуке. Я использую IE. Однако, если я захожу на свой сайт с Samsung Smart TV или телефона HTC U11, Ajax не работает. Он отображает данные, которые я запрашиваю, однако, когда я суммирую общее количество часов за неделю, он иногда отображает правильные часы, а иногда показывает 0 часов, когда пользователь запланирован на неделю. Почему это несовместимо между устройствами? Я знаю, что Ajax рекомендуется для IE. Однако, как я уже сказал, иногда он отображает правильное общее количество часов в неделю, а иногда просто показывает ноль. Эта проблема не возникает на моем Alienware.
Я уже пробовал использовать onload вместо onreadystatechange. Я установил запрос на асинхронный и синхронный. Независимо от того, установлено ли для него значение true или false, на других моих устройствах оно не соответствует друг другу. Я пробовал это как метод отправки и получения, и оба они также несовместимы. Что не так с моим кодом?
function getThisWeek(str5) {
lastDate = new Date(str5);
// getting dates for this week to be displayed...
this.math = dayInput.length - 1;
this.math0 = 0 - new Date(str5).getDay();
// getting week total hour length, to determine how many times this code executes...
weekSum = 0;
totals = [];
for (this.i = 0; this.i < weekTotalHours.length; this.i++) {
str3 = this.i;
this.date = new Date(str5);
for (this.ii = (this.i * (7)) - new Date().getDay(); this.ii < (7 * (this.i + 1)) - new Date().getDay(); this.ii++) {
totalHours = 0;
this.date = new Date(str5);
this.date = new Date(this.date.setDate(this.date.getDate() + (this.ii)));
// which element position the total daily hours belongs to when displaying them...
this.pos = this.ii + new Date().getDay();
thisDayChart[this.pos].innerHTML = "";
// displaying the date
dayInput[this.pos].innerHTML = this.date.getDate();
// highlighting today's date...
if (this.date.getDate() == new Date(str5).getDate() && this.date.getMonth() == new Date().getMonth()) {
dayInput[this.pos].style.color = "white";
dayInput[this.pos].style.backgroundColor = "silver";
dayInput[this.pos].style.borderRadius = "0px";
thisDay[this.pos].style.border = "2px double lightblue";
} else {
dayInput[this.pos].style.color = "";
dayInput[this.pos].style.backgroundColor = "";
dayInput[this.pos].style.borderRadius = "";
thisDay[this.pos].style.border = "";
}
// getting schedule from database...
this.xmlhttp = new XMLHttpRequest();
this.xmlhttp.pos = this.pos;
this.xmlhttp.ipos = this.i;
this.xmlhttp.d = months[this.date.getMonth()] + " " + this.date.getDate() + ", " + this.date.getFullYear();
this.xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
//alert(this.responseText);
dayInput[this.pos].m = months[new Date(this.d).getMonth()];
dayInput[this.pos].weekDay = days[new Date(this.d).getDay()];
// how many weeks in the year is user...
this.islpyr = new Date(this.d);
this.islpyr = this.islpyr.setMonth(1);
this.islpyr = new Date(new Date(this.islpyr).setDate(29));
if (this.islpyr.getMonth() == 2) {
mlens[1] = 28;
} else {
mlens[1] = 29;
}
// getting total amount of days for the year...
this.yrlen = 0;
for (this.iii = 0; this.iii < mlens.length; this.iii++) {
this.yrlen += mlens[this.iii];
}
// getting total weeks
this.wklen = this.yrlen / 7;
this.wklen = Math.round(this.wklen);
this.week = 0;
for (this.iii = 0; this.iii < new Date(this.d).getMonth(); this.iii++) {
this.week += mlens[this.iii];
}
this.week += new Date(this.d).getDate();
this.week /= 7;
this.week = Math.round(this.week) + 1;
// rounding and displaying current week number...
if (new Date(this.d).getDay() == 0) {
myDayWrapper[this.ipos].weekLabel = "Week " + this.week + " of " + this.wklen;
}
if (this.pos == 0) {
weekDisplay[0].innerHTML = myDayWrapper[0].weekLabel;
}
// which day of the year it is... how many days in the year is the user...
this.yrpos = 0;
for (this.iv = 0; this.iv < new Date(this.d).getMonth(); this.iv++) {
this.yrpos += mlens[this.iv];
}
this.yrpos += new Date(this.d).getDate();
thisDayTitle[this.pos].innerHTML = "Day " + this.yrpos + " of " + this.yrlen;
totalHours = 0;
this.schedule = "" + this.responseText;
// if user is unscheduled, do this first... 'undefined' literally means there isn't a schedule for that specific day.
if (this.schedule.search("Undefined") >= 0) {
this.elem = document.createElement("div");
this.elem.setAttribute("class","not_scheduled");
this.elem.innerHTML = "Unscheduled";
thisDayChart[this.pos].appendChild(this.elem);
this.elem = document.createElement("div");
this.elem.setAttribute("class","pick_up_shift_btn");
this.elem.innerHTML = "Claim Shifts";
this.elem.i = this.pos;
this.elem.ipos = this.ipos;
this.elem.onclick = function() {
popUpWrap[1].style.display = "block";
this.datesd = [];
for (this.i = this.ipos * 7; this.i < 7 * (this.ipos + 1); this.i++) {
this.datesd.push(dayInput[this.i].innerHTML);
}
for (this.i = 0; this.i < 7; this.i++) {
shiftClaimDate[this.i].innerHTML = this.datesd[this.i];
popUpShiftDay[this.i].innerHTML = dayInput[this.i].weekDay;
this.strrr = "" + dayInput[this.i].m;
this.strrr = this.strrr.substring(0,3);
shiftClaimMonth[this.i].innerHTML = this.strrr;
}
}
thisDayChart[this.pos].appendChild(this.elem);
if (totals.length - 1 == this.pos) {
} else {
totals.push(0);
}
} else {
// getting daily total...
this.schedule = this.schedule.split(",");
for (this.iii = 0; this.iii < this.schedule.length; this.iii++) {
this.str = "" + this.schedule[this.iii];
this.str = this.str.split(" = ");
this.dateString = "December 22, 1991";
switch (this.str[0]) {
case "shift_start":
this.start = new Date(this.dateString + " " + this.str[1]);
this.end = this.schedule[this.schedule.length - 1] + "";
this.end = this.end.split(" = ");
this.end = new Date(this.dateString + " " + this.end[1]);
this.hours = (this.end.getHours() - this.start.getHours()) * 60;
this.hours = this.hours - (this.start.getMinutes() + this.end.getMinutes());
this.hours /= 60;
totalHours += this.hours;
weekSum += totalHours;
break;
case "break_start":
this.start = new Date(this.dateString + " " + this.str[1]);
this.end = this.schedule[this.iii + 1] + "";
this.end = this.end.split(" = ");
this.end = new Date(this.dateString + " " + this.end[1]);
this.hours = (this.end.getHours() - this.start.getHours()) * 60;
this.hours = this.hours - (this.start.getMinutes() + this.end.getMinutes());
this.hours /= 60;
weekSum -= this.hours;
totalHours -= this.hours;
this.s = "s";
if (totalHours == 1) {
this.s = "";
}
thisDayChart[this.pos].innerHTML = totalHours + " hour" + this.s;
break;
}
}
}
weekTotalHours[this.ipos].innerHTML = "Week Total: " + weekSum;
//alert(weekSum);
// displaying hour totals...
if (new Date(this.d).getDay() == 6) {
weekSum = 0;
}
totalHours = 0;
}
}
this.xmlhttp.open("GET","/js/data/schedule.html?date = "+ months[this.date.getMonth()] + " " + this.date.getDate() + ", " + this.date.getFullYear(),false);
this.xmlhttp.send();
}
}
}
Я ожидаю, что каждое устройство будет соответствовать общему количеству часов, которое оно должно отображать, на каждом устройстве, на котором должен работать Ajax.
P.S. вы можете использовать эмуляторы (например, предоставленные такими людьми, как BrowserStack и другие, или в некоторых IDE), чтобы иметь возможность фактически отлаживать JS, работающий на этих устройствах, и видеть построчно, где вычисления начинают идти не так. Вы также сможете увидеть, получаете ли вы являются какие-либо ошибки AJAX, но я думаю, что это менее вероятно - если запросы ajax не выполняются, код, вероятно, просто выйдет из строя, не возвращая никаких результатов).
В качестве предварительной рекомендации (при условии, что мой прогноз верен), вы можете рассмотреть возможность использования библиотеки дат, такой как МоментJS (есть еще две), которая имеет некоторые встроенные исправления для межплатформенных различий, а также упрощает синтаксис и процесс работы с датами в целом - вы, вероятно, можете сделать свой код намного короче и в то же время проще в обслуживании.
'(например, вы говорите, что "иногда" дает неправильный ответ... это слишком расплывчато' - цитата. Я буквально имею в виду, что код предпочитает не отображать правильное количество часов в неделю. Когда я говорю иногда, я буквально имею в виду иногда. Каждые несколько обновлений страницы он отображает ноль, но в другой раз, когда я обновляю страницу, он отображает точное количество часов.
@David Пожалуйста, выполните некоторую отладку (журналы, предупреждения, упрощения, учитывая, что смарт-телевизор, вероятно, не имеет отладчика), чтобы понять, почему он «отображает ноль». Где точно расчет идет не так, на каком шаге вы получаете неожиданный результат?
Я думаю, это то, что вы предложили до этого, я думаю, это была проблема с датой. Думаю, я работаю над решением. Спасибо.
«Каждые несколько обновлений страницы отображается ноль, но в других случаях, когда я обновляю страницу, отображается точное количество часов» ... хорошо, но компьютеры не ведут себя случайным образом. Там будет шаблон, вам просто нужно узнать, что это такое. Мы не можем запустить ваш код в необходимой среде, поэтому мы не можем сделать это за вас.
Но да, я был бы на 90% уверен, что это различия в реализациях Date. Я настоятельно рекомендую momentJS, как я уже сказал, его можно использовать, чтобы сделать ваш общий код намного проще (например, нет необходимости в сумасшедших манипуляциях со строками, выполнять для вас общие вычисления, связанные с датой, с помощью его различных функций), а также иметь дело с кроссбраузерные проблемы для вас.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Здесь слишком много сложного кода, чтобы анализировать каждую строку на наличие проблем, но в целом я бы сказал, что это вряд ли связано с AJAX (это просто средство отправки данных на/с сервера) и многое другое. вероятно, связано с различиями в реализации JS Date в разных браузерах и платформах, что приводит к ошибкам в вычислениях. Если вы предоставите нам более четкую информацию, мы сможем быть более уверенными (например, вы скажете, что «иногда» дает неправильный ответ... это слишком расплывчато. Определите точные сценарии, чтобы у вас был список факторов, которые видимо влияет)