Dołączanie innej wersji jQuery tylko na określonej stronie

16

Moduł aktualizacji jQuery zawiera ten skrypt.

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

Potrzebuję tego na każdej stronie, z wyjątkiem pewnego pliku szablonu, który używam fantazyjnego pudełka i potrzebuję późniejszej wersji jQuery.

Muszę wykluczyć aktualizację jQuery z umieszczenia powyższego skryptu w $scriptszmiennej TYLKO na page-media-photos.tpl.php. Jak mogę to osiągnąć?

albo
źródło

Odpowiedzi:

10

Oto twoje opcje:

  • Użyj jQuery Multi , jak wspomniano w innej odpowiedzi. Można go skonfigurować tak, aby ładował wyższą wersję jQuery tylko na tej stronie i tylko dla fantazyjnego pudełka. Nie będzie kolidować z jQuery Drupala ani z jQuery jquery_update.
  • W Drupal 7 możesz użyć hook_js_alter () , co pozwoli ci zamienić wersję jquery_update na cokolwiek zechcesz.
  • W Drupal 6 z aktualizacją jQuery zapewnia hak, który pozwala zmienić JS po zakończeniu jego działania. Możesz spojrzeć na kod jQuery Multi 6.x, aby zobaczyć, jak używa tego haka .
  • W Drupal 6 bez aktualizacji jQuery możesz to zrobić za pomocą haka preprocess_page. $scriptsZmienna będzie dostępna tam, i można ją zmienić. To może być trochę trudne. Możesz także zobaczyć, jak to robi qmulti . jQuery Update robi to również w podobny sposób.

Pamiętaj, że zamiana na wyższą wersję jQuery może zepsuć niektóre rzeczy w rdzeniu Drupala i przyczynić się, co jest problemem, który rozwiązuje jQuery Multi. Więc jeśli to zrobisz, upewnij się, że niczego nie łamiesz. Zaletą jest to, że wystarczy załadować jQuery, czego potrzebujesz, a dzięki jQuery Multi załadujesz oba.

goron
źródło
Uwaga: hook_js_alter nie jest dostępny w D6
David Thomas
2
Zmieniono odpowiedź, aby mieć również informacje o D6.
goron
Zgadzam się na używanie jQuery multi, jeśli chcesz uruchomić wiele wersji jQuery. Polecam aktualizację jquery tylko wtedy, gdy chcesz uruchomić nowszą wersję dla całej witryny. Z mojego doświadczenia wynika również, że aktualizacja jquery dla jquery 1.7 i 1.8 nadal nie działa prawidłowo w środowisku produkcyjnym.
rooby
3

Istnieje moduł jQuery multi . Ten moduł pozwala mieć multiple versions of jQuery run parallelna twojej instancji drupal. Zapewnia aliasdla każdej instancji, której można użyć do wywołania tej wersji jquery.

Gokul NK
źródło
3

Jeśli masz problemy z jqueryupdate i przeglądasz strony administracyjne (na przykład), spróbuj zainstalować wersję Devo ctools i wszystko będzie w porządku, po prostu przetestowałem siebie.

Molfar
źródło
3

Znajdź ten kod, który może być pomocny. Umieść ten kod w pliku 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 podaj ścieżkę js dla np .: sites / all / modules / og / og.js

Ramesh Babu TB
źródło
funkcja 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); } to nie działało
albo
Głosowałem, ale to nie działa
albo
Zaktualizowałem kod, aby wskazać, że musisz zastąpić MYTHEME nazwą motywu zamiast używać „phptemplate”. Ponadto nie zalecałbym stosowania tego rodzaju podejścia do usuwania biblioteki, od której zależy inne js, takie jak jQuery, ponieważ nie bierze to pod uwagę kolejności ładowania js i możesz skończyć z jquery to niezdefiniowane błędy, jeśli inne Wtyczki jQuery są ładowane przed wersją jQuery. Ponadto sposób działania aktualizacji jQuery jest bardziej złożony niż tylko rozbrojenie pliku js.
rooby
2

Drupal 7

Możesz zadzwonić jquery_update_jquery_replace()na określoną stronę (np. W hook_library_alter()), jak pokazano tutaj przez 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

Moim rozwiązaniem była zmiana JQUERY_UPDATE_REPLACE_PATHstałej przed jquery_updatezaładowaniem:

<?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');
}
?>

Można go więc dodać albo na samym początku pliku .module (który jest ładowany wcześniej jquery_update, albo spróbować w pliku ustawień).

kenorb
źródło
Nie chcesz przechwycić swojej odpowiedzi, ale może chcesz również dodać jej wariant D8?
Pierre.Vriens,
Nie grałem zbytnio w 8, więc nie jestem pewien, jakie byłoby rozwiązanie dla D8, przepraszam za to. Możesz zaproponować edycję lub opublikować odpowiedź. Lub może warto stworzyć kolejne pytanie dla D8.
kenorb