【问题标题】:.data('bs.popover') returns undefined.data('bs.popover') 返回未定义
【发布时间】:2018-03-31 17:12:52
【问题描述】:

我正在将应用程序从 angular.js 迁移到 Angular 5.. 应用程序正在使用引导主题,它使用bootstrap v3.3.7。我复制了每个cssscript,奇怪的是popover(用户下拉菜单)不再在新应用程序中工作。 我正在调试它,发现问题是$('[data-toggle="popover"]').data("bs.popover")undefined

$(document).on("click", '[data-toggle="popover"]', function (o) {
        o.stopPropagation(),
            $('[data-toggle="popover"]')
                .data("bs.popover")
                .tip()
                .hasClass("in") ? (
                    $('[data-toggle="popover"]').popover("hide"),
                    $(document).off("click.app.popover")
                ) : (
                    $('[data-toggle="popover"]').popover("show"),
                    setTimeout(function () {
                        $(document).one("click.app.popover", function () {
                            $('[data-toggle="popover"]').popover("hide")
                        })
                    }, 1)
                )
    })

还有我的html:

<ul class="nav navbar-nav">
    ...
    <li>
        <button data-toggle="popover" data-original-title="" title="">
            <img class="img" src="assets/images/img-1.jpg">
        </button>
    </li>
</ul>

点击button[data-toggle="popover"]时,应该会显示下面的html:

<ul class="nav navbar-nav hidden">
    <li>
        <a href="#/profile">
            <span class="profile-link"></span> Profile
        </a>
    </li>
    ...
</ul>

有什么想法吗?

【问题讨论】:

    标签: javascript jquery twitter-bootstrap-3 popover


    【解决方案1】:

    它是undefined,因为您的html 中没有bs.popover 作为数据属性,它正在尝试读取不存在的data-bs.popover

    如果你有&lt;div data-foo="bar"&gt;&lt;/div&gt; 那么$('div').data('foo') 将输出bar

    https://api.jquery.com/data/

    .data() 方法允许我们将任何类型的数据附加到 DOM 元素以一种不受循环引用影响的方式,因此 从内存泄漏。

    要在popover 中显示ul,您需要将其放在data-content 属性中并添加data-html="true" 以让弹出框知道它正在显示html

    我不知道你想用 .data() .tip() .hasClass() ...etc 做什么,而你可以用 $().popover() 替换它,这是一个有效的 popover

    $('[data-toggle="popover"]').popover();
    
    
    /*
    
    // this will work too
    
    $(document).on("click", '[data-toggle="popover"]', function (o) {
    	o.stopPropagation(),
        $('[data-toggle="popover"]')
        	.hasClass("in") ? (
            	$('[data-toggle="popover"]').popover("hide"),
                	$(document).off("click.app.popover")
                ) : (
                	$('[data-toggle="popover"]').popover("show"),
                    	setTimeout(function () {
                        	$(document).one("click.app.popover", function () {
                            	$('[data-toggle="popover"]').popover("hide")
                            })
                        }, 1)
                    )
    })
    */
    button{
      border: none;
      background: none;
      margin-top: 10px;
      margin-left: 10px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
    <ul class="nav navbar-nav">
      <li>
        <button 
          data-toggle="popover" 
          data-original-title="" 
          title=""
          data-html="true"
          data-content='<ul class="nav navbar-nav"><li><a href="#/profile"><span class="profile-link"></span> Profile</a></li></ul>'>
          <img class="img" src="https://loremflickr.com/100/100">
        </button>
      </li>
    </ul>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多