我的用户网站上有一行代码,用于从我的服务器请求脚本:
<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...
})();
但我确信必须有一种更有效的方法来管理它。这样做的部分原因在于为每个用户保持尽可能小的代码,但主要是因为我正在构建一些用户不想要的功能 - 它需要对每个人都是动态的。
感谢任何可以提供帮助的人!
答案 0 :(得分:1)
您可以使用Require.JS(website)。 它根据需要异步加载脚本。 要加载库,您可以使用:
<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的同一文件夹中(它们可以位于子文件夹中,调用subfoldername/scriptName
来加载文件js/subfoldername/scriptName.js
)。
argumentsList将定义包含已加载模块的变量。模块定义如下:
$(function() {
// Stuff...
var module = {
doSomething: function() {
// .......
},
anyValueYouWant: 5
};
return module;
});
当然,有很多方法可以定义模块,您需要阅读API文档。 希望这会有所帮助。