0

我的用户网站上有一行代码,它从我的服务器请求脚本:

<script src="myserver.com/getjs?user=1"></script>

和 php 提供 js,在代码中插入用户的 id:

(function(){
    var userid = 1; //written out from $_GET['user']
    ...js code...
})();

现在我想根据用户的 id 输出不同的 js。我想要一种方法来“模块化”根据我在数据库中的用户设置发送的代码,而不是有很多不同的 js 文件,这样用户就不需要更改他们网站上的代码。我能看到的唯一方法是像这样输出 js 文件:

...first PHP will get some user settings from the db based on their userid...
...then the js is output...

(function(){
    var userid = 1; //written out from $_GET['user']

    <?php if( $userOption1 ){ ?>
        function _option1(userid){ //func required if option1 true
           ...func1 code...
        }
        _option1(userid); //ruin it in js
    <?php } ?>

    <?php if( $userOption2 ){ ?>
        function _option2(userid){ //func required if option2 true
           ...func2 code...
        }
        _option2(userid); //run it in js
    <?php } ?>

    ...and so on...

})();

但我确信必须有一种更有效的方法来管理它。这样做的部分原因是为了让每个用户的代码尽可能小,但主要是因为我正在构建一些用户不想要的功能 - 它需要对每个人都是动态的。

感谢任何能提供帮助的人!

4

1 回答 1

1

您可以使用 Require.JS (网站)。它按需异步加载脚本。要加载库,您可以使用:

<script data-main="js/loadScripts.php" src="libs/require.js"></script>

它基本上告诉 Require.JS 在完成加载后运行“loadScripts.php”javascript 文件(是的,loadScripts.php 需要返回 Javascript,在那里您可以为任何用户返回自定义库)。

在 loadScripts.php 中,您可以执行以下操作:

<?php
// Generate en array of loading scripts, you'll probably want to dynamically
// generate this array according to user access permissions or any other case
$scriptsToLoad = array("script1", "script2", "script3");

$loadingList = "[";
$argumentsList = "";

foreach ($scriptsToLoad AS $script)
{
    $loadingList .= "\"{$script}\", ";
    $argumentsList .= "{$script}, ";
}
$loadingList = substr($loadingList, 0, strlen($loadingList) - 2);
$loadingList .= "]";

$argumentsList = substr($argumentsList, 0, strlen($argumentsList - 2);

echo "require({$loadingList}, function({$argumentsList}) {});\n";
?>

我没有对此进行测试,但是您可以在其网站上阅读它的想法。请注意,脚本在没有“.js”的情况下被调用,并且需要在 loadScripts 的同一文件夹中(它们可以在子文件夹中,调用 likesubfoldername/scriptName来加载文件js/subfoldername/scriptName.js)。

argumentsList 将定义包含已加载模块的变量。模块将定义如下:

$(function() {
    // Stuff...
    var module = {
        doSomething: function() {
            // .......
        },

        anyValueYouWant: 5
    };

    return module;
});

当然,定义模块的方法有很多种,您需要阅读 API 文档。希望这可以帮助。

于 2013-07-24T10:51:15.727 回答