You are here

drupal_add_js的‘setting’方式为何失败

dreamour 的头像
Submitted by dreamour on 星期一, 2010-11-08 11:06
葛老师,我在模块中有下面的语句
  $opts = array( 'absolute' => true );
  $json_url = url('philquotes.json', $opts);
//  drupal_add_js('var json_path = "' . $json_url . '";', 'inline');
  drupal_add_js(array('philquotes' => array('json_url' => $json_url) ),'setting');
但结果
<script type="text/javascript">
<!--//--><![CDATA[//><!--
jQuery.extend(Drupal.settings, null);
//--><!]]>
</script>
就是说setting失败,结果是null。

但是把上面的inline那条语句的注释去掉:
  $opts = array( 'absolute' => true );
  $json_url = url('philquotes.json', $opts);
  drupal_add_js('var json_path = "' . $json_url . '";', 'inline');
  drupal_add_js(array('philquotes' => array('json_url' => $json_url) ),'setting');
结果inline方式执行正确:
<script type="text/javascript">
<!--//--><![CDATA[//><!--
var json_path = "http://localhost/gofangke/philquotes.json";
//--><!]]>
不知怎么回事?

页面还出现警告:
warning: array_merge_recursive() [function.array-merge-recursive]: Argument #5 is not an array in F:\wamp\www\gofangke\includes\common.inc on line 2279.
请葛老师诊断。

 

 

论坛:

g089h515r806 的头像

1,drupal_add_js ,如果所加的JS不是以文件的形式存在,比如:

drupal_add_js("

$(#hiddendivid).css('display','none');

",

'inline'

)

此时使用inline.

2,通常情况下,我们不使用inline的形式,如果有JS代码,那么就把它放在JS文件中。Inline适用于JS代码片断特别短的情况。但是即便是特别短的JS代码,最好也放在JS文件中,后者管理方便。

3,Argument #5 is not an array in 。这种情况很常见,比如现在的Drupal6网站,运行在php5.3的环境下,就会报这样的错误。潜在的原因很多,先排查一下PHP版本的兼容性。

 

4,向JS中设置变量,这个我还真没有在项目中用过,Drupal.settings。你再看看相关资料,

dreamour 的头像

原来是在程序文档最开头插入的语句有错

<?php
global $base_path;
drupal_add_js('nid->$nid', 'setting');
?>
把drupal_add_js语句删除就没有警告提示了,而且Drupal.settings结果不是null了,而是有很多值的正常结果:

{ "basePath": "/gofangke/", "lightbox2": { "rtl": "0", "file_path": ……

这里跟大家分享一个排错的方法,当找不到错误的时候,先把程序文件备份。然后,一大段一大段地删除程序块,精简代码,看看什么时候错误消失(注意,修改程序后,保存刷新,有时要刷新两次才生效,特别是在有警告错误的时候),然后,倒转回来,恢复程序代码,看看警告错误在什么地方会出现,这样就可以定位错误出现的位置了。

谢谢葛老师,谢谢大家。