我正在使用Drupal 7中的AJAX回调填充选择框。我已经尝试了ajax_command_append()和ajax_command_html()来设置新的<option...>
语句,但这两个语句都包含了我创建的HTML在<div>
内。这会导致<select>
不显示任何选项。
有没有办法告诉Drupal“嘿笨,这正是我想要的HTML,不要乱用它”?
我可以编写一些jQuery来删除div我猜,但如果我可以阻止它首先添加它会更好。
答案 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);