diff --git a/includes/common.inc b/includes/common.inc
index ad5f44a..06f9be8 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -4234,9 +4234,6 @@ function drupal_get_js($scope = 'header', $javascript = NULL, $skip_alter = FALS
 
       case 'inline':
         $js_element = $element;
-        if ($item['defer']) {
-          $js_element['#attributes']['defer'] = 'defer';
-        }
         $js_element['#value_prefix'] = $embed_prefix;
         $js_element['#value'] = $item['data'];
         $js_element['#value_suffix'] = $embed_suffix;
@@ -4246,9 +4243,6 @@ function drupal_get_js($scope = 'header', $javascript = NULL, $skip_alter = FALS
       case 'file':
         $js_element = $element;
         if (!$item['preprocess'] || !$preprocess_js) {
-          if ($item['defer']) {
-            $js_element['#attributes']['defer'] = 'defer';
-          }
           $query_string_separator = (strpos($item['data'], '?') !== FALSE) ? '&' : '?';
           $js_element['#attributes']['src'] = file_create_url($item['data']) . $query_string_separator . ($item['cache'] ? $query_string : REQUEST_TIME);
           $processed[$index++] = theme('html_tag', array('element' => $js_element));
@@ -4269,14 +4263,15 @@ function drupal_get_js($scope = 'header', $javascript = NULL, $skip_alter = FALS
 
       case 'external':
         $js_element = $element;
-        // Preprocessing for external JavaScript files is ignored.
-        if ($item['defer']) {
-          $js_element['#attributes']['defer'] = 'defer';
-        }
         $js_element['#attributes']['src'] = $item['data'];
         $processed[$index++] = theme('html_tag', array('element' => $js_element));
         break;
     }
+
+    // The defer attribute must not be specified if src is not defined.
+    if (!empty($item['defer']) && isset($js_element['#attributes']['src'])) {
+      $js_element['#attributes']['defer'] = 'defer';
+    }
   }
 
   // Aggregate any remaining JS files that haven't already been output.
