Вход

Просмотр полной версии : Ошибка Uncaught TypeError: Cannot read property '1' of null?


orb
16.11.2020, 22:08
Есть сайт самописный, пк и мобильная версия отдельно. В Пк версии цена отображается корректно. А в мобильной версии как я понял идет парс цены. Так вот при открытии товара - появляется товар но цена пустая и в консоле следующая ошибка:


Uncaught TypeError: Cannot read property '1' of null
at getSapogCost (file.js:44)
at openBlockSapog (mob.js:80)
at Object.success (mob.js:108)


Сам код файла file.js
function getSapogCost(SapogType, arrPrices) {
var price = 0;
switch(+SapogType){
case 1:
case 2:
price = arrPrices[1]; // ОШИБКА В этой строке
break;
case 3:
case 4:
case 5:
price = arrPrices[2]; // ОШИБКА в зависимости от товара может и тут быть
break;
case 6:
price = arrPrices[3]; // ОШИБКА в зависимости от товара может и тут быть
break;
case 7:
default:
price = arrPrices[4]; // ОШИБКА в зависимости от товара может и тут быть
};
return price;

}


Строки кода mob.js

function openBlockSapog( data, SapogContent ){

openModal({
content: SapogContent.Sapog.content
}, false);
if( SapogContent.Sapog.type == 'free' ) {
var SapogType= + SapogContent.Sapog.SapogData[4];
$('.ajax-box .Sapog-image').attr( 'src', './img/'+SapogType+'.png');
price=getSapogCost(SapogType, SapogContent.Sapog.prices)// ОШИБКА в этой строке
if( SapogType == SapogContent.Sapog.freeSapogType && SapogContent.Sapog.haveFreeSapog == 0 ){
price = 0;
}
$('.ajax-box .summa').html(price+'$');
}else{
transLiter('.ajax-box .translit');
}
}

