在前端開發中,有時我們需要在元素進入視圖時觸發特定的操作。無論是實現懶加載圖片、無限滾動,還是統計廣告曝光率,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小時內與您取得聯系。