Drupal 7 ajax_command_ *创建了不需要的div

时间:2012-03-07 18:55:56

标签: ajax drupal drupal-7

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

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

我可以编写一些jQuery来删除div我猜,但如果我可以阻止它首先添加它会更好。

5 个答案:

答案 0 :(得分:4)

是的,你可以!

声明自己的自定义js回调。在下面的例子中,我使用了span而不是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>');
  };
});

答案 1 :(得分:2)

答案是肯定的。 只需使用它:

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

答案 2 :(得分:1)

所以似乎答案是“不”(或者至少不是没有黑客攻击核心,而且我的良心上没有死小猫)。

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

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

其中的评论继续解释为什么他们要求第一个HTML元素是顶级元素。如果是,则不使用<div>包装器。在我的情况下,我正在替换<option>元素,因此我得到了<div>

现在我可以直接替换整个<select>,但由于脚本会在页面加载时设置样式,因此会导致其他问题。不是找到它们并重新启动它们,看起来在加载我的选项以删除div包装器之后,只需ajax_command_invoke脚本就会更容易运行。

编辑:作为一种解决方法,我发现我可以执行ajax_command_invoke($selector, 'html', array('<option...>'));并绕过div添加代码。有点偷偷摸摸,但它有效...

答案 3 :(得分:0)

您可以在此链接http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#ajax

上看到

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

答案 4 :(得分:-1)

对我有用!

    $selector = '#my-select';
    $method = 'append';
    $opts = array('new option');

    $commands[] = ajax_command_invoke($selector, $method, $opts);

    return array('#type' => 'ajax', '#commands' => $commands);