In Drupal, drupal_add_js() and drupal_add_css() are great functions for adding JS/CSS to the module or theme layer. However, if you do this inside of the ‘#markup’ call in Drupal 7, you are doing it wrong.
This becomes obvious when you turn block caching or anonymous page caching on, because the JS/CSS won’t be included on the page. Here is the code in how to do it correctly.
/** * Implements hook_block_info(). */ function mymodule_block_info() { $ blocks['testblock'] = array( 'info' => t('Testing Block'), ); return $ blocks; } /** * Implements hook_block_view(). */ function mymodule_block_view($ delta = '') { $ block = array(); switch ($ delta) { case 'testblock': $ block['subject'] = t('Testing block'); $ block['content'] = array( '#markup' => mymodule_testblock_content(), '#attached' => array( 'css' => array( drupal_get_path('module', 'mymodule') . '/css/mymodule.css', ), 'js' => array( drupal_get_path('module', 'mymodule') . '/js/mymodule.js', ), ), ); break; } return $ block; } function mymodule_testblock_content() { return '<p>This is a testing block!</p>'; }
This code will ultimately call drupal_add_js() and drupal_add_css(), but it is hit even with block caching on. It makes sense when you think about it, because block caching grabs the html generated in ‘#markup’ once, and doesn’t call it again when it is cached.
Here is a great article that goes through another example in how to do this.
[plinker]