仅在特定页面上包含其他jQuery版本


16

jQuery更新模块包括此脚本。

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

我在每个页面上都需要这个,除了我正在使用花式框的某个模板文件外,还需要更高版本的jQuery。

我只需要将以上脚本$scripts放在page-media-photos.tpl.php 的变量中,以排除jQuery更新。我该如何实现?

Answers:


10

这是您的选择:

  • 使用jQuery Multi,如另一个答案中所述。可以将其配置为仅在该页面上并且仅在精美框中加载更高版本的jQuery。它不会干扰Drupal的jQuery或jquery_update的jQuery。
  • 在Drupal 7中,您可以使用hook_js_alter(),这将使您可以根据需要交换出jquery_update的版本。
  • 带有jQuery Update的 Drupal 6中,它提供了一个钩子,可让您在完成其工作后更改JS。您可以查看jQuery Multi 6.x代码以了解其如何使用此钩子
  • 没有jQuery Update的 Drupal 6中,您可以使用preprocess_page挂钩进行此操作。该$scripts变量将在那里可用,您可以对其进行更改。这可能会有些棘手。您还可以看到qmulti如何做到这一点。jQuery Update也以类似的方式做到这一点。

请记住,切换到更高版本的jQuery可能会破坏Drupal核心和贡献,这是jQuery Multi解决的问题。因此,如果执行此操作,请确保您没有损坏任何东西。这样做的好处是,您只需要加载所需的jQuery,而使用jQuery Multi则可以同时加载两者。


请注意,hook_js_alter在D6中不可用
David Thomas

2
将答案也更改为具有D6信息。
goron

如果您要运行多个版本的jQuery,我同意使用jQuery multi。如果您要为整个网站运行较新的版本,我只会建议使用jquery更新。另外,以我的经验,jquery 1.7和1.8的jquery更新仍然无法在生产中使用。
rooby

3

有一个模块jQuery multi。该模块允许您multiple versions of jQuery run parallel在Drupal实例上使用。它alias为每个实例提供一个,可用于调用该版本的jquery。


3

如果您在使用jqueryupdate和查看管理页面时遇到麻烦(例如),请尝试安装Dev版本的ctools,一切都会好起来,只是自己进行了测试。


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的路径,例如:sites / all / modules / og / og.js


函数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是undefined错误jQuery插件在jQuery版本之前加载。另外,jQuery更新的工作方式比仅取消设置js文件更为复杂。
rooby

2

Drupal 7

您可以通过drupalmoff此处显示的jquery_update_jquery_replace()特定页面(例如在中hook_library_alter()调用

<?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_PATHjquery_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专门提出另一个问题。
kenorb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.