function allSearchMethods( action, data, processingRequest ){
$.post(action, data, function (response) {

// Все ок есть такой пользователь
if (response.error != undefined) {
showError(response);
}

// Вывести сообщение ошибки
else if (response.ok != undefined) {

if (response.Sapog != undefined) {
if(processingRequest)
processingRequest.css('visibility', 'hidden');
openBlockSapog(response.Sapog, {Sapog:{content:response.content, idSapog:response.Sapog.idSapog, type:response.type, prices:response.prices, SapogData:response.SapogData}});// ОШИБКА в этой строке

delete response;
return;
}

if (response.Sapog == undefined) {
openModal({
title:response.title,
content:'<div class="element-child scroll">' + response.content + '</div>'
},true);

elementChildAddClass();

transLiter('.ajax-box .translit');
//add open full Sapog list for one user
$('.openFullSapogList').bind('click', function(){
var divEl = $('#FullSapogList-'+$(this).attr('data-idUser') );
if( divEl.css('display') == 'none' ){
divEl.css('display', 'block');
}
else{
divEl.css('display', 'none');
}

});
}
}

Nexus
16.11.2020, 22:35
У вас в функцию getSapogCost вместо массива вторым аргументом передается null.

orb
16.11.2020, 23:07
т.е arrPrices - возвращает null, потому что там нет цены?

Nexus
16.11.2020, 23:47
orb, т.е arrPrices - возвращает null, потому что там нет цены?

arrPricesничего не возвращает, это не функция, а её аргумент.

orb
17.11.2020, 00:38
Получается вместо аргумента должен передаваться массив с данными, а именно ценой? Что мне нужно найти, чтобы исправить это

Aetae
17.11.2020, 03:18
Цены. На сервере. В ответ на post запрос, с сервера в response.prices тебе приходит null вместо массива цен.

Если цены не важны - добавь сверху в getSapogCost: if(!arrPrices) return 0;

orb
17.11.2020, 07:50
надо чтобы цены отображались, есть конфиг файл в нем вот так цены указаны
$config['priceSapog'] = array(

1 => $config['priceDefRUR1'],

2 => $config['priceDefRUR1'],

3 => $config['priceDefRUR2'],

4 => $config['priceDefRUR2'],

5 => $config['priceDefRUR2'],

6 => $config['priceDefRUR3'],

7 => $config['priceDefRUR4'],

);

laimas
17.11.2020, 09:55
надо чтобы цены отображались

Так проверяйте почему сервер не возвращает то, что у вас в $config['priceSapog'].

orb
17.11.2020, 10:35
Так он везде возвращает, но именно в мобильной версии как я понял через парс все это дело идет и идет подмена функций

laimas
17.11.2020, 10:46
Каких функций и зачем подменять? В отладчике смотрите что возвращается сервером, что далее делается. Для этого нужно разрешить удаленную отладку на моб. устройстве и в отладчике браузера (настольного компьютера) выбрать и подключить устройство, можно будет отлаживать. Как это делается в разных браузерах, найдете в сети, есть описания, а гадать на кофейной гуще приходит ли у вас или нет никто не станет.

Nexus
17.11.2020, 14:55
Получается вместо аргумента должен передаваться массив с данными
Почитайте для начала: https://learn.javascript.ru/function-basics

У вас на клиент передается прямо массив $config?
Если это так, то названия его ключей на клиенте и сервере не совпадают. На сервере цены имеют ключ priceSapog, а на клиенте идет обращение к ключу prices.

orb
17.11.2020, 17:44
В общем сервером возвращался NULL в поле prices, исправил
теперь есть значения, prices: {1: "10", 2: "10", 3: "700", 4: "700", 5: "700", 6: "200", 7: "400"}
Но нет сортировки почему-то на конкретную цену, а выходит вся группа без сортировки, в зависимости от товара должна быть одна цена.

Ну в консоле эти ошибки остались


mob.js?:137 Uncaught ReferenceError: response is not defined
at openBlockSapog (mob.js?:137)
at Object.success (mob.js?:89)


function allSearchMethods( action, data, processingRequest ){
$.post(action, data, function (response) {

// Все ок есть такой пользователь
if (response.error != undefined) {
showError(response);
}

// Вывести сообщение ошибки
else if (response.ok != undefined) {

if (response.Sapog != undefined) {
if(processingRequest)
processingRequest.css('visibility', 'hidden');
openBlockSapog(response.Sapog, {Sapog:{content:response.content, idSapog:response.Sapog.idSapog, type:response.type, prices:response.prices, SapogData:response.SapogData}}); // В ЭТОЙ СТРОКЕ ОШИБКА

delete response;
return;
}

if (response.Sapog == undefined) {
// Close blue block
openModal({
title:response.title,
content:'<div class="element-child scroll">' + response.content + '</div>'
},true);

elementChildAddClass();

transLiter('.ajax-box .translit');
//add open full Sapog list for one user
$('.openFullSapogList').bind('click', function(){
var divEl = $('#FullSapogList-'+$(this).attr('data-idUser') );
if( divEl.css('display') == 'none' ){
divEl.css('display', 'block');
}
else{
divEl.css('display', 'none');
}
});
}
}


// Скрыть блок процесса
if( processingRequest )
processingRequest.css('visibility', 'hidden');

}, 'json');
}







function openBlockSapog( data, SapogContent ){

openModal({
content: SapogContent.Sapog.content
}, false);
if( SapogContent.Sapog.type == 'free' ) {
var SapogType= + SapogContent.Sapog.SapogData[4];
$('.ajax-box .Sapog-image').attr( 'src', './img/'+SapogType+'.png');
price=getSapogCost(SapogType, SapogContent.Sapog.prices);
//единственная бесплатный товар из free-типа товара
if( SapogType == response.freeSapogType && response.haveFreeSapog == 0 ){ // В ЭТОЙ СТРОКЕ ОШИБКА
price = 0;
}
$('.ajax-box .summa').html(price+'$');
}else{
transLiter('.ajax-box .translit');
}
}

Aetae
18.11.2020, 03:12
Откуда у тебя там response возьмётся вообще? Ты его не передаёшь.
Учи javascript нормально или найми фрилансера.