Включение другой версии JQuery только на определенной странице


16

Модуль обновления jQuery включает в себя этот скрипт.

<script type="text/javascript" src="/sites/all/modules/jquery_update/replace/jquery.min.js?6"></script>

Мне нужно это на каждой странице, кроме определенного файла шаблона, который я использую, и мне нужна более поздняя версия jQuery.

Мне нужно исключить обновление jQuery из $scriptsпомещенного выше скрипта в переменную ТОЛЬКО на страницу-media-photos.tpl.php. Как мне этого добиться?

Ответы:


10

Вот ваши варианты:

  • Используйте jQuery Multi , как уже упоминалось в другом ответе. Он может быть настроен для загрузки более высокой версии jQuery только на этой странице и только для модной коробки. Это не будет мешать jQuery Drupal или jQuery jquery_update.
  • В Drupal 7 вы можете использовать hook_js_alter () , который позволит вам менять версию jquery_update на что угодно.
  • В Drupal 6 с jQuery Update он предоставляет ловушку, которая позволяет вам изменять JS после того, как он сделает свое дело. Вы можете посмотреть на код jQuery Multi 6.x, чтобы увидеть, как он использует этот хук .
  • В Drupal 6 без jQuery Update вы можете сделать это с помощью ловушки preprocess_page. $scriptsПеременная будет доступна там, и вы можете изменить его. Это может быть немного сложнее. Вы также можете увидеть, как это делает qmulti . Обновление jQuery также делает это подобным образом.

Помните, что переход на более высокую версию jQuery может сломать некоторые вещи в ядре Drupal и способствовать, что является проблемой, которую решает jQuery Multi. Поэтому, если вы делаете это, убедитесь, что вы ничего не нарушаете. Преимущество здесь в том, что вы просто загружаете необходимый jQuery, а с jQuery Multi вы загружаете оба.


Обратите внимание, что hook_js_alter недоступен в D6
Дэвид Томас

2
Изменен ответ, чтобы иметь информацию о D6.
Горон

Я согласен с использованием jQuery multi, если вы хотите запустить несколько версий jQuery. Я бы порекомендовал только обновление jquery, если вы хотите запустить более новую версию для всего вашего сайта. Кроме того, по моему опыту, в jquery update для jquery 1.7 и 1.8 все еще не все исправно для использования в производстве.
Роби

3

Есть модуль jQuery multi . Этот модуль позволяет вам иметь multiple versions of jQuery run parallelна вашем друпал экземпляр. Он предоставляет aliasдля каждого экземпляра, который вы можете использовать для вызова этой версии jquery.


3

Если у вас возникли проблемы с jqueryupdate и просмотром страниц администратора (например), попробуйте установить версию ctools для Dev, и все будет в порядке, просто протестируйте себя.


3

Пожалуйста, сочтите этот код полезным, поместите этот код в ваш template.php

function MYTHEME_preprocess_page(&$vars) {
  $scripts = drupal_add_js();
  if (in_array('page-media-photos', $vars['template_files'])) {
    unset($scripts['all']['module']['PATH_OF_JS_NEED_TO_REMOVE']);
  }
  $vars['scripts'] = drupal_get_js('header', $scripts);
}

PATH_OF_JS_NEED_TO_REMOVE дает путь js для ex: sites / all / modules / og / og.js


function phptemplate_preprocess_page (& $ vars) {$ scripts = drupal_add_js (); if (in_array ('page-media-photos', $ vars ['template_files'])) unset ($ scripts ['all'] ['module'] ['/ sites / all / modules / jquery_update / replace / jquery. min.js']); $ vars ['scripts'] = drupal_get_js ('header', $ scripts); } это, похоже, не сработало
albo

Я проголосовал, но это не работает
albo

Я обновил код, чтобы указать, что вам нужно заменить MYTHEME на имя вашей темы вместо использования "phptemplate". Кроме того, я бы не рекомендовал использовать этот тип подхода для удаления библиотеки, от которой зависят другие js, например jQuery, потому что это не учитывает порядок загрузки js, и вы можете получить jquery - неопределенные ошибки, если другие Плагины jQuery загружаются до версии jQuery. Кроме того, способ обновления jQuery более сложен, чем просто удаление файла js.
Роби

2

Drupal 7

Вы можете позвонить jquery_update_jquery_replace()на определенную страницу (например, в hook_library_alter()), как показано здесь drupalmoff :

<?php
/**
 * Implements hook_module_implements_alter().
 */
function your_module_module_implements_alter(&$implementations, $hook){
  if( $hook == 'library_alter' ){
    $group = $implementations ['your_module'];
    unset($implementations ['your_module']);
    $implementations ['your_module'] = $group;
  }
}

/**
 * Implements hook_library_alter().
 */
function your_module_library_alter(&$javascript, $module) {
  if( $module === 'system' && current_path() == 'path/to/page' ) {
    // Make sure we inject either the minified or uncompressed version as desired.
    $min = variable_get('jquery_update_compression_type', 'min') == 'none' ? '' : '.min';
    $cdn = variable_get('jquery_update_jquery_cdn', 'none');
    $path = drupal_get_path('module', 'jquery_update');

    $version = '1.7';

    jquery_update_jquery_replace($javascript, $cdn, $path, $min, $version);
  }
}
?>

Drupal 6

Моим решением было изменить JQUERY_UPDATE_REPLACE_PATHконстанту перед jquery_updateзагрузкой:

<?php
/**
 * Replace jQuery files on specified paths (fix for IE 6&7 - jQuery bug: bugs.jquery.com/ticket/6498)
 */
// if (array_search($_GET['q'], array('my_page')) !== FALSE) {
if (arg(0) == 'node' && arg(1) == '123') {
  define('JQUERY_UPDATE_REPLACE_PATH', 'sites/all/libraries/jquery/1.5.2');
}
?>

Таким образом, его можно добавить либо в самом начале файла .module (который загружается раньше jquery_update, либо попробовать в файле настроек).


Не для того, чтобы угнать ваш ответ, но, может быть, вы также хотите добавить его вариант D8?
Pierre.Vriens

Я не играл 8 слишком много, поэтому я не уверен, каким будет решение для D8, извините за это. Не стесняйтесь предлагать изменить или опубликовать ответ. Или может быть стоит создать еще один вопрос специально для D8.
Кенорб
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.