整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          HTML5 桌面通知 new Notification

          .背景:
          即時(shí)通訊、桌面端app開發(fā)、當(dāng)用戶和用戶聊天,當(dāng)發(fā)送聊天消息時(shí),須要作收到消息通知,因?yàn)橛玫降募夹g(shù)棧是electron、它也有自己的通知模塊、因?yàn)槠渌脑驎簳r(shí)用不了 最后查到HTML5新增的 Notification API的通知功能。即便將瀏覽器窗口最小化,依然會(huì)收到消息通知、所以就先用它吧、后面再后話處理一下。

          2.通知權(quán)限:
          2.1 首先須要 看瀏覽器是否支持 Notification ,支持才有下文,不然就此止步;
          2.2 經(jīng)過 Notification.permission 檢測(cè)用戶是否容許通知:

          // Notification.permission === 'granted' 用戶容許
          // Notification.permission === 'denied' 用戶拒絕
          // Notification.permission === 'denied' 不知道用戶的選擇,默認(rèn)
          
          if(Notification.permission === 'granted'){
              console.log('用戶容許通知');
              instance_init(title, options);
          }else if(Notification.permission === 'denied'){
              console.log('用戶拒絕通知');
          }else{
              console.log('用戶還沒選擇,去向用戶申請(qǐng)權(quán)限吧');
              Notification.requestPermission(function(status) {
              	if(status=='granted'){
              		console.log('用戶容許通知');
              		instance_init(title, options);
              	}else if(status=='denied'){
              		console.log('用戶拒絕通知');
              	}else{
              		console.log('用戶還沒選擇');
              	}
              });
          }

          3. 主要用到的參數(shù)。其他參數(shù)了解:notification - Web API 接口參考 | MDNMDN Web DocsMDN logoMozilla logo

          title:通知的標(biāo)題
          options:通知的設(shè)置選項(xiàng)(可選)。
          	body:通知的內(nèi)容。
          	tag:表明通知的一個(gè)識(shí)別標(biāo)簽,相同tag時(shí)只會(huì)打開同一個(gè)通知窗口。
          	icon:要在通知中顯示的圖標(biāo)的URL。
          	image:要在通知中顯示的圖像的URL。
          	data:想要和通知關(guān)聯(lián)的任務(wù)類型的數(shù)據(jù)。
          	requireInteraction:通知保持有效不自動(dòng)關(guān)閉,默認(rèn)為false。

          4.代碼實(shí)現(xiàn)

          4.1原生html5方式

          <html>
          
          	<head>
          		<meta charset="UTF-8">
          		<title>H5通知功能 </title>
          	</head>
          
          	<body>
          		<script type="text/javascript">
          			// 調(diào)用通知方法
          			showMsgNotification('狀態(tài)更新提醒','你的朋友圈有3條新狀態(tài),快去查看吧');
          			/**
          			 * H5通知功能 
          			 */
          			function showMsgNotification(out_title, out_msg) {
          				var title = out_title ? out_title : '更新狀態(tài)標(biāo)題';
          				var options = {
          					body: out_msg ? out_msg : "更新狀態(tài)內(nèi)容", // 通知主體
          					requireInteraction: true, // 不自動(dòng)關(guān)閉通知
          					icon: 'http://img18.house365.com/newcms/2017/03/16/148964317858ca26aacf7b5.jpg', // 通知圖標(biāo) 
          					tag: 'hangge',
          				};
          				var Notification = window.Notification || window.mozNotification || window.webkitNotification; // 瀏覽器作兼容處理
          				if(Notification) { //支持桌面通知
          					if(Notification.permission == "granted") { //已經(jīng)容許通知
          						instance_init(title, options);
          					} else {
          						//第一次詢問或已經(jīng)禁止通知(若是用戶以前已經(jīng)禁止顯示通知,那么瀏覽器不會(huì)再次詢問用戶的意見,Notification.requestPermission()方法無效)
          						Notification.requestPermission(function(status) {
          							if(status === "granted") { //用戶容許
          								instance_init(title, options);
          							} else { //用戶禁止
          								console.log('禁止')
          								return false
          							}
          						});
          					}
          					/**
          					 * Notification定義
          					 * */
          					function instance_init(title, options){
          						var instance = new Notification(title, options);
          						instance.onclick = function() {
          							console.log('onclick');
          							// 關(guān)閉通知
          							instance.close();
          						};
          						instance.onerror = function() {
          							console.log('onerror');
          						};
          						instance.onshow = function() {
          							console.log('onshow');
          						};
          						instance.onclose = function() {
          							console.log('onclose');
          						};
          					}
          				} else { //不支持(IE等)
          					console.log("不支持的瀏覽器")
          				}
          			}
          		</script>
          	</body>
          
          </html>

          4.2 electron方式、調(diào)用即可

          在《Python進(jìn)階記錄之urllib模塊》中,我們介紹了Python內(nèi)置的HTTP請(qǐng)求庫(kù)urllib模塊的基本用法,需要重點(diǎn)掌握使用urllib的request模塊進(jìn)行簡(jiǎn)單的get、post請(qǐng)求。今天我們講一下Python內(nèi)置的HTML解析庫(kù)HTMLParser模塊,并結(jié)合之前的re模塊和urllib模塊實(shí)現(xiàn)爬取指定新聞頁提取新聞文本內(nèi)容的小需求。

          HTMLParser模塊簡(jiǎn)介

          我們使用urllib模塊進(jìn)行HTTP請(qǐng)求獲取到的是整個(gè)網(wǎng)頁的HTML,但是我們往往只需要其中一部分對(duì)我們有用的內(nèi)容。這時(shí)我們就可以使用HTMLParser模塊來幫助我們處理HTML。

          HTMLParser是Python內(nèi)置的專門用來解析HTML的模塊。利用HTMLParser,我們可以分析出一段HTML里面的標(biāo)簽、數(shù)據(jù)等,是一種處理HTML的簡(jiǎn)便途徑。我們先來看一個(gè)官方的例子。

          HTMLParser模塊官方例子

          從上述代碼中可以看出,HTMLParser模塊來自html.parser,導(dǎo)包時(shí)要格外注意。使用HTMLParser時(shí),我們需要定義一個(gè)繼承自HTMLParser的子類,并根據(jù)需要重寫HTMLParser父類中的成員方法。例子中使用的各方法作用如下:

          handle_starttag(tag, attrs):識(shí)別HTML的開始標(biāo)簽,例如<html>、<title>、<body>、<div>等。

          handle_endtag(tag):識(shí)別HTML的結(jié)束標(biāo)簽,例如</html>、</body>、</div>、</p>等。

          handle_data(data):識(shí)別HTML標(biāo)簽內(nèi)容,例如“<p>Test</p>”中的Test。

          handle_startendtag(tag, attrs):識(shí)別沒有結(jié)束標(biāo)簽的HTML標(biāo)簽,例如<img />等。

          handle_comment(data):識(shí)別HTML中的注釋內(nèi)容,一般是“<!-- 注釋 -->”中的注釋內(nèi)容。

          HTMLParser采用的是一種事件驅(qū)動(dòng)的模式,HTMLParser找到一個(gè)特定的標(biāo)記時(shí),它會(huì)去調(diào)用一個(gè)用戶定義的函數(shù),以此來通知程序處理。

          我們可以利用這些方法來實(shí)現(xiàn)HTML解析相關(guān)的功能。其中參數(shù)tag表示的是HTML標(biāo)簽,attrs是一個(gè)列表,列表元素為一個(gè)個(gè)“(屬性,值)”形式的元組。HTMLParser會(huì)自動(dòng)將tag和attrs都轉(zhuǎn)為小寫,解析時(shí)調(diào)用feed( )方法,把待解析的HTML字符串傳入即可。

          HTMLParser模塊的簡(jiǎn)單應(yīng)用

          現(xiàn)在有以下網(wǎng)頁,我們需要獲取出里面的新聞文本內(nèi)容。

          待請(qǐng)求網(wǎng)頁

          首先就是獲取該網(wǎng)頁的HTML。經(jīng)過上節(jié)內(nèi)容的學(xué)習(xí),我們很容易想到利用urllib庫(kù)請(qǐng)求獲取這個(gè)網(wǎng)頁的HTML。

          獲取網(wǎng)頁HTML

          代碼很簡(jiǎn)單,使用urlopen( )方法,傳入url即可。此時(shí),我們已經(jīng)得到了整個(gè)網(wǎng)頁的HTML,但是我們要獲取的是新聞內(nèi)容,顯然此時(shí)的HTML中有太多我們不需要的東西。

          觀察整個(gè)網(wǎng)頁HTML,我們發(fā)現(xiàn)新聞內(nèi)容是包含在一個(gè)div中的。

          新聞內(nèi)容相關(guān)HTML

          我們可以使用正則表達(dá)式re模塊將包含新聞內(nèi)容的這個(gè)div提取出來。

          提取新聞內(nèi)容相關(guān)的HTML

          新聞內(nèi)容的div格式主要是:<div class="article-content">...</div>。由于該div下嵌套了其他div,如果我們直接使用r'<div class=\"article-content\">(.*?)</div>'進(jìn)行正則提取,會(huì)發(fā)現(xiàn)在下一個(gè)</div>處就截?cái)嗔恕榱苏_提取所有新聞內(nèi)容相關(guān)的HTML,我們需要在</div>前加一個(gè)</p>,以保證是在新聞內(nèi)容結(jié)束的</div>處截?cái)唷?/p>

          此時(shí),我們已經(jīng)得到了新聞內(nèi)容相關(guān)的HTML。現(xiàn)在還剩最后一部,就是把HTML標(biāo)簽去掉,保留新聞文本內(nèi)容。這一步,我們就可以利用HTMLParser來實(shí)現(xiàn)了。

          HTMLParser提取新聞內(nèi)容

          我們定義一個(gè)繼承自HTMLParser的子類,然后重寫handle_data(data)方法獲取當(dāng)前HTML中的文本內(nèi)容即可。由于我們定義的私有變量__text是通過一個(gè)列表來逐條接收新聞內(nèi)容的,所以我們?cè)陬愔卸x一個(gè)獲取私有變量__text的方法,并將列表轉(zhuǎn)換成字符串。至此,我們已經(jīng)獲取到了新聞的文本內(nèi)容。

          然而,當(dāng)前文本內(nèi)容一整段在一起,看起來并不美觀,與實(shí)際分段的新聞文本內(nèi)容也有差別。我們可以使用HTMLParser來美化新聞內(nèi)容。我們知道,網(wǎng)頁上的新聞內(nèi)容是通過“\n”、“\t”、“<br/>”等特殊符號(hào)或標(biāo)簽進(jìn)行間隔和分段的。因此,我們只需要在解析時(shí)替換掉這些特殊符號(hào)和標(biāo)簽即可。

          替換特殊符號(hào)和標(biāo)簽

          重寫handle_data(data)方法,識(shí)別文本的同時(shí)替換掉“\t”、“\r”、“\n”等特殊字符;重寫handle_starttag(tag, attrs)方法,識(shí)別出<p>、<br>進(jìn)行替換;重寫handle_startendtag(tag, attrs)方法,識(shí)別出<br/>進(jìn)行替換。再次運(yùn)行程序,可以看到,新聞內(nèi)容進(jìn)行了分段,看起來就美觀多了。

          上述過程實(shí)現(xiàn)了一個(gè)非常簡(jiǎn)單的爬蟲,爬取新聞網(wǎng)頁,提取新聞內(nèi)容。當(dāng)然,由于我們目前還沒介紹其他第三方庫(kù),實(shí)現(xiàn)起來還不夠靈活,例如獲取新聞內(nèi)容的div我們現(xiàn)在只能通過正則表達(dá)式實(shí)現(xiàn),但實(shí)際上,如果使用lxml(etree、xpath)、BeautifulSoup等第三方庫(kù)會(huì)更簡(jiǎn)單實(shí)用。

          總結(jié)

          以上內(nèi)容介紹了Python內(nèi)置的HTML解析庫(kù)HTMLParser模塊,需要重點(diǎn)掌握HTMLParser類常用方法的作用,能夠重寫這些方法進(jìn)行自定義解析。感謝大家的支持與關(guān)注,歡迎一起學(xué)習(xí)交流~

          之前官方正式宣布Alert Control中支持HTML & CSS模板,正如上篇文章中所述,HTML 和 CSS 模板允許您輕松創(chuàng)建自定義/現(xiàn)代通知。在本文中,將分享更多與模板相關(guān)的更新,您可以期待DevExpress的v22.1版本了!

          DevExpress Universal Subscription官方最新版免費(fèi)下載試用,歷史版本下載,在線文檔和幫助文件下載-慧都網(wǎng)

          ListBox控件

          在以前的版本中,技術(shù)團(tuán)隊(duì)為WinForms ListBox控件引入了標(biāo)準(zhǔn)模板——一種類似于平鋪視圖中可用的設(shè)計(jì)器,使您可以輕松地在 ListBox 項(xiàng)目表面上排列元素。v22.1 中可用的 HTML 和 CSS 模板將這種自定義靈活性提升到一個(gè)全新的水平。

          上圖取自技術(shù)團(tuán)隊(duì)更新的HTML Demo Center模塊,使用以下HTML標(biāo)記來創(chuàng)建此示例UI。

          <div class="contact">
          <div class="contact-avatar">
          <img class="photo" src="${Photo}" />
          <div class="status" id="status"></div>
          </div>
          <div>
          <div class="contact-body">
          <div class="contact-info">
          <div class="name-info">
          <div class="name">${FirstName} {LastName}</div>
          <img class='info' src='Contact' id="info" />
          </div>
          <div class="phone">${HomePhone}</div>
          </div>
          </div>
          <div class='selection'></div>
          </div>
          </div>

          ComboBox編輯

          ComboBox編輯與 ListBox Edit 模板類似,您可以利用 ${FieldName} 語法來添加數(shù)據(jù)占位符。 在運(yùn)行時(shí),這些占位符將替換為來自數(shù)據(jù)源的實(shí)際值。 正如您在下面看到的,這使HTML 和 CSS 模板成為構(gòu)建數(shù)據(jù)感知控件布局的完美工具。

          此示例 ComboBox Edit UI 的模板如下:

          <div class="contact">
          <div class="contact-avatar">
          <img class="photo" src="${Photo}" />
          </div>
          <div>
          <div class="contact-body">
          <div>
          <div class="name">${FirstName} {LastName}</div>
          <div class="label">${Department}</div>
          </div>
          </div>
          <div class='selection'></div>
          </div>
          </div>

          TileView模板的項(xiàng)目自動(dòng)高度

          在 v21.2 發(fā)布周期中引入了對(duì) TileView 的 HTML 和 CSS 模板支持,在官方即將發(fā)布的版本中,您將能夠根據(jù)內(nèi)容大小調(diào)整圖塊。

          要啟用此功能,只需將 OptionsHtmlTemplate.ItemAutoHeight 屬性設(shè)置為 true。

          上面的圖像是使用以下 HTML 代碼創(chuàng)建的:

          <div class="container">
          <div class="card">
          <div class="stripe" id="stripe"></div>
          <div class="content">
          <div class="top-block">
          <div class="caption"><b>${Name}</b></div>
          </div>
          <div class="description">${Description}</div>
          <div class="bottom-block">
          <div class="bottom-block-near">
          <div><span style="color:@DisabledText">Due Date: </span>${DueDate}</div>
          <div><span style="color:@DisabledText">Employee: </span>${Employee}</div>
          </div>
          <div class="status">${Status}%</div>
          </div>
          </div>
          </div>
          </div>

          DevExpress WinForm

          DevExpress WinForm擁有180+組件和UI庫(kù),能為Windows Forms平臺(tái)創(chuàng)建具有影響力的業(yè)務(wù)解決方案。DevExpress WinForms能完美構(gòu)建流暢、美觀且易于使用的應(yīng)用程序,無論是Office風(fēng)格的界面,還是分析處理大批量的業(yè)務(wù)數(shù)據(jù),它都能輕松勝任!


          主站蜘蛛池模板: 东京热无码av一区二区| 日韩一区二区在线播放| 国产精品一区二区三区99| 精品久久国产一区二区三区香蕉 | 精品少妇人妻AV一区二区| 精品国产一区二区三区久| 夜夜嗨AV一区二区三区| 久久青青草原一区二区| 香蕉免费看一区二区三区| 国产精品99精品一区二区三区| 国产探花在线精品一区二区| 亚洲av无码一区二区三区在线播放| 国产福利一区二区在线视频| 国产第一区二区三区在线观看| 国产一区三区三区| 精品日韩在线视频一区二区三区| 伊人无码精品久久一区二区| 精品无码一区在线观看| 精品一区二区久久| 在线观看午夜亚洲一区| 国产一区二区高清在线播放| 精品一区二区AV天堂| 在线电影一区二区三区| 秋霞鲁丝片一区二区三区| 亚洲AV无码一区二三区| 色视频综合无码一区二区三区 | 国偷自产视频一区二区久| 精品国产一区二区三区久| 精品国产日韩一区三区| 国产精品亚洲专一区二区三区| 无码中文字幕一区二区三区| 国产综合视频在线观看一区| 日韩社区一区二区三区| 久久免费国产精品一区二区| 99热门精品一区二区三区无码| 在线成人一区二区| 日本精品少妇一区二区三区| 又硬又粗又大一区二区三区视频 | 日本高清天码一区在线播放| 三上悠亚亚洲一区高清| 在线免费视频一区|