如何在 Turbolinks 中使用 HTML 初始化 Flickity
How do I initialize Flickity with HTML in Turbolinks
我正在使用 Flickity library.
这是我的 HTML:
<section class="controls-inside controls-light p-0" data-flickity='{ "imagesLoaded": true, "wrapAround": true }'>
它在第一次加载时运行良好,创建了这个 HTML:
<section class="controls-inside controls-light p-0 flickity-enabled is-draggable" data-flickity="{ "imagesLoaded": true, "wrapAround": true }" tabindex="0">
但是一旦我导航到任何其他页面并尝试返回主页(此代码所在的位置),它只会在顶部生成第一个代码(即未初始化的版本)。
这是我目前的 TL
代码:
$(document).on("turbolinks:load", () => {
$('[data-toggle="tooltip"]').tooltip()
$('[data-toggle="popover"]').popover()
})
鉴于我正在使用 HTML 初始化,我该如何使用 TL 处理这个问题?
编辑 1
如果尚未通过 HTML 初始化,我也愿意通过 JS 初始化 Flickity。无论哪种方式对我来说都很好,所以它有效。
编辑 2
在我的 application.js
中,我现在有以下内容:
$(document).on("turbolinks:load", () => {
var Flickity = require('flickity');
var flkty = new Flickity( 'section[data-flickity]', {
imagesLoaded: true,
wrapAround: true,
});
})
这有点管用。当我尝试导航到另一个页面并返回到具有滑块的页面时,会发生什么情况,我可以看到它加载了两次。就像,它最初加载滑块,然后我在加载栏进度的中途看到它,整个页面再次刷新。所以感觉它做了两倍的工作。我只想加载一次。
它还会在我的浏览器控制台中产生以下错误。
第一次加载页面时:
flickity.js:57 Uncaught TypeError: Cannot read property 'option' of undefined
at new Flickity (flickity.js:57)
at HTMLDocument.<anonymous> (application.js:43)
at HTMLDocument.dispatch (jquery.js:4670)
at HTMLDocument.elemData.handle (jquery.js:4490)
at Object../node_modules/turbolinks/dist/turbolinks.js.e.dispatch (turbolinks.js:75)
at r.notifyApplicationAfterPageLoad (turbolinks.js:994)
at r.pageLoaded (turbolinks.js:948)
at turbolinks.js:872
Flickity @ flickity.js:57
(anonymous) @ application.js:43
dispatch @ jquery.js:4670
elemData.handle @ jquery.js:4490
./node_modules/turbolinks/dist/turbolinks.js.e.dispatch @ turbolinks.js:75
r.notifyApplicationAfterPageLoad @ turbolinks.js:994
r.pageLoaded @ turbolinks.js:948
(anonymous) @ turbolinks.js:872
flickity.js:57 Uncaught TypeError: Cannot read property 'option' of undefined
at new Flickity (flickity.js:57)
at utils.js:217
at Array.forEach (<anonymous>)
at utils.js:201
如果我从我的控制台清除错误,离开并返回,这是我的控制台在第二次加载页面时出现的唯一错误:
flickity.js:47 Bad element for Flickity: section[data-flickity]
可能导致这些错误的原因是什么?我该如何解决?
编辑 3
在我的 application.js
中,我相应地包含了 Flickity。
import '../src/flickity.pkgd.min'
此外,我的 package.json
看起来像这样:
{
"name": "myapp",
"private": true,
"dependencies": {
"@rails/actioncable": "^6.0.0",
"@rails/actiontext": "^6.0.2-2",
"@rails/activestorage": "^6.0.0",
"@rails/ujs": "^6.0.0",
"@rails/webpacker": "4.2.2",
"bootstrap": "^4.4.1",
"data-confirm-modal": "^1.6.2",
"expose-loader": "^0.7.5",
"flickity": "^2.2.1",
"jquery": "^3.5.0",
"local-time": "^2.1.0",
"popper.js": "^1.16.1",
"stimulus": "^1.1.1",
"trix": "^1.0.0",
"turbolinks": "^5.2.0"
},
"version": "0.1.0",
"devDependencies": {
"webpack-dev-server": "^3.10.3"
}
}
编辑 4
这是我的 application.js
的样子:
import '../src/flickity.pkgd.min'
$(document).on("turbolinks:load", () => {
var Flickity = require('flickity');
var flkty = new Flickity( 'section[data-flickity]', {
imagesLoaded: true,
wrapAround: true,
});
})
这是我在 JS 控制台加载第一页时遇到的错误。
编辑 5
一切都或多或少地完全修复了,但每当我返回到之前使用 Flickity 加载的页面时,我仍然看到两次重新加载。
例如考虑以下流程:
- 使用 Flickity 转到
home page
(加载一次)
- 在没有 Flickity 的情况下转到
Article#New
(加载一次并且 Flickity 不会加载或在每次最新更新时抛出 JS 错误)。
- 使用 Flickity 返回
home page
(它开始加载,在初始页面加载大约 1/4 或 1/3 的过程中,它会进行完整的页面刷新并加载整个页面)。该页面刷新很明显,因为它发生在页面开始加载后大约 1 - 2 秒。
我最初认为这是因为我两次初始化 Flickity,即一次在下面的答案中使用 JS,一次通过 HTML 像这样:
<section id="featured-header" class="controls-inside controls-light p-0" data-flickity='{ "imagesLoaded": true, "wrapAround": true }'>
所以我将 JS 选择器换成此标记的 id
并删除了 data-flickity
的 HTML 初始化,但它仍然执行相同的行为。即我测试了这段代码:
<section id="featured-header" class="controls-inside controls-light p-0">
所以这让我相信这与 JS 有关。
顺便说一下,它似乎只是重新加载 section[data-flickity]
不一定是整个页面。当我浏览各种链接时,它也不会重新加载任何其他页面。这只发生在 section[data-flickity]
元素上。
您可以删除应用程序 src
目录中的 JS 文件并使用 NPM 安装它
npm install flickity
然后,在application.css
中要求Flickity CSS文件
*= require flickity.css
然后,在您的 JS 文件中,您可以在 turbolinks:load
上初始化 Flickity,就像您对工具提示和弹出框所做的那样。
import Flickity from 'flickity';
$(document).on("turbolinks:load", () => {
if($('section[data-flickity]').length > 0) {
var flkty = new Flickity( 'section[data-flickity]', {
imagesLoaded: true,
wrapAround: true,
});
}
})
我正在使用 Flickity library.
这是我的 HTML:
<section class="controls-inside controls-light p-0" data-flickity='{ "imagesLoaded": true, "wrapAround": true }'>
它在第一次加载时运行良好,创建了这个 HTML:
<section class="controls-inside controls-light p-0 flickity-enabled is-draggable" data-flickity="{ "imagesLoaded": true, "wrapAround": true }" tabindex="0">
但是一旦我导航到任何其他页面并尝试返回主页(此代码所在的位置),它只会在顶部生成第一个代码(即未初始化的版本)。
这是我目前的 TL
代码:
$(document).on("turbolinks:load", () => {
$('[data-toggle="tooltip"]').tooltip()
$('[data-toggle="popover"]').popover()
})
鉴于我正在使用 HTML 初始化,我该如何使用 TL 处理这个问题?
编辑 1
如果尚未通过 HTML 初始化,我也愿意通过 JS 初始化 Flickity。无论哪种方式对我来说都很好,所以它有效。
编辑 2
在我的 application.js
中,我现在有以下内容:
$(document).on("turbolinks:load", () => {
var Flickity = require('flickity');
var flkty = new Flickity( 'section[data-flickity]', {
imagesLoaded: true,
wrapAround: true,
});
})
这有点管用。当我尝试导航到另一个页面并返回到具有滑块的页面时,会发生什么情况,我可以看到它加载了两次。就像,它最初加载滑块,然后我在加载栏进度的中途看到它,整个页面再次刷新。所以感觉它做了两倍的工作。我只想加载一次。
它还会在我的浏览器控制台中产生以下错误。
第一次加载页面时:
flickity.js:57 Uncaught TypeError: Cannot read property 'option' of undefined
at new Flickity (flickity.js:57)
at HTMLDocument.<anonymous> (application.js:43)
at HTMLDocument.dispatch (jquery.js:4670)
at HTMLDocument.elemData.handle (jquery.js:4490)
at Object../node_modules/turbolinks/dist/turbolinks.js.e.dispatch (turbolinks.js:75)
at r.notifyApplicationAfterPageLoad (turbolinks.js:994)
at r.pageLoaded (turbolinks.js:948)
at turbolinks.js:872
Flickity @ flickity.js:57
(anonymous) @ application.js:43
dispatch @ jquery.js:4670
elemData.handle @ jquery.js:4490
./node_modules/turbolinks/dist/turbolinks.js.e.dispatch @ turbolinks.js:75
r.notifyApplicationAfterPageLoad @ turbolinks.js:994
r.pageLoaded @ turbolinks.js:948
(anonymous) @ turbolinks.js:872
flickity.js:57 Uncaught TypeError: Cannot read property 'option' of undefined
at new Flickity (flickity.js:57)
at utils.js:217
at Array.forEach (<anonymous>)
at utils.js:201
如果我从我的控制台清除错误,离开并返回,这是我的控制台在第二次加载页面时出现的唯一错误:
flickity.js:47 Bad element for Flickity: section[data-flickity]
可能导致这些错误的原因是什么?我该如何解决?
编辑 3
在我的 application.js
中,我相应地包含了 Flickity。
import '../src/flickity.pkgd.min'
此外,我的 package.json
看起来像这样:
{
"name": "myapp",
"private": true,
"dependencies": {
"@rails/actioncable": "^6.0.0",
"@rails/actiontext": "^6.0.2-2",
"@rails/activestorage": "^6.0.0",
"@rails/ujs": "^6.0.0",
"@rails/webpacker": "4.2.2",
"bootstrap": "^4.4.1",
"data-confirm-modal": "^1.6.2",
"expose-loader": "^0.7.5",
"flickity": "^2.2.1",
"jquery": "^3.5.0",
"local-time": "^2.1.0",
"popper.js": "^1.16.1",
"stimulus": "^1.1.1",
"trix": "^1.0.0",
"turbolinks": "^5.2.0"
},
"version": "0.1.0",
"devDependencies": {
"webpack-dev-server": "^3.10.3"
}
}
编辑 4
这是我的 application.js
的样子:
import '../src/flickity.pkgd.min'
$(document).on("turbolinks:load", () => {
var Flickity = require('flickity');
var flkty = new Flickity( 'section[data-flickity]', {
imagesLoaded: true,
wrapAround: true,
});
})
这是我在 JS 控制台加载第一页时遇到的错误。
编辑 5
一切都或多或少地完全修复了,但每当我返回到之前使用 Flickity 加载的页面时,我仍然看到两次重新加载。
例如考虑以下流程:
- 使用 Flickity 转到
home page
(加载一次) - 在没有 Flickity 的情况下转到
Article#New
(加载一次并且 Flickity 不会加载或在每次最新更新时抛出 JS 错误)。 - 使用 Flickity 返回
home page
(它开始加载,在初始页面加载大约 1/4 或 1/3 的过程中,它会进行完整的页面刷新并加载整个页面)。该页面刷新很明显,因为它发生在页面开始加载后大约 1 - 2 秒。
我最初认为这是因为我两次初始化 Flickity,即一次在下面的答案中使用 JS,一次通过 HTML 像这样:
<section id="featured-header" class="controls-inside controls-light p-0" data-flickity='{ "imagesLoaded": true, "wrapAround": true }'>
所以我将 JS 选择器换成此标记的 id
并删除了 data-flickity
的 HTML 初始化,但它仍然执行相同的行为。即我测试了这段代码:
<section id="featured-header" class="controls-inside controls-light p-0">
所以这让我相信这与 JS 有关。
顺便说一下,它似乎只是重新加载 section[data-flickity]
不一定是整个页面。当我浏览各种链接时,它也不会重新加载任何其他页面。这只发生在 section[data-flickity]
元素上。
您可以删除应用程序 src
目录中的 JS 文件并使用 NPM 安装它
npm install flickity
然后,在application.css
中要求Flickity CSS文件*= require flickity.css
然后,在您的 JS 文件中,您可以在 turbolinks:load
上初始化 Flickity,就像您对工具提示和弹出框所做的那样。
import Flickity from 'flickity';
$(document).on("turbolinks:load", () => {
if($('section[data-flickity]').length > 0) {
var flkty = new Flickity( 'section[data-flickity]', {
imagesLoaded: true,
wrapAround: true,
});
}
})