是否可以通过php中的ajax返回javascript函数?

时间:2017-10-23 17:18:29

标签: javascript php jquery ajax cordova

是否可以通过Ajax从php返回javascript函数?通常情况下,我只返回一个值,然后决定用普通的javascript做什么,但现在因为我正在处理Apache Cordova移动应用程序,我想以不同的方式做事。

error:function(){
   $("#result").html('There was an error please contact administrator');
}

.PHP

account = localStorage.getItem("account");
account = JSON.parse(account);

$.ajax({
 type: "POST",
 url: example.php,
 data: { account = account.rule }
});

然后运行它。当用户重定向到网站时,我会再次检查。

2 个答案:

答案 0 :(得分:3)

相反,请考虑结构化响应

虽然您要求做的是可能的,但还有更好的方法可以解决这个问题。请考虑返回一个包含使用客户端脚本构建链接所需数据的数组。构建Ajax以调用相应的添加链接。您可以进一步扩展它以包含更多可配置对象,或者构建要追加并返回的html,而不是尝试运行javascript eval

function updateNav(links) {
    links.forEach(function(link){
        $li = $('<li></li>');
        $a = $('<a></a>');
        $a.prop('href',link['uri']);
        $a.html(link['text']);
        $li.append($a);

        $('#nav').append($li);
    });
}

var dummyData = {
    navLinks: [
        {
            uri: 'http://stackoverflow.com',
            text: 'StackOverflow'
        },
        {
            uri: 'http://google.com',
            text: 'Google'
        }
    ]
};

var dummyHtml = {
    navHtml: '<ol><li><a href="http://meta.stackoverflow.com">Meta StackOverflow</a></li></ol>'
};

function ajaxSimData() {
    var someAjaxObject = {};
        someAjaxObject.success = function(data) {
        updateNav(data['navLinks']);
    };

    someAjaxObject.success(dummyData);
}

function ajaxSimHtml() {
    var someAjaxObject = {};
    someAjaxObject.success = function(data) {
        $('#nav').after(data['navHtml']);
    };

    someAjaxObject.success(dummyHtml);
}

$('.ajaxTriggerData').click(ajaxSimData);
$('.ajaxTriggerHtml').click(ajaxSimHtml);
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.js"></script>

<div id="message">
    Simple Examples:<br>
    <button class="ajaxTriggerData">Populate Nav from Data</button><br>
    <button class="ajaxTriggerHtml">Load HTML string after Nav</button><br>
</div>
<div id="body">
    <h3>Some navigation elements: </h3>
    <ul id="nav">
        <li><a href="#">Nav1</a></li>
        <li><a href="#">Nav2</a></li>
        <li><a href="#">Nav3</a></li>
    </ul>
</div>

PHP端生成响应

$isAdmin = $conn->prepare("SELECT role FROM users WHERE username = :username");
$isAdmin->bindParam(":username", $username);
$isAdmin->execute();

$navLinks = [];
if($isAdmin->fetch(PDO::FETCH_ASSOC)) {
    $navLinks = [
        ['uri' => 'admin.html', 'text' => 'Admin panel'],
    ];
}

return json_encode([
    'navLinks' => $navLinks
]);

答案 1 :(得分:2)

是的,你可以 - 响应文本只是字符串 - 但它可能不被认为是一种好的做法,特别是如果你制作一个模式。查看您的代码,如果用户是管理员,看起来您想要做的是附加到应用程序管理员面板的导航链接。最好采用以下代码客户端并将其包装在客户端函数中:

function appendAdminLink() {
  $("header nav").append(
    $("<a />").attr("href", "admin.html").text("Admin panel")
  )
}

...而不是返回该函数,在PHP中只返回如下内容:

{ isAdmin: true }

然后,客户端可以验证用户是否为管理员,如果是,您可以致电appendAdminLink