jQuery removeClass似乎无法正常工作

时间:2015-10-12 14:45:08

标签: jquery twitter-bootstrap-3 bootstrap-popover

我正在尝试从“li”中删除类,但它不起作用。这是我的功能:

function setStore($s, id, name) {
    //alert("length: " + $s.parents('ul.popup-cbo-menu').find('li.selected').length);
    $s.parents('ul.popup-cbo-menu').find('li.selected').removeClass('selected');
    //alert("length: " + $s.parents('ul.popup-cbo-menu').find('li.selected').length);

    //$s.parent('li').addClass('selected');
    $('#cboStores').val(name);
}

我可以确认通过发出警报来删除“已选择”。但由于某种原因,它不会影响实际的“li”。

这是jsfiddle:http://jsfiddle.net/87xswem7/9/。 但是,由于某些原因,jsFiddle无法找到setStore()函数。

以下是我创建popover的方法:

$(document).ready(function () {
    $("#cboStores").popover({
        viewport: 'body',
        trigger: 'click',
        placement: 'bottom',
        html: true,
        content: '<ul class="popup-cbo-menu">' +
                 '   <li><a href="#" onclick="setStore($(this), -1, \'All Stores\')">All Stores</a></li>' + 
                 '   <li class="selected"><a href="#" onclick="setStore($(this), 1, \'My Foot\')">My Foot</a></li>' +
                 '   <li><a href="#" onclick="setStore($(this), 2, \'My Foot 1\')">My Foot 1</a></li>' +
                 '</ul>',
        template: '<div class="popover cont-popup-cbo-menu" role="tooltip">' +
                  '   <div class="arrow"></div><h3 class="popover-title"></h3>' +
                  '   <div class="popover-content"></div>' +
                  '</div>'
    }).blur(function () {
        $(this).popover('hide');
    });
});

这是html中的输入框:

<input type="text" id="cboStores" value="My Foot" />

3 个答案:

答案 0 :(得分:2)

您遇到的主要问题是您尝试使用setStore函数修改popover的内容,假设它通常存在于DOM中:

function setStore($s, id, name) {
    //alert("length: " + $s.parents('ul.popup-cbo-menu').find('li.selected').length);
    $s.parents('ul.popup-cbo-menu').find('li.selected').removeClass('selected');
    //alert("length: " + $s.parents('ul.popup-cbo-menu').find('li.selected').length);

    //$s.parent('li').addClass('selected');
    $('#cboStores').val(name);
}

但是,您定义的popover内容不会像您期望的那样存在于DOM中。内容实际上是popover的属性,可以这样记录:

console.log($("#cboStores").data('bs.popover').options.content)

现在,为了做你想做的事,你必须能够动态修改popover的内容。

以下是我引用的帖子:Bootstrap popover content cannot changed dynamically

所以,我所做的是从你的javascript中删除HTML内容语义,然后我把它直接放到HTML中,由javascript操作:

<input type="text" id="cboStores" placeholder="Select Store" value="My Foot" style="width:150px;height:30px;" />

<div id="popoverContent" class="hidden">
    <ul class="popup-cbo-menu">
        <li><a href="#" onclick="setStore($(this), -1, 'All Stores')">All Stores</a></li>
        <li class="selected"><a href="#" onclick="setStore($(this), 1, 'My Foot')">My Foot</a></li>
        <li><a href="#" onclick="setStore($(this), 2, 'My Foot 1')">My Foot 1</a></li>
    </ul>
</div>

注意我将所有内容都包含在一个隐藏的div中,该div将用于引用popover内容。现在,新的setStore函数如下所示:

function setStore($s, id, name) {                                                               
    $('#popoverContent').find('li.selected').removeClass('selected');
    $('#popoverContent').find('a').filter(function(){
        return $(this).text() === $s[0].innerHTML;
    }).parent().addClass('selected');
    $('#cboStores').val(name);
    $("#cboStores").data('bs.popover').options.content = $('#popoverContent').html();
}

javascript中popover初始化中的popover内容更改为:

$('#popoverContent').html()

这样,您实际执行的操作是修改HTML的内容,然后设置弹出窗口的内容以反映HTML中的更改。

小提琴:http://jsfiddle.net/87xswem7/12/

答案 1 :(得分:1)

我知道原因:

对于你的小提琴,你已经将JS包装在onload中了:

enter image description here

然而,你再次这样做:

$(document).ready(function () {
  //...
}

没有必要这样做。只需将其更改为无包装。

enter image description here

答案 2 :(得分:0)

使用

setStore = function($s, id, name) {
    //alert("length: " + $s.parents('ul.popup-cbo-menu').find('li.selected').length);
    $s.parents('ul.popup-cbo-menu').find('li.selected').removeClass('selected');
    //alert("length: " + $s.parents('ul.popup-cbo-menu').find('li.selected').length);

    //$s.parent('li').addClass('selected');
    $('#cboStores').val(name);
}

而不是

function setStore($s, id, name) {
    //alert("length: " + $s.parents('ul.popup-cbo-menu').find('li.selected').length);
    $s.parents('ul.popup-cbo-menu').find('li.selected').removeClass('selected');
    //alert("length: " + $s.parents('ul.popup-cbo-menu').find('li.selected').length);

    //$s.parent('li').addClass('selected');
    $('#cboStores').val(name);
}

它为我解决了(fiddle)