Выполнить javascript код, доставленный через PHP, используя AJAX - PullRequest
0 голосов
/ 21 января 2020

Я был озадачен этим около 2 часов.

Моя проблема в том, что мне нужно загрузить массив из базы данных MySQL, используя PHP и Ajax, и использовать массив в JavaScript.

Я получил эту часть работает нормально, однако часть, где он ссылается на «onClick» и содержит функцию для запуска, не работает. Он предоставляет множество ошибок, которые говорят одно и то же.

Uncaught RangeError: Maximum call stack size exceeded at buttons.<computed>.onClick (app.js:1281)

Пример массива следующий:

[
    {
        "text": "Lost to Competitor",
        "onClick": "closeOpportunity(\"Lost to Competitor\", el, stages)"
    },
    {
        "text": "No Budget \/ Lost Funding",
        "onClick": "closeOpportunity(\"No Budget \/ Lost Funding\", el, stages)"
    },
    {
        "text": "No Decision \/ Non-responsive",
        "onClick": "closeOpportunity(\"No Decision \/ Non-responsive\", el, stages)"
    },
    {
        "text": "Price",
        "onClick": "closeOpportunity(\"Price\", el, stages)"
    },
    {
        "text": "Other",
        "onClick": "closeOpportunity(\"Other\", el, stages)"
    },
    {
        "text": "Won via Another Opportunity",
        "onClick": "closeOpportunity(\"Won via Another Opportunity\", el, stages)"
    }
]

Мой код для загрузки массива это следующее:

function closeOpportunity(name, el, stages) {
    $$("#opportunity_loss_reason2").text(name);
    $$("#closedType").text("Closed Lost");
    $$("#convertToProject").hide();
    $$("#lostReasonLI").show();
    upStepper(el, stages);
}

var stages = [
    "enquiry",
    "qualification",
    "proposal",
    "negotiation",
    "closed"
];

var buttons = [];

app.request.json('scripts/lostButtonsArray.php', function (data) {
    buttons = data;
    console.log(buttons);
});

buttons.forEach((v, i) => {
    console.log(v['onClick']);
    buttons[i]['onClick'] = function() { window.eval.call(window, v['onClick'])(el, stages); };
});

app.dialog.create({
    title: 'ECOM',
    text: 'Why was the opportunity lost?',
    cssClass: 'custom-dialog',
    closeByBackdropClick: 'true',
    buttons: buttons,
    verticalButtons: true,
}).open();

Я уже пытался использовать обычный eval() и загружать код напрямую без какого-либо помощника (eval, window.eval).

Я буду счастлив предоставить дополнительную информацию, чтобы помочь решить эту проблему, если я не предоставил достаточно информации.

1 Ответ

0 голосов
/ 21 января 2020

Нашел решение.

Я пытался загрузить «имя» вместо «текст»

Рабочая функция

app.request.json('scripts/lostButtonsArray.php', function (data) {
        buttons = data;
        buttons.forEach((v, i) => {
            buttons[i]['onClick'] = function() { eval('closeOpportunity')(v['text'], el, stages); };
        });
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...