2010-08-06 50 views
4

我需要在我的Drupal中使用最新版本的jQuery。Drupal和最新的jQuery

jQuery更新模块是不够的,因为它不会更新jquery到其最新版本。

无论如何要在前端使用最新版本的jquery,并在后端使用包含drupal的版本?

我应该使用主题模板文件吗?这是否会导致问题?

谢谢

回答

3

Drupal在每个使用JavaScript的页面中包含jQuery库。使用比一个Drupal附带的jQuery更新版本的唯一方法是安装jQuery Update,它还提供了一个脚本,用于与使用旧版本库的脚本兼容。 jQuery的更新模块的更新:

  • 的Drupal 5将jQuery 1.2.6
  • 的Drupal 6将jQuery 1.3.2
  • Drupal 7的将jQuery 1.5.2和jQuery UI 1.8.11

如果您要简单地替换/ misc中包含的jQuery库,那么Drupal脚本将停止工作(我试过这样做,那就是结果)。 在Drupal将该库加载到/ misc之后加载更新的版本也会导致问题。

为了完成这些信息,有一个模块附带了自己版本的jQuery库,然后绑定到$ui;这样,其他代码仍然会使用默认的jQuery库,而您的模块/主题将使用更新的库。 只需将该模块加载了自己的jQuery的版本,然后执行以下JavaScript行:

window.$ui = jQuery.noConflict(true); 

使用相同的方法,你就可以加载最新版本的jQuery的,且不会与现有模块的任何冲突。 如果您使用从其他人开发的模块并使用使用$的Javascript代码,则此系统不起作用;它适用于您在您的网站上运行的自定义模块/主题。

+2

jQuery更新通常也是我推荐的,但不幸的是,最新的稳定版本随附于1.2.6版本,最新的alpha版本随附1.3.2。对于真正需要jQuery 1.4.x的人来说,目前还没有完美的解决方案。 – marcvangend 2010-08-07 07:29:39

+0

@marcvangend:就是这一点。我完全同意,谢谢。 – aneuryzm 2010-08-08 09:21:32

0

您是否对前端和后端使用不同的主题?您可以在前端的template.php中添加一些代码到themename_preprocess_page()函数中,以替换该主题中的jquery文件。

+0

是我使用不同的主题。确实..但我想知道这是否安全。例如..假设我正在使用需要jQuery的lightbox模块:它是使用旧的jquery开发的..可能会导致冲突吗? – aneuryzm 2010-08-06 20:22:16

+0

问题是jQuery不是用于主题,而是来自Drupal核心代码。 – kiamlaluno 2010-08-07 06:22:05

+0

当然,kiamlaluno是对的。然而,像CCK和Views这样的Drupal核心和模块主要在管理页面上使用jQuery,而在前端页面上则少得多。因此,如果您可以确保您的管理主题使用1.2.6,而您的前端主题使用1.4.2,则需要解决的问题更少。 – marcvangend 2010-08-07 07:25:24

0

1)下载jquery-1.4.2.js和jquery-1.4.2.min.js。
2)将它们复制到jquery_update /替换文件夹。
3)编辑jquery_update.module:
替换功能jquery_update_jquery_path(){}与

function jquery_update_jquery_path() { 
    $jquery_file = preg_match('/(admin|edit|add)/', request_uri()) ? 
     array('none' => 'jquery.js',  'min' => 'jquery.min.js') : 
     array('none' => 'jquery-1.4.2.js', 'min' => 'jquery-1.4.2.min.js'); 
    return JQUERY_UPDATE_REPLACE_PATH . '/' . $jquery_file[variable_get('jquery_update_compression_type', 'min')]; 
} 
+1

这会给我带来一些使用jquery前端模块的问题。查看其他答案/评论。 – aneuryzm 2010-08-08 09:22:41

0

using jQuery.noConflict()什么?我不知道Drupal模块在jQuery 1.2/1.3中有任何具体的例子,但是在1.4中打破了这个测试,但在Drupal加载jQuery 1.2/1.3之后,表面上加载了jQuery 1.4(所以,将它添加到你的主题中)并使用var jNew = jQuery.noConflict()会将$()返回给Drupal大部分期望的jQuery,并允许您使用jNew()来执行您需要执行的jQuery 1.4操作。

+0

我会试试这个解决方案。所以,看看我是否理解得很清楚:当我使用jNew()选择我的项目时,我正在使用新的jquery而不是旧的! – aneuryzm 2010-08-08 16:23:21

+0

这是正确的。 Drupal及其模块仍然会使用'$()'或'jQuery()'来选择事物,并且从不怀疑还有另一个版本的jQuery也被加载。 – 2010-08-08 17:01:24

2

是的,您可以使用jQuery更新(如果您需要jQuery 1.8使用开发版本)以及类似于模块中的代码来切换前端和后端的版本。

/** 
* Implements hook_module_implements_alter(). 
*/ 
function mymodule_site_module_implements_alter(&$implementations, $hook) { 
    if ($hook == 'library_alter') { 
    if(isset($implementations['jquery_update'])) { 
     // Move jquery update to the end. This will make sure our hook_library_alter 
     // is always called before the jquery_update. 
     $jquery_update = $implementations['jquery_update']; 
     unset($implementations['jquery_update']); 
     $implementations['jquery_update'] = $jquery_update; 
    } 
    } 
} 

/** 
* Implements hook_library_alter(). 
*/ 
function mymodule_site_library_alter(&$libraries, $module) { 
    // If it is the admin theme all we want to do is change the global $conf 
    // variable so when jquery_update runs right after us it will use 1.5. 
    // We are not using path_is_admin(current_path()) because some admin path can use 
    // the frontend theme like node edit page 
    global $theme_key; 
    if (variable_get('admin_theme') == $theme_key) { 
    // Modifying global $conf variable, can be dangerous. Be carefull. 
    global $conf; 
    $conf['jquery_update_jquery_version'] = '1.5'; 
    } 
} 

我写了一篇关于它的博客文章http://antistatique.net/blog/2013/01/04/drupal-use-a-different-jquerys-version-for-the-frontend-and-backend/

+0

感谢您一直在寻找的东西,不需要补丁。 – chadpeppers 2013-04-25 19:53:47

0

对于前端我做了一些“坏”,但它的工作。

我包括了最新的jQuery

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
<script type="text/javascript">$.browser = {msie: false}; // fix for scripts that use that property</script> 

禁用Drupal的jQuery的

<?php print str_replace(
    '<script type="text/javascript" src="/misc/jquery.js', 
    '<script no-drupal-jquery="', 
    $scripts 
); 
?> 

,我得到

<script no-drupal-jquery="?W"></script> 
<script ...