2018-10-14

Bootstrap 4 - dropdown 按第一次沒反應,要第二次以後才正常

最近的案子是寫一個簡單的後台讓丟案公司透過此後台來修改或公告一些東西,我就用 jQuery 3 + Bootstrap 4 再加上網路上找到免費的 dashboard 網頁來做 view …

剛好正在做 dashboard 右上角有關登入角色資訊,點擊後會有下拉選單可以點選一些資料或登入的操作,正在試做時發現原則上網頁產生過程是沒問題的,但就是那個資訊要點出下拉選單時,第一次點擊總是沒有反應,第二次以後的操作都正常…狀況如下

可以看到我第一次點「管理者」時,底色是有變暗,這代表我有「click」下去,但下方的選單沒有展開,第二次再點就正常…使用 chrome 的「開發人員工具」看反饋資訊,console 是沒有報錯的。



然後在網路上搜尋「bootstrap 4 dropdown twice click」的相關資訊,發現是有一樣狀況的,也有回應的人寫說可以增加「data-target="id"」在那個要被點的屬性中,「id」可以建立在「dropdown-menu」的東西的屬性中,如下:
                    
<nav class="navbar navbar-expand-lg navbar-expand-md">
    <div class="collapse navbar-collapse">
        <ul class="navbar-nav">
            <li class="dropdown">
                <a href="#" class="dropdown-toggle h6" data-toggle="dropdown" aria-haspopup="true"
                    aria-expanded="false" style="color: white;" data-target="#drop">
                    管理者
                </a>
                <div id="drop" class="dropdown-menu" aria-labelledby="navbarDropdown">
                    <a class="dropdown-item" href="profile.html">Profile</a>
                    <a class="dropdown-item" href="login.html">Logout</a>
                </div>
            </li>
        </ul>
    </div>
</nav>

我標紅色字的就是我上面寫的,這樣做是第一次點擊會正常,但…點出來後的選單就無法再用點擊叫它消失,只能在網頁其他地方點一下才會取消 focus 狀態…解決一個又產生一個問題。

然後再繼續 google 看文,我發現了有幾個人的回答都是說「可能是多次載入了 bootstrap.js 的關係,所以這個一些功能產生了衝突」!!!呃,我很確定 bootstrap.min.js 我只載入了一次,我並沒有多次或我把 bootstrap.js 也載入了呀…不過我看到我有多載了 bootstrap.bundle.min.js 。

我後來就去找了「bootstrap」跟「bootstrap.bundle」有啥差別,在「這邊」有說明,原則上兩則在「核心」是一樣的,只是「bootstrap.bundle」並沒有包進「popper.js」的程式碼,「popper.js」是一個不需要 jQuery 就能完成 tooltip 的輕量程式,所以,原來我的問題確實是「重複載入 bootstrap 而造成衝突」。

解決了!!!

10 則留言:

匿名 提到...

感謝解惑!!!

死狐狸 提到...

不用客氣

Unknown 提到...

感謝
太神奇了傑克!

死狐狸 提到...

@Unknown

不用客氣

匿名 提到...

謝謝大大,遇到相同問題,用您提出的方法排除了,謝謝。

死狐狸 提到...

@匿名

不用客氣,能解決問題才是最好的,謝謝你來到我的blog。

Sunbeam 提到...

非常感謝!!!! 改成data-target就好了!

死狐狸 提到...

@Sunbeam

不用客氣,有幫到忙就好。

程式老菜鳥 提到...

狐狸大大您好
我最近也遇到了類似的問題
只是我是使用Collapse(摺疊)而不是Dropdown
我是用MasterPage載入這些東西
<link rel="stylesheet" href="POSQues/MeasureCSS/bootstrap/css/bootstrap.min.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
再用Content去取這個MasterPage來使用這樣子
進去該Content頁面時點擊Collapse的a標籤會自動折疊後打開並畫面閃爍一下
之後繼續點擊該標籤才會正常的折疊跟打開
但如過這時再去點擊其他的圖片按鈕
然後回來點擊這個a標籤他又會出現一樣的問題(要點第二次開始才能正常摺疊打開)
我有試過加上data-target跟設id
但還是沒有解決
想請問你講的多載了bootstrap.bundle的部分
解決辦法是把名稱有bundle的檔案都刪除嗎?
還是其實是我上面link或者script的部分多載了呢
如果方便的話希望可以幫我解惑 打擾您了 謝謝

死狐狸 提到...

TO 程式老菜鳥

應該是說,在下這例子是我在一個網頁裡,在載入 script 的地方,載入了 bootstrap.min.js 和 bootstrap.bundle.min.js

而如在下文章所述,其實 bootstrap.min.js 和 bootstrap.bundle.min.js 兩個只要選一個載入就好
只是,如果選擇的是 bootstrap.bundle.min.js,那最好還要另外載入 popper.js,因為 bundle 的本身少了 popper.js

而以你的狀況,我覺得你可以試著把 popper.min.js 給刪除看看這樣會不會正常

若你的需求是 popper.js 是一定要的話,你可以試著把 jquery 改成 slim 的版本

若是再不行…就只能看你的code怎麼寫的了,如果你可以在 codepen 或 jsfiddle 重現你的問題的話,那再麻煩你給在下連結,在下再來幫你除個蟲看看