XMLHttpRequest.open () responseText, похоже, теряет набор ключей / значений - PullRequest
0 голосов
/ 13 июля 2020

Я реорганизовал свой код, чтобы он соответствовал «лучшим практикам», так что файлы javescript находились в каталоге / scripts, а файлы изображений - в каталоге / assy, ​​что потребовало от меня экспериментов над тем, как работает конкретный c который отправляет XMLHttpRequest (). open ("GET", "/scripts/getpartinformation.php?partNumber=" + PN, true) для получения информации о части из MySQL DB. Я оставил исходную функцию в index. php и включил идентичную версию в файл javascript, как показано ниже.

Изображение HTML вызывает одну из двух идентичных функций javascript следующим образом:

<area shape="rect" coords="333,316,399,330" href="TopAssy.html" onClick="parent.getassyInformation('100.100002');">
<area shape="rect" coords="341,230,407,246" href="TopAssy.html" onClick="GetassyInformation('100.100001');">

getassyInformation (PN) и GetassyInformation (PN) - это один и тот же код, но в двух разных местах. getassyInformation (PN) находится в заголовке index. php следующим образом:

<script>
function getassyInformation(PN) {
...
</script>
}

GetassyInformation (PN) находится в хранилище. js, файл javascript в каталоге / scripts, вызывается из заголовка файла изображения как:

<script src="../scripts/Storage.js"></script>

Ниже приведен их код (показан верхний регистр «g»):

function GetassyInformation(PN) {
alert("entered GetassyInformation()");
    var arrayPosEnum = {
        DESCRIPTION: 0,
        PRICE: 1,
        QUANTITY: 2,
        EXTENDEDPRICE:3
    };
   
    alert("you clicked: " + PN);
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
        if (this.readyState === 4 && this.status === 200) {
            alert ("readystate is " + this.readyState + " and status is " + this.Status);
            console.log("ResponseText is: " + this.responseText);
            //convert responseText into array at the comma separator
            var dbData = this.responseText.split(',');
            //add default Qty of '1' and Ext Price placeholders to end of array
            dbData.push("1", dbData[arrayPosEnum.PRICE]);
            localStorage.setItem(PN, dbData);
        }else{
            alert ("readystate is " + this.readyState + " and status is " + this.Status);
            console.log({xmlhttp});
        }
    };
    alert("immediately after xmlhttp.onreadystatechange");
    xmlhttp.open("GET", "../scripts/getassyinformation.php?assyNumber=" + PN, true);
    xmlhttp.send();
}

При нажатии «100.100002» появляется предупреждение " сразу после отображения xmlhttp.onreadystatechange "код проходит через ответы xmlhttp с предупреждениями, отображающими" readyState is: "от 1 до 4 (см. код else), и пара значений ключа возвращается из базы данных MySQL в responseText . Однако при щелчке "100.100001" отображается предупреждение "сразу после xmlhttp.onreadystatechange" и отображается предупреждение "readystate is 1 ....", а затем ничего.

Я экспериментировал с XMLHttpRequest.open URL-адрес с двойной точкой или без двойной точки в обеих версиях и дает одинаковый результат, сбой при нажатии «100.100001» и успех при нажатии «100.100002». Apache находит информацию getassy. php, с двойной точкой перед / scripts или без нее при нажатии «100.100002».

Когда я нажимаю «100.100001» (сбой), я не получаю сообщения об ошибке в apache_error. log, но я получаю следующие записи в access.log:

::1 - - [12/Jul/2020:15:43:51 -0500] "GET /scripts/getpartinformation.php?partNumber=100.100001 HTTP/1.1" 200 28
::1 - - [12/Jul/2020:15:43:51 -0500] "GET /scripts/Storage.js HTTP/1.1" 304 -

Когда я нажимаю «100.100002» (успех), я получаю следующие записи в access.log:

::1 - - [12/Jul/2020:15:45:51 -0500] "GET /scripts/getpartinformation.php?partNumber=100.100002 HTTP/1.1" 200 25
::1 - - [12/Jul/2020:15:45:53 -0500] "GET /scripts/Storage.js HTTP/1.1" 304 -

Общий формат журнала указывает, что «28» и «25» в конце каждой строки «указывают размер объекта, возвращаемого клиенту». Это имеет смысл, потому что responseText, показанный в console.log, имеет следующий вид: «ключ: 100.100002, а элемент: base assy, ​​50.00» или 25 символов. Значение «28», показанное для сбойного PN (100.100001), имеет смысл, поскольку в случае успеха в console.log будет указано следующее: «ключ: 100.100001, а элемент: Cradle assy, ​​125.00» или 28 символов.

Есть ли у кого-нибудь представление о том, что может происходить с парой значений ключа, возвращаемой из MySQL при нажатии «100.100001»? Я в тупике, почему для обоих сообщается «200», но нажатие «100.100001» не проходит через readyStates, и значение теряется, но, похоже, было отправлено из отчета access.log с кодом состояния « 200 и 28 символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...