在外部JS文件中包含PHP变量?
我的Web应用程序中有几行jQuery。 此代码目前是内联的,因为它接受了几个PHP变量。
$(document).ready(function(){ $('.postid; ?>').click(function() { $.ajax({ type: 'POST', url: 'http://domain.com/ajax/add_love', data: { post_id: id; ?>, user_id: id; ?>, : '' }, dataType: 'json', success: function(response) { $('.postid; ?>').html(response.total_loves).toggleClass('loved'); } }); return false; }); });
我是最佳实践的忠实粉丝,所以我想将我的jQuery移动到外部JS文件中。
我怎么能实现这样的壮举?
有小费吗? 我还是jQuery和PHP的新手。
谢谢!
🙂
我的解决方案结合了几种技术,其中一些已经在这个问题的答案中提到过。
是的,将PHP与JS分开
首先:是的,您应该将JS与PHP分开。 您可以将其放在单独的文件中,但是您需要对当前代码进行一些更改。 不要动态生成JS文件 – 它实际上杀死了将JS代码分离到单独文件(你不能缓存它等)的优点。
公共变量作为全局变量/函数参数
接下来,将您的公共变量作为全局变量存储在HTML文件的标题中(尽管还有其他选择,您实际上没有太多选择),最好分组在一个对象中:
var Globals = $active_user->id, 'token' => $token, 'hash' => $hash, )); ?>;
或者,您可以将所有这些作为参数传递给您将调用的函数,但我假设您也在脚本中的其他位置使用它们。
存储在data-
属性中的容器相关数据
然后使用data-
属性存储与容器关联的实际数据。 你不需要post1
/ post2
/ post3
like类和单独的事件处理程序:
here is something
而不是例如:
here is something
如何从外部JS文件中读取全局变量和data-
属性
然后你的JavaScript可能看起来像:
$(document).ready(function(){ $('[data-post-id]').click(function() { var el = $(this); var data = { 'post_id': el.data('post-id'), 'user_id': Globals.active_user_id }; data[Globals.token] = Globals.hash; $.ajax({ 'type': 'POST', 'url': 'http://domain.com/ajax/add_love', 'data': data, 'dataType': 'json', 'success': function(response) { el.html(response.total_loves).toggleClass('loved'); } }); return false; }); });
这应该足够了(虽然我没有测试它)。
您始终可以使用PHP中的参数调用该函数:
somefile.js:
function func(params) { //params is now from PHP //params.foo == "bar" }
somefile.php:
'bar'); ?>
我倾向于采用这种方法,因为它避免了全局变量,同时允许轻松传输变量。
我也喜欢使用json_encode,因为任何有效的JSON都是有效的JS意味着你不必担心转义’或’如果你使用字符串并在其中回显PHP。
我通常这样做的方法是在页面本身使用一些变量,然后包含的JavaScript访问这些变量。
在您的主页面中:
var post_id=id; ?>;
然后在你包含的JS文件中:
data: { post_id: post_id,
如果您仍想要包含PHP变量,则无法将其放入外部.js文件中。 但是您可以将代码放入一个单独的PHP文件中,该文件生成有效的Javascript输出(包括标题中设置为“text / javascript”的内容类型!)。
在您的第一个PHP文件中,您可以参考生成Javascript代码的第二个PHP文件
我不知道是否存在某种方式。 但是如果你设法在外部js文件中包含变量,则意味着必须将这些文件作为php脚本处理来呈现这些变量而不是仅仅将它们呈现为静态文件。 这会对性能造成不利影响。
仍然可以使用外部JS文件的一种方法是声明一个函数并从内联javascript向它传递参数。 你的代码看起来像:
你的bindPost
在外部JS文件中声明,并很好地处理参数。
在不增加更多复杂性的情况下,最简单的方法是让服务器将Javascript文件视为PHP文件,以便您可以在该文件中定义PHP变量,然后完全按照您在你问题中的代码。
在apache上,这意味着创建.htaccess文件并向其添加以下行:
AddType x-httpd-php .js
(请注意,这会将所有javascript文件作为PHP处理。如果您只想将某些Javascript文件作为PHP处理,则需要制作更窄的.htaccess规则。)