使用AJAX执行通过PHP交付的javascript代码

使用AJAX执行通过PHP交付的javascript代码,javascript,php,mysql,ajax,Javascript,Php,Mysql,Ajax,我已经被难住了大约两个小时了 我的问题是,我需要使用PHP和Ajax从MySQL数据库加载一个数组,并在JavaScript中使用该数组 我使该部分工作正常,但是它引用“onClick”并包含要运行的函数的部分不工作。它提供了许多错误,这些错误说明了完全相同的事情 未捕获范围错误:超过最大调用堆栈大小 在按钮处..onClick(app.js:1281) 该阵列的示例如下所示: [ { "text": "Lost to Competitor", "onCl

我已经被难住了大约两个小时了

我的问题是,我需要使用PHP和Ajax从MySQL数据库加载一个数组,并在JavaScript中使用该数组

我使该部分工作正常,但是它引用“onClick”并包含要运行的函数的部分不工作。它提供了许多错误,这些错误说明了完全相同的事情

未捕获范围错误:超过最大调用堆栈大小
在按钮处..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();
我加载数组的代码如下所示:

[
    {
        "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)

如果我没有提供足够的信息,我很乐意提供更多信息来帮助解决这个问题。

找到了解决方案

我试图加载“名称”而不是“文本”

工作功能

app.request.json('scripts/lostButtonsArray.php', function (data) {
        buttons = data;
        buttons.forEach((v, i) => {
            buttons[i]['onClick'] = function() { eval('closeOpportunity')(v['text'], el, stages); };
        });
    });

你为什么使用
window.eval.call()
而不是
eval(v.onClick)
?@Barmar,嘿!我最初尝试使用eval(v['onClick']),但是它不起作用,所以我环顾了一下其他问题,发现了这个问题,所以我尝试了一下。我还需要将变量
el
stages
传递给onClick函数。
closeOpportunity()
是否返回函数?您试图使用
(el,stages)
调用eval的结果。我现在必须运行,
onClick
属性需要对函数求值,而不是直接调用函数。我注意到这一点是为了您的利益:比我更差的人会利用您使用
eval()
。这不是一个很好的解决方案。对固定字符串使用
eval()
有什么意义?只需编写
closeOpportunity(v.text、el、stages)