Einschließen einer anderen jQuery-Version nur auf einer bestimmten Seite

16

Das jQuery-Update-Modul enthält dieses Skript.

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

Ich brauche dies auf jeder Seite, mit Ausnahme einer bestimmten Vorlagendatei, für die ich Fancy Box verwende, und benötige eine spätere Version von jQuery.

Ich muss das jQuery-Update davon ausschließen, das obige Skript $scriptsNUR in die Variable page-media-photos.tpl.php einzufügen. Wie kann ich das erreichen?

albo
quelle

Antworten:

10

Hier sind Ihre Optionen:

  • Verwenden Sie jQuery Multi , wie in einer anderen Antwort erwähnt. Es kann so konfiguriert werden, dass die höhere Version von jQuery nur auf dieser Seite und nur für die Fancy Box geladen wird. Es wird weder die jQuery von Drupal noch die jQuery von jquery_update stören.
  • In Drupal 7 können Sie hook_js_alter () verwenden , mit dessen Hilfe Sie die Version von jquery_update durch eine beliebige Version ersetzen können.
  • In Drupal 6 mit jQuery Update wird ein Hook bereitgestellt, mit dem Sie das JS ändern können, nachdem es seine Aufgabe erledigt hat. Sie können sich den jQuery Multi 6.x-Code ansehen, um zu sehen, wie dieser Hook verwendet wird .
  • In Drupal 6 ohne jQuery Update können Sie dies mit einem Preprocess_page-Hook tun. Die $scriptsVariable ist dort verfügbar und kann geändert werden. Das kann etwas knifflig werden. Sie können auch sehen, wie qmulti dies tut . Ähnlich verhält es sich auch mit jQuery Update.

Denken Sie daran, dass das Wechseln zu einer höheren jQuery-Version einige Probleme in Drupal Core und Contrib verursachen kann. Dies ist das Problem, das jQuery Multi löst. Wenn Sie dies tun, stellen Sie sicher, dass Sie nichts kaputt machen. Der Vorteil hierbei ist, dass Sie nur die von Ihnen benötigte jQuery laden, während Sie mit jQuery Multi beide laden.

Goron
quelle
Beachten Sie, dass hook_js_alter in D6
David Thomas
2
Die Antwort wurde dahingehend geändert, dass auch D6-Informationen angezeigt werden.
Goron
Ich bin mit der Verwendung von jQuery multi einverstanden, wenn Sie mehrere Versionen von jQuery ausführen möchten. Ich würde jquery update nur empfehlen, wenn Sie die neuere Version für Ihre gesamte Site ausführen möchten. Meiner Erfahrung nach ist das jquery-Update für jquery 1.7 und 1.8 immer noch zu fehlerhaft, um es in der Produktion zu verwenden.
Rooby
3

Es gibt ein Modul jQuery multi . Dieses Modul ermöglicht es Ihnen, multiple versions of jQuery run parallelauf Ihrer Drupal-Instanz zu haben. Es stellt aliasfür jede Instanz eine bereit, die Sie zum Aufrufen dieser Version von jquery verwenden können.

Gokul NK
quelle
3

Wenn Sie Probleme mit jqueryupdate haben und Admin-Seiten anzeigen (zum Beispiel), versuchen Sie, die Dev-Version von ctools zu installieren, und alles wird in Ordnung sein, testen Sie mich einfach.

Molfar
quelle
3

Bitte finden Sie diesen Code hilfreich, platzieren Sie diesen Code in Ihrer 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 gibt den Pfad von js für ex: sites / all / modules / og / og.js an

Ramesh Babu TB
quelle
Funktion 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); } das schien nicht zu funktionieren
albo
Ich habe abgestimmt, aber es funktioniert nicht
Albo
Ich habe den Code aktualisiert, um anzuzeigen, dass Sie MYTHEME durch Ihren Themennamen ersetzen müssen, anstatt "phptemplate" zu verwenden. Außerdem würde ich nicht empfehlen, diesen Ansatz zu verwenden, um eine Bibliothek zu entfernen, von der andere js abhängen, wie z. B. jQuery, da hierbei die Reihenfolge, in der js geladen wird, nicht berücksichtigt wird und Sie möglicherweise undefinierte Fehler bei jquery erhalten jQuery-Plugins werden vor einer Version von jQuery geladen. Außerdem ist die Funktionsweise von jQuery Update komplexer als nur das Deaktivieren einer js-Datei.
Rooby
2

Drupal 7

Sie können eine jquery_update_jquery_replace()bestimmte Seite aufrufen (z. B. in hook_library_alter()), wie hier von drupalmoff gezeigt :

<?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

Meine Lösung bestand darin, die JQUERY_UPDATE_REPLACE_PATHKonstante vor dem jquery_updateLaden zu ändern :

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

Es kann also entweder ganz am Anfang der .module-Datei (die zuvor geladen wurde) hinzugefügt jquery_updateoder in der Einstellungsdatei probiert werden.

Kenorb
quelle
Nicht um Ihre Antwort zu entführen, aber vielleicht möchten Sie auch die D8-Variante hinzufügen?
Pierre.Vriens
Ich habe nicht zu viel 8 gespielt, daher bin ich mir nicht sicher, was die Lösung für D8 sein würde. Tut mir leid. Zögern Sie nicht, Änderungen vorzuschlagen oder eine Antwort zu posten. Oder es kann sich lohnen, eine weitere Frage speziell für D8 zu erstellen.
Kenorb