摘要:第一版這是最常規(guī)的做法,把事件綁定在上。阻止點(diǎn)擊事件冒泡世界杯揭幕戰(zhàn)超新星球助攻俄羅斯沙特格里茲曼宣布留馬競顏值滿分世界杯首日美女球迷盤點(diǎn)盤點(diǎn)歷屆世界杯大比分屠殺希望借此可以幫助遇到此問題的小伙伴,祝大家的生活中再無。
對于 swiper,只要做過輪播圖的童鞋應(yīng)該都再熟悉不過了。這是一個(gè)很強(qiáng)大的圖片輪播插件,本身無任何第三方庫依賴,即插即用。api 文檔很清晰,所以很快能夠上手。但是,再好的插件也會(huì)出現(xiàn)令人不愉快的地方,當(dāng)然,今天所討論的并不是插件本身的問題,只是開發(fā)者是按照常規(guī)做法去使用,而恰好此時(shí)出現(xiàn)了令人費(fèi)解的問題。
現(xiàn)象在使用 swiper 這個(gè)庫的時(shí)候,一旦設(shè)置 loop:true 的時(shí)候,會(huì)遇到 dom 綁定事件無法觸發(fā)的問題。
環(huán)境● vuejs 2.5.16
● swiper 4.3.3
● vue-awesome-swiper 3.1.3
下面來說說我是怎么一步一步采坑并最終解決這個(gè)問題的。這里只貼出關(guān)鍵性的代碼片段。
第一版這是最常規(guī)的做法,把 click 事件綁定在 dom 上。但有兩點(diǎn)不足之處:
click 點(diǎn)擊事件有時(shí)候無任何反應(yīng),并且這種情況必現(xiàn)
點(diǎn)擊下面的 title,并不能觸發(fā) click 事件,因?yàn)椴]有綁定
html 代碼
{{banner.title}}
js 代碼
new Vue({ el: "#app", data: function () { return { swiperOption: { // 輪播配置 width: window.innerWidth, autoplay: { delay: 3000 }, loop: true, // 循環(huán)滾動(dòng) pagination: { // 分頁器 el: ".swiper-pagination" }, preventLinksPropagation: false // 阻止點(diǎn)擊事件冒泡 }, bannerList: [ { id: "1", title: "世界杯揭幕戰(zhàn)-超新星1球2助攻俄羅斯5-0沙特 格里茲曼宣布留馬競", imgUrl: "http://n.sinaimg.cn/sports/180/w640h340/20180615/AYes-hcyszrz3457297.jpg" }, { id: "2", title: "顏值滿分!世界杯首日美女球迷盤點(diǎn)", imgUrl: "http://n.sinaimg.cn/sports/180/w640h340/20180615/H3Wz-hcyszrz4804003.jpg" }, { id: "3", title: "盤點(diǎn)歷屆世界杯大比分“屠殺”", imgUrl: "http://n.sinaimg.cn/sports/180/w640h340/20180615/FNuk-hcyszrz4805039.jpg" } ] } }, methods: { // 坑在這里: // 會(huì)發(fā)現(xiàn)有的時(shí)候,click 事件點(diǎn)擊無反應(yīng),而且這種情況是必現(xiàn)的 handleClickSlide(index) { console.log("handleClickSlide current index", index); } } });改良的第二版
解決了上述兩個(gè)問題,但同時(shí)也存在以下幾個(gè)問題
常用的 activeIndex (用來標(biāo)識當(dāng)前點(diǎn)擊的第幾張圖片),但控制臺輸出的值是錯(cuò)亂的
左右作切換的時(shí)候,activeIndex 的值也是錯(cuò)亂的
html 代碼
{{banner.title}}
js 代碼
new Vue({ el: "#app", data: function () { return { swiperOption: { // 輪播配置 width: window.innerWidth, autoplay: { delay: 3000 }, loop: true, // 循環(huán)滾動(dòng) pagination: { // 分頁器 el: ".swiper-pagination" }, preventLinksPropagation: false // 阻止點(diǎn)擊事件冒泡 }, bannerList: [ { id: "1", title: "世界杯揭幕戰(zhàn)-超新星1球2助攻俄羅斯5-0沙特 格里茲曼宣布留馬競", imgUrl: "http://n.sinaimg.cn/sports/180/w640h340/20180615/AYes-hcyszrz3457297.jpg" }, { id: "2", title: "顏值滿分!世界杯首日美女球迷盤點(diǎn)", imgUrl: "http://n.sinaimg.cn/sports/180/w640h340/20180615/H3Wz-hcyszrz4804003.jpg" }, { id: "3", title: "盤點(diǎn)歷屆世界杯大比分“屠殺”", imgUrl: "http://n.sinaimg.cn/sports/180/w640h340/20180615/FNuk-hcyszrz4805039.jpg" } ] } }, computed: { swiper() { return this.$refs.mySwiper.swiper; } }, methods: { // 坑在這里 // 一開始點(diǎn)擊第一張圖片,控制臺輸出的 activeIndex 竟然是 1,難道不應(yīng)該是 0嗎? // 并且一個(gè)循環(huán)之后,點(diǎn)擊第一張圖片, 控制臺輸出的 activeIndex 竟然變成了 4。。。 handleClickSlide() { // 這個(gè)應(yīng)該是最為想到一個(gè)屬性,用來標(biāo)識當(dāng)前點(diǎn)擊圖片的索引 const {activeIndex} = this.swiper && this.swiper; console.log("handleClickSlide current index", activeIndex); } } });最終版
通過 swiper 強(qiáng)大的 api 文檔,解決了上述出現(xiàn)的幾個(gè)問題。關(guān)鍵點(diǎn)在于:當(dāng) loop 設(shè)置為 true 的時(shí)候,不能再用 activeIndex 或者 clickedIndex。只能用 realIndex。官方的解釋為:當(dāng)前活動(dòng)塊的索引,與 activeIndex 不同的是,在 loop 模式下不會(huì)將復(fù)制的塊的數(shù)量計(jì)算在內(nèi)。
點(diǎn)擊事件不能綁定在 dom 上
不過稍不注意,也會(huì)出現(xiàn)新的坑(代碼里有指出)
html代碼
{{banner.title}}
js 代碼
let vm = null; new Vue({ el: "#app", data: function () { return { swiperOption: { // 輪播配置 width: window.innerWidth, autoplay: { delay: 3000 }, loop: true, // 循環(huán)滾動(dòng) pagination: { // 分頁器 el: ".swiper-pagination" }, on: { click: function () { // 這里有坑 // 需要注意的是:this 指向的是 swpier 實(shí)例,而不是當(dāng)前的 vue, 因此借助 vm,來調(diào)用 methods 里的方法 // console.log(this); // -> Swiper // 當(dāng)前活動(dòng)塊的索引,與activeIndex不同的是,在loop模式下不會(huì)將 復(fù)制的塊 的數(shù)量計(jì)算在內(nèi)。 const realIndex = this.realIndex; vm.handleClickSlide(realIndex); } }, preventLinksPropagation: false // 阻止點(diǎn)擊事件冒泡 }, bannerList: [ { id: "1", title: "世界杯揭幕戰(zhàn)-超新星1球2助攻俄羅斯5-0沙特 格里茲曼宣布留馬競", imgUrl: "http://n.sinaimg.cn/sports/180/w640h340/20180615/AYes-hcyszrz3457297.jpg" }, { id: "2", title: "顏值滿分!世界杯首日美女球迷盤點(diǎn)", imgUrl: "http://n.sinaimg.cn/sports/180/w640h340/20180615/H3Wz-hcyszrz4804003.jpg" }, { id: "3", title: "盤點(diǎn)歷屆世界杯大比分“屠殺”", imgUrl: "http://n.sinaimg.cn/sports/180/w640h340/20180615/FNuk-hcyszrz4805039.jpg" } ] } }, computed: { swiper() { return this.$refs.mySwiper.swiper; } }, created() { vm = this; }, methods: { handleClickSlide(index) { console.log("handleClickSlide current index", index); } } });
希望借此可以幫助遇到此問題的小伙伴,祝大家的生活中再無 bug。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95548.html
摘要:所有瀏覽器瀏覽器不支持安卓中中有屬性安卓中中有屬性有屬性的有屬性的所以在不需要的瀏覽器會(huì)直接掉,不會(huì)執(zhí)行下面的所有代碼。見源碼行,可以看出在響應(yīng)無操作后,則觸發(fā)。 其實(shí)一直就想花些時(shí)間讀一讀那些優(yōu)秀的開源庫,今天終于下了決定打算死磕下自己,2016年每個(gè)月讀2-3個(gè)優(yōu)秀的開源庫,把源碼精彩的地方和自己心得分享給大家。 目錄 (一)背景(二)源碼解析(三)Zepto 點(diǎn)擊穿透與 Fast...
摘要:閉包能用來實(shí)現(xiàn)私有化和創(chuàng)建工廠函數(shù)等作用。關(guān)于閉包的常見面試題是這樣的寫一個(gè)函數(shù),循環(huán)一個(gè)整數(shù)數(shù)組,延遲秒打印這個(gè)數(shù)組中每個(gè)元素的索引。 文章來源:http://mp.weixin.qq.com/s/vs0... 前言 在公眾號上看到了這篇文章,覺得很有用,有助于理解JS學(xué)習(xí)中的一些重點(diǎn)難點(diǎn)。決定把它整理下發(fā)布出來。該文章主要介紹了JS中的三個(gè)問題。在以后的幾篇文章里,我會(huì)詳細(xì)介紹這三...
摘要:事件冒泡一個(gè)簡單,但是坑了我無數(shù)回的知識點(diǎn)與的交互通過事件來實(shí)現(xiàn)。而瀏覽器的事件流是一個(gè)非常重要的概念。不去討論那些古老的瀏覽器有事件捕獲與事件冒泡的爭議,只需要知道在中規(guī)定的事件流包括了三個(gè)部分,事件捕獲階段處于目標(biāo)階段事件冒泡階段。 打算封裝一個(gè)彈窗組件,做的時(shí)候忘記了考慮事件冒泡的因素,結(jié)果被坑得不要不要的。為了解決自己的問題,去查閱了不少資料,把事件流相關(guān)的知識都給總結(jié)一下。 ...
摘要:事件冒泡一個(gè)簡單,但是坑了我無數(shù)回的知識點(diǎn)與的交互通過事件來實(shí)現(xiàn)。而瀏覽器的事件流是一個(gè)非常重要的概念。不去討論那些古老的瀏覽器有事件捕獲與事件冒泡的爭議,只需要知道在中規(guī)定的事件流包括了三個(gè)部分,事件捕獲階段處于目標(biāo)階段事件冒泡階段。 打算封裝一個(gè)彈窗組件,做的時(shí)候忘記了考慮事件冒泡的因素,結(jié)果被坑得不要不要的。為了解決自己的問題,去查閱了不少資料,把事件流相關(guān)的知識都給總結(jié)一下。 ...
閱讀 3272·2021-09-22 16:06
閱讀 3258·2021-09-02 15:40
閱讀 642·2019-08-30 15:54
閱讀 1047·2019-08-26 12:22
閱讀 1390·2019-08-26 12:17
閱讀 2751·2019-08-26 12:09
閱讀 512·2019-08-26 10:20
閱讀 796·2019-08-23 16:28