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