【问题标题】:Is it possible to return javascript function via ajax from php?是否可以通过 ajax 从 php 返回 javascript 函数?
【发布时间】:2018-04-04 08:04:31
【问题描述】:

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

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

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

.php

$isAdmin = $conn->prepare("SELECT role FROM users WHERE username = :username");
$isAdmin->bindParam(":username", $username);
$isAdmin->execute();
$result = $isAdmin->fetch(PDO::FETCH_ASSOC);
if($result){
 $result = "<script>
 $("header nav").append(
  $("<a />").attr("href", "admin.html").text("Admin panel")
 )
</script>";
}
return $result;

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

【问题讨论】:

标签: javascript php jquery ajax cordova


【解决方案1】:

请考虑结构化响应

虽然您要求做的事情是可能的,但有更好的方法来处理这个问题。考虑改为返回一个数组,其中包含使用客户端脚本构建链接所需的数据。构建 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
]);

【讨论】:

    【解决方案2】:

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

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

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

    { isAdmin: true }
    

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

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 2013-12-02
      • 2020-10-03
      相关资源
      最近更新 更多