好程序員web前端教程分享異步加載CSS的一些方法,在我們寫頁面的時候,我們做最主要的任務就是提高頁面的性能和彈性加載速度,以不會延遲頁面的呈現的形式來加載CSS。這是因為在默認情況下。
- 瀏覽器會同步加載外部的CSS
- 在下載和解析CSS時會影響所有頁面呈現
這兩種情況都會導致潛在的延遲。
當然,這也是在開始渲染頁面之前,應該至少加載網站的CSS的一部分,并且為了立即將該初始CSS添加到瀏覽器,我們建議內聯css。對于整體數量較少的網站,僅此一項就足夠了,但如果CSS很大(例如,大于15到20kb),它可以幫助性能按優先級將其拆分。拆分后,應該在后臺-aka中加載不太關鍵的CSS異步。在這篇文章中,我的目的是描述我在這些日子的首選方式,這實際上已存在很長的時間段了。
有幾種方法可以異步加載CSS,但沒有一種方法可以像您期望的那樣直觀。與script元素不同,沒有async或defer屬性可以簡單地應用于link元素,因此多年來我們維護了loadCSS項目,使得加載異步CSS的過程更加容易。最近,瀏覽器已經標準化了它們的CSS加載行為,因此可能不再需要像loadCSS這樣的專用腳本來處理它們的微小差異。
今天,我們掌握了瀏覽器如何處理各種link元素屬性的一些知識,我們可以通過一小段HTML來實現異步加載CSS的效果。在這里,它是異步加載樣式表的最簡單方法:
<link rel="stylesheet" href="/styles/index.css" media="print" onload="this.media='all'">
這行HTML簡潔,但它不是很直觀,所以讓我們分解這里發生的事情。
首先,將link's media屬性設置為print。“打印”是一種媒體type,它說“應用此樣式表的基于打印的媒體的規則”,換句話說,當用戶嘗試打印頁面時應用它們。不可否認,我們希望我們的樣式表適用于所有媒體(尤其是屏幕)而不僅僅是打印,但通過聲明與當前環境不匹配的媒體類型,我們可以實現一個有趣且有用的效果:瀏覽器將加載樣式表沒有延遲頁面渲染,異步!這很有幫助,但并不是我們想要的全部。我們還希望CSS在加載后實際應用于屏幕環境。為此,我們可以使用該onload屬性將link媒體設置為all完成加載。
介紹完了老方子,我們再來看看新藥方,是的,同樣的!在過去一兩年中,我們一直在使用link[rel=preload](而不是rel=stylesheet)來實現與上面類似的模式(分別rel在加載后切換屬性而不是media屬性)。使用這種方法仍然可以正常工作,但是,使用時需要考慮幾個缺點preload。首先,瀏覽器對于加載的支持依舊不是特別的好因此如果你想依賴它來跨瀏覽器獲取和應用樣式表,那么填充(例如一個loadCSS)是必要的。更主要的是,preload盡可能早地獲取文件,優先級最高,可能會優先考慮其他重要下載,并且可能比非關鍵CSS實際需要的優先級更高。
幸運的是,如果你碰巧想要提供的高優先級提取rel=preload(在支持它的瀏覽器中),你可以將它與上面的模式結合起來。
<linkrel="preload"href="styles/index.css"as="style"onload="this.rel='stylesheet'">
這和之前的方法沒什么區別啊!是的確實如此,但是呢,語法上更加好一些。另外就是你仔細點就會發現 as="style"這個屬性,所以 preload 不僅僅可以用在 CSS 文件上,而是可以用在絕大多數的資源文件上。
<linkrel="preload"href="styles/index.css"as="script">
我們可以新建一個script標簽來指向它:
var script=document.createElement("script");
script.src="scriptfile.js";
document.body.appendChild(script);
在這個時候瀏覽器就直接從緩存中拿這個文件了,不會再發請求了,因為此前已經加載好了。
那么 preload 中的 as 屬性支持哪些資源文件呢?下面這些都可以
· font
· image
· object
· script
· style
不要想太多,只有谷歌太對它做出完美的支持。
也可以用JavaScript來實現:
$(window).load(function () {
//異步延遲加載樣式
var link=$('<link />');
link.attr('href', '/styles/index.css');
link.attr('rel', 'stylesheet');
link.appendTo($('head'));
link.load(function () {
console.info('加載成功...');
});
本內容偽原創文章,轉載請注明出處。
C#中,你可以使用System.Net.Http.HttpClient來從網頁獲取HTML內容,然后使用System.Text.RegularExpressions.Regex來解析和提取HTML中的<title>標簽內容。以下是一個簡單的示例,演示了如何執行此操作:
csharpusing System;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
class Program
{
static readonly HttpClient client=new HttpClient();
static async Task Main(string[] args)
{
try
{
// 要抓取內容的網頁URL
string url="http://example.com";
// 發送HTTP GET請求獲取網頁內容
string htmlContent=await client.GetStringAsync(url);
// 正則表達式,用于匹配<title>標簽內的內容
string titlePattern=@"<title>(.+?)</title>";
// 使用Regex.Match方法查找匹配項
Match match=Regex.Match(htmlContent, titlePattern);
// 如果找到了匹配項
if (match.Success)
{
// 提取<title>標簽內的內容
string title=match.Groups[1].Value;
// 輸出提取到的title
Console.WriteLine("網頁標題: " + title);
}
else
{
Console.WriteLine("未找到<title>標簽。");
}
}
catch (HttpRequestException e)
{
Console.WriteLine("\nException Caught!");
Console.WriteLine("Message :{0} ", e.Message);
}
}
}
在這個示例中,我們首先創建了一個HttpClient實例,然后使用GetStringAsync方法異步獲取網頁的HTML內容。接下來,我們定義了一個正則表達式titlePattern,用于匹配<title>標簽中的文本。Regex.Match方法用于在HTML內容中查找匹配項。如果找到匹配項,我們就從匹配結果中提取出標題文本并打印出來。
請注意,使用正則表達式解析HTML可能不是最可靠的方法,因為HTML的結構可能會非常復雜,并且正則表達式可能無法正確處理所有情況。在實際應用中,建議使用HTML解析庫(如AngleSharp或HtmlAgilityPack)來解析HTML文檔,這樣可以更健壯和準確地提取所需的信息。
下面是一個使用HtmlAgilityPack庫提取網頁標題的示例:
csharpusing System;
using System.Net.Http;
using HtmlAgilityPack;
using System.Threading.Tasks;
class Program
{
static readonly HttpClient client=new HttpClient();
static async Task Main(string[] args)
{
try
{
// 要抓取內容的網頁URL
string url="http://example.com";
// 發送HTTP GET請求獲取網頁內容
string htmlContent=await client.GetStringAsync(url);
// 加載HTML內容到HtmlDocument對象
HtmlDocument doc=new HtmlDocument();
doc.LoadHtml(htmlContent);
// 使用XPath查詢找到<title>元素并獲取其InnerText
var titleNode=doc.DocumentNode.SelectSingleNode("//title");
if (titleNode !=null)
{
string title=titleNode.InnerText;
Console.WriteLine("網頁標題: " + title);
}
else
{
Console.WriteLine("未找到<title>標簽。");
}
}
catch (HttpRequestException e)
{
Console.WriteLine("\nException Caught!");
Console.WriteLine("Message :{0} ", e.Message);
}
}
}
在這個示例中,我們使用了HtmlAgilityPack庫來加載HTML內容,并使用XPath查詢來定位<title>標簽。這種方法通常比使用正則表達式更加穩定和可靠。在使用HtmlAgilityPack之前,你需要通過NuGet安裝它:
bashInstall-Package HtmlAgilityPack
或者,如果你使用.NET Core CLI,可以運行:
一天,老板不滿地說:“喂,你這C#爬蟲怎么連標題都沒給我抓回來?我需要的是一份完整的報告,包括所有網頁的標題,趕緊給我重新抓一遍!”那一刻,我仿佛看到了老板眼中閃爍的怒火,感受到了他對我工作的失望。
我仿佛看到了老板眼中閃爍的怒火,就像是火山即將爆發前的預兆。我心里咯噔一下,知道這次可能玩大了。
我趕緊賠著笑臉說:“老板,真不好意思,這次是我的失誤。我馬上就去給您抓回那些‘逃跑’的標題!”
其實我心里暗笑,因為那些標題我早就抓回來了,只是故意沒展示出來。這可是職場生存法則啊,不能一次交出所有秘密,得留點懸念,讓老板對你始終保持期待和好奇。你覺得這樣做對嗎?歡迎討論,哈哈!
代碼其實很簡單:
// 使用XPath查詢獲取title標簽
HtmlNode titleNode=doc.DocumentNode.SelectSingleNode("//title");
//這行代碼是使用C#的HtmlAgilityPack庫來從HTML文檔中提取<title>標簽的內容。
//目的是從doc表示的HTML文檔中選擇第一個<title>標簽,并將這個標簽的節點對象賦值給titleNode變量。
如果要獲取<title>標簽中的文本內容,這樣寫:
string titleText=titleNode?.InnerText;
這里,?.是一個null條件運算符,如果titleNode為null(也就是說沒有找到<title>標簽),
則titleText會被賦值為null,否則,它會被賦值為<title>標簽中的文本內容。
這個代碼是怎么使用的呢?下面我解釋下實現過程:
static string? ParseTitleData(string htmlContent)
{
if (string.IsNullOrEmpty(htmlContent))
{
return null;
}
HtmlDocument doc=new HtmlDocument();
doc.LoadHtml(htmlContent);
// 使用XPath查詢獲取title標簽
HtmlNode titleNode=doc.DocumentNode.SelectSingleNode("//title");
if (titleNode !=null)
{
// 獲取title節點的文本內容
string titleText=titleNode.InnerText.Trim();
return "頁面標題: " + titleText;
}
else
{
// 如果沒有找到title標簽,返回null
return null;
}
}
//這段代碼定義了一個名為 ParseTitleData 的靜態方法,
//它接受一個 htmlContent 字符串作為輸入,并試圖從中解析出網頁的標題。
//該方法使用 HtmlAgilityPack 庫來解析 HTML 內容。
是不是很簡單?這個方法的目的是從給定的 HTML 內容中提取網頁的標題。如果成功找到標題,它會返回一個包含 "頁面標題: " 和實際標題的字符串。如果 HTML 內容為空、null 或不包含 <title> 標簽,它會返回 null。
看效果:
完整代碼是包括如何異步獲取網頁內容的。如果有朋友需要的話,請關注我并留言,今天就寫到這吧,太晚了,休息啦!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。