【问题标题】:Jquery change function after replacing select boxes with twitter bootstrap用 twitter bootstrap 替换选择框后的 Jquery 更改功能
【发布时间】:2012-04-13 13:03:16
【问题描述】:

http://jsfiddle.net/xuAQv/

所以我发现了这段代码,它将传统的表单选择框转换为他们的 twitter bootstrap 样式版本。它本质上只是隐藏了选择,并使用引导程序的 css/js 为选择框创建了 html。

http://blog.iamjamoy.com/convert-select-boxes-to-a-fancy-html-dropdown 我稍微定制了插件来改变下拉菜单的外观。

我现在遇到的问题是 $("#mySelect").change(function(){});不再开火。 我尝试在其中添加 .live 和 .on ,但没有任何运气。

我需要修改插件吗? 这是我的插件代码..

/*!
 * Convert <select> elements to Dropdown Group
 *
 * Author: John Rocela 2012 <me@iamjamoy.com>
 * Customized: Frank B 3/2012
 */
jQuery(function ($) {
    $('select').each(function (i, e) {
        if (!($(e).data('convert') == 'no')) {
            //get some initial data...
            xSelect = $(e).attr('id')
            xLabel = $("#" + xSelect + " option:selected").text();
            xClass = $(e).data('class')
            $(e).hide().wrap('<div class="btn-group" id="select-group-' + i + '" />');
            var select = $('#select-group-' + i);
            select.html('<a class="btn dropdown-toggle ' + xClass + '" data-toggle="dropdown" href="javascript:;">' + xLabel + ' <span class="caret"></span></a><ul class="dropdown-menu"></ul><input type="hidden" value="' + $(e).val() + '" name="' + $(e).attr('name') + '" id="' + $(e).attr('id') + '" class="' + $(e).attr('class') + '" />');
            $(e).find('option').each(function (o, q) {
                select.find('.dropdown-menu').append('<li><a href="javascript:;" data-title="' + $(q).text() + '" data-value="' + $(q).attr('value') + '">' + $(q).text() + '</a></li>');
                if ($(q).attr('selected')) select.find('.dropdown-menu li:eq(' + o + ')').click();
            });
            select.find('.dropdown-menu a').click(function () {
                select.find('input[type=hidden]').live().val($(this).data('value')).change();
                select.find('.btn:eq(0)').html($(this).text() + ' <span class="caret"></span>');
            });
        }
    });
});

【问题讨论】:

  • “mydiv”应该是什么?我猜这实际上不是您使用的选择器?
  • @James,谢谢修复。假设它是插件添加引导处理之前的选择框的ID。
  • 奇怪,似乎使用live 或正确使用on 应该有效。选择被隐藏输入替换,但该输入与选择具有相同的id。你确定你只是将id 作为选择器传递给live 吗?
  • jsfiddle.net/xuAQv - 实现了如何使用 JsFiddle。
  • @JamesMontagne 可能是因为我不够聪明,无法弄清楚 Jquery .on 需要在哪里编码。可以放到插件里面还是要放到.change()函数里面?

标签: twitter-bootstrap onchange jquery


【解决方案1】:

如果您查看代码中实际发生的情况,选择将被隐藏输入替换。当您更改值时,这就是调用 change() 的原因。您将需要使用事件委托。像这样的:

$("<parent selector>").on("change","#mySelect", function(){}); 

其中&lt;parent selector&gt; 是一个选择器,它匹配未替换的选择的某些父项。如果需要,它可以是 document,但理想情况下,您希望它尽可能位于树的下方。


您的live 不起作用的原因是它应该是这样的:

$("#mySelect").live("change", function(){});

虽然你不应该使用live,如果你使用的是最新的jquery,你应该使用on


编辑:更新了你的小提琴:http://jsfiddle.net/xuAQv/2/

【讨论】:

  • 感谢@James,我现在唯一的问题是我无法拉动 .val()。在函数内,当我尝试时: myval = $('optDeposit').val(); - 它只是保持未定义。
猜你喜欢
  • 2015-02-06
  • 2017-08-14
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多