【问题标题】:Drupal 7 ajax_command_* creates unwanted divDrupal 7 ajax_command_* 创建不需要的 div
【发布时间】:2012-03-07 18:55:55
【问题描述】:

我在 Drupal 7 中使用 AJAX 回调填充一个选择框。我尝试了 ajax_command_append() 和 ajax_command_html() 来设置新的 <option...> 语句,但这两个都将我创建的 HTML 包装在一个<div>。这会导致<select> 不显示任何选项。

有没有办法告诉 Drupal “嘿,笨蛋,这正是我想要的 HTML,不要乱用它”?

我可以编写一些 jQuery 代码来删除我猜想的 div,但如果我能从一开始就阻止它被添加,那就更好了。

【问题讨论】:

    标签: ajax drupal drupal-7


    【解决方案1】:

    是的,你可以!

    声明你自己的自定义 js 回调。在下面的示例中,我使用了跨度而不是 div。但是你显然可以一起移除包装器。

    PHP:

    function my_ajax_callback() {
      $data = 'saved!';
      // instead of using ajax_command_html, we provide our own 
      // js custom callback function
      $output = array(
        '#type' => 'ajax',
        '#commands' => array(
          array('command' => 'myjscallback', 'data' => $data),
        ),
      );
    
      return $output; 
    }
    

    JS:

    $(function() {
      Drupal.ajax.prototype.commands.myjscallback = function (ajax, response, status) {
        $('#save-btn-message').html('<span>' + response.data + '</span>');
      };
    });
    

    【讨论】:

      【解决方案2】:

      答案是肯定的。 改用这个:

      $commands[] = ajax_command_invoke('#mywrapper', 'html', array($output));
      

      【讨论】:

        【解决方案3】:

        所以答案似乎是“不”(或者至少在没有破解内核的情况下不会,而且我的良心上不会有死猫)。

        misc/ajax.js 包含以下内容:

        var new_content_wrapped = $('<div></div>').html(response.data);
        

        其中的 cmets 继续解释为什么他们要求第一个 HTML 元素是顶级元素。如果是,则不使用 &lt;div&gt; 包装器。就我而言,我正在替换 &lt;option&gt; 元素,所以我得到了 &lt;div&gt;

        现在我可以替换整个 &lt;select&gt;,但这会在我的情况下导致其他问题,因为脚本会在页面加载时设置样式。与其找到这些并重新启动它们,看起来在加载我的选项以删除 div 包装器之后运行 ajax_command_invoke 脚本会更容易。

        编辑:作为一种解决方法,我发现我可以做到 ajax_command_invoke($selector, 'html', array('&lt;option...&gt;')); 并且它绕过了 div 添加代码。有点偷偷摸摸,但它确实有效......

        【讨论】:

        • @查看我对 horlyk 的回答。小心使用 ajax_command_invoke,因为不会调用 Drupal.attachBehaviors 并破坏任何 .use-ajax 按钮或其他要在新内容中处理的 js 行为。
        【解决方案4】:

        你可以在这个链接上看到http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#ajax

        更多参考和示例下载此模块http://drupal.org/project/examples 它有自定义代码和“ajax_example”的所有示例

        【讨论】:

        • 我对那个页面很熟悉。它没有说明如何消除生成的封闭 div。
        【解决方案5】:

        它对我有用!

        $selector = '#my-select'; $method = '追加'; $opts = array('新选项'); $commands[] = ajax_command_invoke($selector, $method, $opts); return array('#type' => 'ajax', '#commands' => $commands);

        【讨论】:

        • 使用 ajax_command_invoke 可以很好地避免额外的 div,但在这种情况下,不调用 Drupal.attachBehaviors()(@see ajax.js 插入和调用方法)。如果您添加的内容包含 .use-ajax 按钮,它将不会被处理并且不起作用...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-06
        • 1970-01-01
        • 1970-01-01
        • 2019-05-24
        • 1970-01-01
        • 2013-08-29
        相关资源
        最近更新 更多