强制Drupal将Drupal行为附加到新的ajax内容上(仅Drupal.attachBehaviors()不能正确工作)


10

我在drupal.org上做了很多有关该主题的文章,但不幸的是,背景不正确。

我认为这不是问题,所以我尝试使用另一种方法,也许这可能是解决方案。加载整个PHP页面并使用ajax提取某个div并不正确。所以我想,我可以让drupal仅加载内容并将其与ajax一起注入div。我用hook_preprocess_page和hook_preprocess_node进行了查询,该查询在请求的URL中查找“ ajax = 1”,然后只给出内容而不显示整个页面。现在在理论上,借助于某些tpl.php文件,我可以将drupal的输出限制为仅$ content。这就是问题所在。即使我以原始方式保留tpl.php文件,但从node-ajax.tpl.php中删除“ $ content”时,我的方法仍然有效。“以正确的方式工作”是指drupal不会重新加载整个页面,但当然不是内容。但是我无法向我自己解释,因为$ content变量中的原因,所以我认为,这只是生成内容的html。所以我的问题是,我如何将drupal的输出限制为仅包含内容,或者我是否执行了错误的步骤以使其正常工作。这是我正在使用的模块和js文件:my_ajax.module:

<?php

function my_ajax_init()
{
    drupal_add_js(drupal_get_path('module', 'my_ajax') . '/my_ajax.js');
}

function my_ajax_preprocess_page(&$vars, $hook)
{

    if (isset($_GET['ajax']) && $_GET['ajax'] == 1)
    {
        $vars['template_file'] = 'page-ajax';
    }
}

function my_ajax_preprocess_node(&$vars, $hook)
{

    if (isset($_GET['ajax']) && $_GET['ajax'] == 1)
    {
        $vars['template_file'] = 'node-ajax';
    }
}

my_ajax.js:

Drupal.behaviors.my_ajax = function (context) {
    $('#content-group-inner .node a').live('click', function (e) {
        var url = $(this).attr('href');
        //$('#content-region-inner').slideUp('slow');
        $('#content-region-inner').empty().html('<img src="ajax-loader.gif" style="margin-left:50%;"/>');
        xhr = $.ajax({
            data: 'ajax=1',
            type: 'GET',
            url: url,
            success: function (data) {
                $('#content-region-inner').html(data);
                Drupal.attachBehaviors(context);
            }
        });
        return false;
    });
};

请帮我解决一下这个。每个建议都表示赞赏。


2
只是一个小注释D7在路径中使用/ nojs和/ ajax来区分ajax链接和标准链接。以后可能会为您节省一些麻烦。
杰里米·法兰西

Answers:


11

我懂了。这是正确的方法:

Drupal.behaviors.my_ajax = function (context) {
    $('#content-group-inner a').live('click', function (e) {

        $('#content-group-inner a').addClass('my_ajax-processed');
        var url = $(this).attr('href');
        $('#content-region-inner').empty().html('<img src="ajax-loader.gif" style="margin-left:50%;"/>');        
        $('#content-region-inner').load(url,'ajax=1',function() {
                        Drupal.attachBehaviors('#content-region-inner');
                        });
        return false;
        });
   };

谢谢你的帮助。


1
请记住,将您自己的答案标记为已接受(并回答所有有帮助的答案)。这标志着该问题在概述中已解决。投票还有助于鼓励用户提供良好的答案。
贝尔迪(Berdir)2011年

您还应该在附件中使用“上下文”。
乔什·科尼希

只是注意到.live()现在已被弃用
ErichBSchulz

不使用context(如乔什·科尼格(Josh Koenig)指出的)是一个很大的禁忌。您的事件处理程序将重新附加到页面上的所有元素。使用using时context,将需要更改此代码,因为第一个事件绑定中的context包含document和将替换内容时的元素本身,因此简单$('#content-group-inner a',context)将无法工作。
Alex Skrypnyk '17

10

我认为您的问题是您的成功函数在作用域中将没有变量上下文,因此附加行为将适用于未定义的行为。

我想你可以

Drupal.attachBehaviors($('#content-region-inner'));

我认为成功函数将是一个闭包,并将变量context(这是旧的上下文而不是新的标记)保留在范围内:这是错误的吗?
安迪

在这种情况下,我认为它不能作为闭包,但是我对此可能是非常错误的。
杰里米·法兰西
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.