在前端开发中,有时我们需要在元素进入视图时触发特定的操作。无论是实现懒加载图片、无限滚动,还是统计广告曝光率,Intersection Observer API 都提供了一种高效且简便的解决方案。本文将详细介绍 Intersection Observer API 的使用,并通过一个示例展示如何在元素出现在视图中时触发 JavaScript 操作。
Intersection Observer API 是一种异步观察目标元素与其祖先元素(或顶级文档视口)交叉状态变化的机制。通过这个API,可以轻松实现以下功能:
下面是一个完整的示例代码,当目标元素出现在视图中时触发数据加载操作。
html
复制代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Intersection Observer Demo</title>
<style>
.container {
height: 100vh;
overflow-y: scroll;
}
.box {
height: 100px;
margin: 20px;
background-color: lightblue;
}
#target {
height: 100px;
margin: 20px;
background-color: lightcoral;
}
</style>
</head>
<body>
<div class="container" ref="tableContainer">
<div class="box">Box 1</div>
<div class="box">Box 2</div>
<div class="box">Box 3</div>
<div id="target">Target Element</div>
<div class="box">Box 4</div>
<div class="box">Box 5</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
function handleIntersection(entries) {
entries.forEach(entry => {
if (entry.isIntersecting) {
console.log('Target element is in view!');
// 这里可以添加你希望执行的操作,例如加载数据
getTableData();
}
});
}
function getTableData() {
console.log('Fetching table data...');
// 模拟数据加载
setTimeout(() => {
console.log('Data loaded');
}, 1000);
}
function initIntersectionObserver() {
const options = {
root: null,
rootMargin: "0px",
threshold: 0.1
};
const observer = new IntersectionObserver(handleIntersection, options);
const target = document.getElementById('target');
if (target) {
observer.observe(target);
}
}
initIntersectionObserver();
});
</script>
</body>
</html>
Intersection Observer API 提供了一种高效的方式来检测元素是否出现在视图中,并触发相应的操作。通过合理地使用该API,可以显著提高页面性能和用户体验。希望本文能帮助你理解并应用 Intersection Observer API,在实际项目中灵活实现各种效果。如果你有任何问题或建议,欢迎在评论区留言讨论。
希望这篇文章对你有所帮助!Happy Coding!
原文:https://juejin.cn/post/7381348874449698825
述内容针对本人的 blog 引用程序创建二零视图和URL, 下面将添加模板,并以用户友好的方式显示帖子。
接下来在blog 应用程序目录中创建下列目录和文件:
templates/
blog/
base.html
post/
list.html
detail.html
上述结构将表示模板的文件结构。其中,base.html 文件包含了站点的HTML 主结构,并将内容划分为主内容区域和侧栏。list.html 和 detail.html 文件继承自base.html 文件,分别用于渲染博客帖子列表以及详细视图。
Django包含了功能强大的模板语言,并可确定数据的显示方式。该语言基于模板标签、模板变量以及模板过滤器,如下所示:
读者可以访问 https://docs.djangoproject.com/en/3.0/ref/templates/builtins/,以查看全部内建的模板标签和过滤器。
下面有关编辑 base.html 和 list.html 和 detail.html 还需读者们自行完成,这里本人就不再展示。
其中{% load static %}的作用是通知Django 加载 django.contrib.staticfiles应用程序提供的静态模板标签,该标签位于 INSTALLED_APPS 设置项中。
{% extends "blog/base.html" %}的作用是通知Django 继承 blog/base.html 模板。
一切完成后,读者可以返回浏览器中刷新,单击帖子标题以查看帖子的详细视图。
感谢大家的查看与支持。
一篇文章讲解“视图-过滤”,本篇文章讲解“视图-模板引擎”。
视图的模板文件可以支持不同的解析规则,默认情况下无需手动初始化模板引擎。
可以通过下面的几种方式对模板引擎进行初始化。
1. 配置文件
ThinkPHP5.0版本与ThinkPHP5.1版本的目录结构有所变动,因此两个版本的模板设置配置项位置不同
①ThinkPHP5.0版本模板引擎的参数在配置项文件(config.php)中。
②ThinkPHP5.1版本内置模板引擎的参数统一在配置目录的template.php文件中配置。
2. 视图根目录
注:以下以ThinkPHP5.1版本作为示例
1)视图文件的根目录默认情况下位于模块的view目录,每个模块的视图目录可以通过模板参数view_path自定义。
①将模板位置设置到根目录下的viewport文件夹下,在config/template.php文件中进行设置。
②创建Index控制器,并新建index方法
③在根目录的viewport/index/下新建index.html模板
预览:
2)可以用view_base模板引擎参数定义全局的视图根目录,然后模块作为子目录。
①在config/template.php文件中定义view_base
访问Index控制器的index方法,预览:
提示模板文件不存在,并指出模板路径“../template/index/index/index.html”。
②在“../template/index/index/”下创建index.html模板
访问Index控制器index方法,预览:
注意:
1. view_base与view_path的区别:
①view_base的优先级高于view_path
②view_base定义全局视图根目录,模块为子目录,例设置view_base值为“../template/”,模板路径为“../template/index/index/index.tml”,意义为:全局根目录template下的index模块的index控制器的index.html模板。
③view_path定义模块下的视图目录,例设置view_path值为“../viewport/”,模板路径为:“../viewport/index/index.html”,意义为视图目录viewport下的index控制器的index.html模板。当访问其他模块index控制器的index.html模板时,访问的是同一个,都是“../viewport/index/index.html”。
3. 调用engine方法初始化
视图类也提供了engine方法对模板解析引擎进行初始化或者切换不同的模板引擎。
①在Index控制器中,新建vEngine方法
访问预览:
注意:
1. 表示当前视图的模板文件使用原生php进行解析。
②在view/index/下新建index.php文件
预览:
官方扩展库中提供了一个类似于angularjs语法的模板引擎think-angular,具体可以参考参考手册:
另外还包括了一个twig模板引擎扩展:
关注卓象程序员,定期发布技术文章
下一篇讲解“数据库”
*请认真填写需求信息,我们会在24小时内与您取得联系。