在外部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规则。)