Javascript jQuery插件bsmSelect不';t在再次调用时更新其值,并且其选择选项已更改
我正在使用jQuery插件。基本上,它所做的是更改“选择多重”(select multiple)的渲染方式,以便更轻松地拾取选项。它隐藏select元素,并显示一个列表 首先,我将插件函数应用于我的select multiple元素:Javascript jQuery插件bsmSelect不';t在再次调用时更新其值,并且其选择选项已更改,javascript,jquery,Javascript,Jquery,我正在使用jQuery插件。基本上,它所做的是更改“选择多重”(select multiple)的渲染方式,以便更轻松地拾取选项。它隐藏select元素,并显示一个列表 首先,我将插件函数应用于我的select multiple元素: $(document).ready(function() { ... $('#my_select_multiple').bsmSelect({ plugins: [$.bsmSelect.plugins.sortable()], title
$(document).ready(function() {
...
$('#my_select_multiple').bsmSelect({
plugins: [$.bsmSelect.plugins.sortable()],
title: 'Add',
removeLabel: 'Remove'
});
...
});
另一方面,我有另一个select元素(这个元素很简单),它有一个ajax请求绑定到它的变更事件。此ajax请求根据select simple值获取新的#my_select_多个
选项。Ajax响应是新的HTML,用于#my\u select\u多个
选项。因此,我:
function getNewOptions(val) {
var r = $.ajax({
type: 'GET',
url: /*My URL*/
}).responseText;
return r;
}
...
$(document).ready(function() {
...
$('#my_select_simple').change() {
$('#my_select_multiple').html(getNewOptions($(this).val()));
}
...
});
AJAX正在按预期工作。新选项被正确获取,并被插入到#my_select_multiple
(bsmSelect插件将其隐藏,但我可以使用Firebug进行检查)。但是bsmSelect没有实现新的更改,也没有得到更新
因此,我想我想要的是重新应用$(“#我的选择数”)代码>及其新选项
我已经四处看看了,下面是我尝试过的
1。我尝试再次调用函数,调用AJAX请求的success
和complete
(一次一个)。不起作用:
function getNewOptions(val) {
var r = $.ajax({
type: 'GET',
url: /*My URL*/,
success: function() { $('#my_select_multiple').bsmSelect(); }
}).responseText;
return r;
}
$('#my_select_simple').on('change', function() {
$('#my_select_multiple').bsmSelect();
});
2。我已经尝试将函数与on
jQuery函数绑定。不起作用:
function getNewOptions(val) {
var r = $.ajax({
type: 'GET',
url: /*My URL*/,
success: function() { $('#my_select_multiple').bsmSelect(); }
}).responseText;
return r;
}
$('#my_select_simple').on('change', function() {
$('#my_select_multiple').bsmSelect();
});
3。我尝试了1和2删除以前由bsmSelect生成的HTML。没用
多谢各位
更新:确切代码
首先,我有一个global.js
文件,它将bsmSelect插件应用于一些select倍数(.quizzes
):
然后,在php文件中,我定义了updateQuizzes
函数,并将其绑定到select simple(project\u id
)更改事件:
<script type="text/javascript">
function updateQuizzes(project_id) {
var r = $.ajax({
type: 'GET',
url: '<?php echo url_for('event/updateQuizzes')?>'+'<?php echo ($form->getObject()->isNew()?'':'?id='.$form->getObject()->getId()).($form->getObject()->isNew()?'?project_id=':'&project_id=')?>'+project_id,
success: function() { $('.quizzes').bsmSelect({
plugins: [$.bsmSelect.plugins.sortable()],
title: 'Add',
removeLabel: 'Remove'
}); }
}).responseText;
return r;
}
$('#project_id').change(function(){
$('.quizzes').html(updateQuizzes($(this).val()));
});
</script>
函数updateQuizzes(项目id){
var r=$.ajax({
键入:“GET”,
url:''+''+项目id,
成功:函数(){$('.quizzes').bsmSelect({
插件:[$.bsmSelect.plugins.sortable()],
标题:“添加”,
removeLabel:“移除”
}); }
}).responseText;
返回r;
}
$('#项目_id')。更改(函数(){
$('.quizzes').html(updateQuizzes($(this.val()));
});
正如我所说的,AJAX请求可以正常工作,但第二次调用bsmSelect时不会出现问题 不确定这是否是问题所在,但您可以试试
$('#my_select_simple').change() {
$('#my_select_multiple').html(getNewOptions($(this).val())).trigger('change');
}
这会触发select_multiple上的更改事件,并可能触发bsmSelect。我不确定这里到底是什么问题,但这是我能想到的最好办法。我认为您希望在Ajax调用的成功
中设置HTML,例如:
function loadNewOptions(val) {
$.ajax({
type: 'GET',
url: /*My URL*/,
success: function(data) {
$('#my_select_multiple').html(data).bsmSelect();
}
});
}
然后打电话说:
$('#my_select_simple').change() {
loadNewOptions($(this).val());
}
这样的办法应该行得通
.load
将把您的url返回的内容放入\my\u select\u multiple
第一个参数是要加载的url,第二个参数是完成后要调用的函数。这就是你需要设置你的花式选择器的地方。好的,bsmSelect开发者在几分钟内回答了我。太好了
要让bsmSelect了解其select更改,必须在select上触发change
事件。无需再次调用bsmSelect
所以它可以是这样的:
function loadNewOptions(val) {
var r = $.ajax({
type: 'GET',
url: /*My URL*/,
success: function(data) {
$('#my_select_multiple').html(data).trigger('change');
}
}).responseText;
return r;
}
$('#my_select_simple').change(function() {
loadNewOptions($(this).val());
});
但这不会满足AJAX请求,不是吗?它不起作用:(我认为这是执行AJAX请求的另一种方式。但是函数调用没有任何效果,无论是在这里还是在我函数的success参数中。谢谢你。是的,load只是在后台使用AJAX。但是它让我很困扰,你说它什么都没有做。你能发布你尝试过的代码吗?嘿@Patricia。AJAX请求确实有效,它可以发回expectet响应…但函数调用不起作用。我用代码更新了答案。谢谢。我尝试了,但没有起作用。即使在Ajax调用中设置html也没有起作用…:(无论如何,谢谢你。请将你当前的HTML添加到你的问题中,以及从ajax请求中返回的内容。嘿@Patricia,ajax响应正常,这是预期的结果。问题是函数bsmSelect()
不再被调用。谢谢。好的,所有这一切都是bsmSelect插件的问题…我尝试了另一个插件,效果很好。因此我将更新我的问题,即使我认为很难获得此类特定问题的答案。我也将在bsmSelect tracker中打开一个票证。您的插件是否具有删除或销毁功能?您可以尝试删除支持下拉列表并添加一个新列表,然后将插件应用于该列表,而不只是更新内容并重新应用插件。