【问题标题】:jQuery 'this' legacy scopingjQuery 'this' 遗留范围
【发布时间】:2024-01-21 21:28:01
【问题描述】:

我正在尝试将我在 jQuery 1.6 中编写的幻灯片反向移植到 Drupal 中,您可能知道也可能不知道目前已“锁定”到 jQuery 1.3(我知道,它已被延迟)。

不过,我在范围方面遇到了问题,因为 jQuery 1.3 的 $(this) 模型不像在更现代的版本中那样健壮或有用。

这是破坏的代码:

var $controls   = $('a.controls', $frame);

$controls.click( function() {

  var $clicked = $(this);

  // ...

}

a.controls 表达式按预期生成$controls 内的两个对象的集合。但是当 jQuery 1.3 遇到 $(this) 赋值时,它会抛出以下错误:

this[0].ownerDocument 为空

有谁知道它为什么会这样,以及我该如何解决或解决它?

【问题讨论】:

  • Drupal 6 根本没有“锁定”到 1.3 版……一些核心 js 文件只依赖于 1.3.2。如果您可以不使用这些核心 js 文件,那么您可以将任何版本的 jQuery 放入您想要的。您还应该非常清楚,jQuery 1.6 移动了一些目标,因此在该系统升级到使用最新版本之前,让它与任何主要系统一起工作将是一场噩梦。
  • 加载第二个版本的 jQuery 并仅在幻灯片中使用它可能更简单。当然,这是另一个必须下载的文件。
  • @Clive 我不准备妥协 Core;这似乎是个坏主意 - 纯粹从维护的角度来看 - 我的用户需要这些功能来使管理网站的体验更轻松、更有帮助。你能告诉我是否可以在不影响核心的情况下添加第二个 jQuery 版本?
  • 奇怪的是,这个问题在我的脑海中盘旋了一天左右,我认为有一个解决方案,我会在下面发布一个答案

标签: jquery drupal scope this legacy


【解决方案1】:

这可能不是错误发生的地方,this 上下文对于 1.3 中的事件回调的工作方式与最新版本中的相同。

示例:http://jsfiddle.net/hPfZH/2/

  • 您确定$frame 上下文正确吗?
  • 您是否使用内联 $controls 上的点击事件会增加冲突吗?

【讨论】:

    【解决方案2】:

    这可能无法回答问题,但可以帮助您解决问题。

    使用drupal模块jquery update可以在drupal中选择jquery版本。

    【讨论】:

    • 不,你不能,它会将 Drupal 6 更新到 1.3.2 或将 Drupal 7 更新到 1.5.2。 OP 正在使用 Drupal 6 并且已经在使用 jQuery 1.3 的事实应该告诉您您需要知道的一切。
    • 您可以简单地将您质疑的drupal版本添加到模块目录中,而不是其中的jquery版本,我认为这是人们所做的
    【解决方案3】:

    我认为完成此任务的唯一方法是对 jquery_update 模块进行小改动。您需要将sites/all/modules/jquery_update/replace 中的jquery.min.js(或jquery.js,如果您不使用最小化版本)文件替换为最新的jQuery 版本,然后对@987654322 进行更改@ 文件(大约第 59 行):

    function jquery_update_preprocess_page(&$variables) {
      // Only do this for pages that have JavaScript on them.
      if (!empty($variables['scripts'])) {
    
        // ADD THESE TWO LINES BEFORE THE REST OF THE CODE
        if (preg_match('/^\/admin[\/]*.*/', $_SERVER['REQUEST_URI'])) { return; }
        if (preg_match('/^\/batch[\/]*.*/', $_SERVER['REQUEST_URI'])) { return; }
    

    这基本上会告诉 jquery_update 仅替换非管理员和非批处理页面上的 javascript,这应该可以满足您的目的。根据您的需要,您可能需要将其他路径添加到该检查中。

    我尚未对此进行测试,但理论上它会起作用,不幸的是,我无法评论 AHAH(Drupal 在 AJAX 框架上的蹩脚尝试)是否可以在非管理页面上与更高版本的 jQuery 一起使用。

    希望你能解决这个问题,这是一个非常烦人的问题 :-)

    【讨论】:

    • 感谢您的提示,但它似乎对我不起作用。我遵循了您的所有指示(如上修改 [jquery_update.module]),但我现在从 jQuery 1.6.4 收到“p、a、c、k、e、r”错误......所以我没有我认为我不能做到这一点。不过感谢您的帮助!
    • 真可惜,我认为主要问题之一是 jQuery 1.6 发生了很大变化...如果您可以使用 1.5.2,它可能会起作用,但它真的很幸运!
    • 只是对最后一条评论的补充(由于某种原因不能放过这条评论!),Drupal.org 上的this post 有人声称他们已经让 jQuery 1.5.1 与 Drupal 一起使用6 使用与上述答案中提到的方法类似的方法...也许这会帮助您对其进行排序?