<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          首頁

          HTML第一課

          seo達人

          HTML基本概況





          HTML文檔基本格式

          樣式如下:



          注意:文章以下出現的“《》”書名號僅代表大于號“>”和小于號“<”。

          主要包括:<!DOCTYPE>文檔類型聲明、《html》根標記、《head》頭部標記、《bady》主題標記。

          1.<!DOCTYPE>標記

          標記位于文檔的最前面,用于向瀏覽器說明 當前文檔使用哪種 HTML 或 XHTML 標準規范。

          2.《html》標記

          《html》標記位于<!DOCTYPE>標記之后,也稱根標記。用于告知瀏覽器其本身是一個HTML文檔?!秇tml》標記標志著HTML文檔的開始,《/html》標記標志著HTML文檔的結束,在他們之間的是文檔的頭部和主體內容。

          3.《head》標記

          《head》標記用于定義HTML文檔的頭部信息,也稱頭部信息。緊跟在《html》標記之后,主要用來封存其他位于文檔頭部的標記,一個HTML文檔只能有一對《head》標記。

          4.《body》標記

          《body》標記用于定義HTML文檔所要顯示的內容,也稱主體標記。瀏覽器中所要顯示的所有文本、圖像、音頻、和視頻等信息都必須位于《body》標記內。一個HTML文檔只能有一對《body》標記。



          HTML標記

          所謂標記就是放在”<>"標記中表示 某個功能的編碼命令,也稱為HTML標簽或HTML元素。

          1.單標記和雙標記

          雙標記:也稱體標記,是指由開始和結束兩個標記符組成的標記?;菊Z法格式如下:

          <標記名>內容</標記名>

          單標記:也稱空標記,是指用一個標記符號即可完整的描述某個功能的標記?;菊Z法格式如下:

          <標記名/>

          2.注釋標記



          注意:注釋標記中不能嵌套注釋標記



          標記屬性

          《h1 align = center》標題文本《h1》其中align為屬性名,center位屬性值,表示“標題文本”居中對齊,對于標題標記還可以設置文本左對齊、右對齊,對應的屬性值是left和right。

          在鑲嵌結構中,HTML 元素總是遵循“就近原則”。



          HTML文檔頭部相關標記

          1.設置頁面標題標記

          《title》標記用于定義HTML頁面的標題,必須位于《head》標記之內。一個HTML文檔只能有一對《title》《/title》標記,《title》《/title》之間的內容將顯示在瀏覽器窗口的標題欄中,基本語法格式如下:

          《title》網頁標題名稱《/title》

          2.定義頁面元信息標記《meta/》

          《meta/》標記用于定義頁面的元信息,可重復在《head》頭部標記中,在HTML中是一個單標記。

          基本語法格式:

          1.1《meta name=“名稱” content="值“/》

          (1)設置網頁關鍵字

          《meta name=“keywords” content="…"》

          content屬性的值用于定義關鍵字的具體內容,多個關鍵字內容之間可以用“,”分隔。

          (2)設置網頁描述

          《meta name=“description” content=“…"》

          content屬性的值是用于定義描述的具體內容。需要注意的是網頁描述的文字不必過多。

          (3)設置網頁作者

          《meta name=“auther” content=“…”》

          content屬性的值是用于定義具體的作者信息。

          2.1《meta http-equiv=“名稱“ content=”值“

          (1)設置字符集

          《meta http-equiv=“Content-Type” content=“text/html;charset=utf-8“/》

          (2)設置頁面自動刷新與跳轉

          《meta http-equiv=“refresh” content=“10;url=http;//www.itcast.cn“/》



          HTML文本控制標記

          1.標題和段落標記

          (1)標題標記

          HTML提供了6個等級的標題,即《h1》《h2》《h3》《h4》《h5》《h6》.基本語法格式如下:

          《hn align=“對齊方式“》標題文本《/hn》

          (2)段落標記

          段落的標記就是《/p》基本語法格式如下:

          《p align=“對齊方式”》段落文本《/p》

          (3)水平線標記《hr/》



          含義 屬性值

          屬性名:align,設置水平線的對齊方式 可選擇left、right、center三種值,默認為center,居中對齊

          屬性名:size,設置水平線的粗細 以像素為單位,默認為2像素

          屬性名:color,設置水平線的顏色 可用顏色名稱、十六進制#RGB、right(r,g,b)

          屬性名:width,設置水平線的寬度 可以是確定的像素值,也可以是瀏覽器窗口的百分比,默認為100%

          (4)換行標記《br/》

          使用Enter鍵換行的段落在瀏覽器中實際上并沒有換行,只是多出來了一個字符的空格,而使用換行標記的段落卻實現了強制換行的效果。

          2.文本樣式標記

          文本樣式標記《font》,用來控制網頁中的字體、字號和顏色?;菊Z法格式如下:

          《font 屬性=“屬性值”》文本內容《/font》



          屬性名 含義

          face 設置文字的字體,例如微軟雅黑、黑體、宋體等

          size 設置文字的大小,可以取1~7之間的整數值

          color 設置文字的顏色

          注意:XHTML中不贊同使用《font》標記,可使用CSS樣式代替《font》來定義文本的字體、大小和顏色。

          3.文本格式化標記



          標記 顯示效果

          《i》《/b》 字體以粗體方式顯示

          《i》《/i》 字體以斜體方式顯示

          《s》《/s》 字體以加刪除線方式顯示

          《u》《/u》 字體以加下劃線方式顯示

          4.特殊字符標記






          關于 XSS攻擊

          seo達人

          XSS攻擊是什么

          簡介

          攻擊原理

          例子

          防御方法

          簡介

          XSS(Cross Site Scripting, 跨站腳本攻擊)又稱是 CSS, 在 Web攻擊中比較常見的方式, 通過此攻擊可以控制用戶終端做一系列的惡意操作, 如 可以盜取, 篡改, 添加用戶的數據或誘導到釣魚網站等

          攻擊原理

          比較常見的方式是利用未做好過濾的參數傳入一些腳本語言代碼塊通常是 JavaScript, PHP, Java, ASP, Flash, ActiveX等等, 直接傳入到頁面或直接存入數據庫通過用戶瀏覽器閱讀此數據時可以修改當前頁面的一些信息或竊取會話和 Cookie等, 這樣完成一次 XSS攻擊

          例子

          http://example.com/list?memo=&lt;script&gt;alert(“Javascript代碼塊”)&lt;/script&gt;

          http://example.com/list?memo=&lt;strong οnclick=‘alert(“驚喜不斷”)’>誘惑點擊語句</strong>

          http://example.com/list?memo=&lt;img src=’./logo.jpg’ οnclick=‘location.href=“https://blog.csdn.net/qcl108”;’/&gt;

          以上例子只是大概描述了方式, 在實際攻擊時代碼不會如此簡單

          防御方法

          防止 XSS安全漏洞主要依靠程序員較高的編程能力和安全意識

          去掉任何對遠程內容的引用 如 樣式或 JavaScript等

          Cookie內不要存重要信息為了避免 Cookie被盜, 最好 Cookie設置 HttpOnly屬性防止 JavaScript腳本讀取 Cookie信息

          不要信任用戶的輸入, 必須對每一個參數值做好過濾或轉譯: (& 轉譯后 &amp;), (< 轉譯后 &lt;), (> 轉譯后 &gt;), (" 轉譯后 &quot;), (\ 轉譯后 &#x27;), (/ 轉譯后 &#x2F;), (;)等


          網頁設計基礎之HTML(一)

          seo達人

          網頁設計基礎之HTML(一)

          1.Web的基本概念

          web(World Wide Web)即全球廣域網,也稱為萬維網,它是一種基于超文本和HTTP的、全球性的、動態交互的、跨平臺的分布式圖形信息系統。是建立在Internet上的一種網絡服務,為瀏覽者在Internet上查找和瀏覽信息提供了圖形化的、易于訪問的直觀界面,其中的文檔及超級鏈接將Internet上的信息節點組織成一個互為關聯的網狀結構。

          主要包含結構,表現和行三個方面



          2.HTML簡介

          <!DOCTYPE html> 聲明為 HTML5 文檔

          <html> 元素是 HTML 頁面的根元素

          <head> 元素包含了文檔的元(meta)數據

          <title> 元素描述了文檔的標題

          <body> 元素包含了可見的頁面內容

          <h1> 元素定義一個大標題

          <p> 元素定義一個段落

          <標記名>內容</標記名> 雙標記,也稱標記體

          <標記名/> 單標記,也稱空標記

          <!--注釋內容--> 注釋標記

          <標記名 屬性1="屬性值1" 屬性2="屬性值2">內容<//標記名>

          <title>網頁標題名</title> 設置頁面標題標記

          <meta/> 定義頁面原信息

          <link> 引用外部文件標記

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          11

          12

          13

          14

          注意元素的就近原則

          補充:link的屬性 請參考此網址



          3.HTML入門

          ①HTML的概念:HTML 是用來描述網頁的一種語言。

          ②HTML的文本控制標記

          1.標題標記:

          標題(Heading)是通過<h1> - <h6>標簽進行定義的。



          對齊方式:

          left:設置標題文字左對齊

          center:設置標題文字居中

          ringt: 設置標題文字右對齊

          使用方法 <h2 align="left">二級標題 左對齊</h2>



          2.段落標記

          段落是通過 <p>標簽定義的;其他同標題標記一致。



          3.水平線標記<hr/>

          相關屬性

          使用方法<hr color="red" align="left" size="5" width"600"/>



          4.換行標記<br/>

          1.1文本樣式標記

          font的屬性



          1.2文本格式化標記

          詳情請點我



          1.3特殊字符標記

          詳情請點我,并查看HTML字符實體部分



          4.附上本節課的腦圖





          注:本文參考自菜鳥教程


          字面量方式和new方式的區別及用法

          seo達人

          一 - 字面量方式和new方式

          ?每次創建數組或對象的時候,都能用以下兩種方法創建:咦?有什么區別呢?還有哪些可以有這兩種方法呢?我到底用哪一種呢?



          var arr = [];//字面量方法創建數組

          var arr = new Array();//實例化構造函數方法創建數組



          var obj = {};//字面量方法創建對象

          var obj = new Object();//實例化構造函數方法創建對象



          二 - 哪些對象可以new?

          ?只要存在構造函數的都可以new出來。



          var num = new Number();

          var boo = new Boolean(); 

          var str = new String(); 

          var arr = new Array(); 

          var obj = new Object(); 

          var fn = new Function();

          var reg = new RegExp();

          var date = new Date();



          基本上來說 js中對象,除了null ,undefined,其他的都是可以用new出來的。



          三 - 字面量是什么?

          字面量表示如何表達這個值,一般除去表達式,給變量賦值時,等號右邊都可以認為是字面量。



          JavaScript支持字面量,允許使用一種簡潔而可讀的記法來創建對象、數組



          字面量分為:字符串字面量(string literal )、數組字面量(array literal)和對象字面量(object literal),另外還有函數字面量(function literal)等等。



          var num = 1;

          var boo = true;

          var str = "a";

          var arr = [];

          var obj = {};

          var fn = function(){};

          var reg = /\s/g;



          四 - 兩種的區別

          字面量語法簡單,直接,優雅

          也沒有必要去使用new去調用構造方法,減少代碼,減少代碼運算量。

          那new這個操作符到底做了什么?

          var arr = new Array();

          /

          new:

                 1:var obj = {};

                 2:obj.proto = Array.prototype;

                 3:Array.call(obj);

          /



          五 - 使用哪一種?

          字面量比new

          比如:{}是字面量,可以立即求值



          而new Object()本質上是方法(只不過這個方法是內置的)調用, 既然是方法調用,就涉及到在proto鏈中遍歷該方法,當找到該方法后,又會生產方法調用必須的堆棧信息,方法調用結束后,還要釋放該堆棧。

          ————————————————


          JS實現xml與json互轉且基本保持原樣

          seo達人



          如果非要代碼實現的話,github上一個不錯的js庫(X2JS):https://github.com/abdolence/x2js

          自己寫了demo測試了一下:



          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="utf-8">

          <title></title>

          </head>

          <body>

          </body>

          <script src="js/xml2json.js" type="text/javascript" charset="utf-8"></script>

          <script type="text/javascript">

          var xmlText =

          '<mxGraphModel><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="2" value="" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="220" y="90" width="120" height="80" as="geometry"/></mxCell><mxCell id="3" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1"><mxGeometry x="410" y="110" width="80" height="80" as="geometry"/></mxCell></root></mxGraphModel>';

          console.log("原始數據xml:"+xmlText);

          var x2js = new X2JS();

          var jsonObj = x2js.xml_str2json( xmlText );

          console.log(jsonObj);

          var xmlAsStr = x2js.json2xml_str( jsonObj );

          console.log(xmlAsStr);

          </script>

          </html>

          效果如下:







          基本能還原,只是""變成了'',這個應該問題不大的。






          DataGridView(VS中表格)刪除和刷新

          seo達人

          功能描述:右擊表格中對應的行,進行刪除或者刷新的操作。

          先往DataGridView上拖一個ContextMenuStrip控件





          在下面分別輸入刪除與刷新





          雙擊刪除,輸入代碼:



            private void 刪除ToolStripMenuItem_Click_1(object sender, EventArgs e)

                  {

                      try

                      {

                          DialogResult dr = MessageBox.Show("確定刪除嗎?", "提示", MessageBoxButtons.OKCancel);

                          if (dr == DialogResult.OK)

                          {

                              //獲取選中行的數據

                              Facade.FoodMenuCateFa?ade fa?ade = new Facade.FoodMenuCateFa?ade();

                              Entity.T_FoodMenuCate t_Food = new Entity.T_FoodMenuCate();

                              t_Food.CateName = dataFood.CurrentRow.Cells[1].Value.ToString();

                              int list1 = fa?ade.DeleteFoodMenu(t_Food);



                              frmTips f = frmTips.GetInstance("刪除完成");

                              f.Show();

                          }



                      }

                      catch (Exception ex)

                      {

                          MessageBox.Show(ex.Message);

                      }

                  }



          雙擊刷新,輸入代碼:

                  private void 刷新ToolStripMenuItem_Click(object sender, EventArgs e)

                  {//通過走七層查詢出數據庫中新的內容:

                      Facade.FoodMenuCateFa?ade fa?ade = new Facade.FoodMenuCateFa?ade();

                      Entity.T_FoodMenuCate t_Food = new Entity.T_FoodMenuCate();

                      List<Entity.T_FoodMenuCate> list = fa?ade.SelectFoodMenu(t_Food);

                      //把值賦給表格

                      dataFood.DataSource = list;

                  }


          前端解決跨域問題的常用方法

          seo達人

          首先,跨域是什么?



          只要協議、域名、端口有任何一個不同,都被當作是不同的域。為什么三者任何一個不同就會產生跨域呢,想想也很容易知道,要是很隨便引用什么外部文件,不同標簽下的頁面引用類似的彼此的文件,瀏覽器很容易懵逼的,保障不了安全問題,但在安全限制的同時也給注入iframe或是ajax請求上帶來了不少麻煩。所以我們要通過一些方法使本域的js能夠操作其他域的頁面對象或者使其他域的js能操作本域的頁面對象



          但有兩點至少要清楚:



          如果是協議和端口造成的跨域問題“前臺”是無能為力的;

          在跨域問題上,域僅僅是通過“URL的首部”來識別而不會去嘗試判斷相同的ip地址對應著兩個域或兩個域是否在同一個ip上。

          (“URL的首部”指window.location.protocol +window.location.host,也可以理解為“Domains, protocols and ports must match”。)

          1.通過HTML5的postMessage方法跨域



          頁面M通過postMessage方法發送消息如下:



          window.onload = function() {  

              var iframe_dom = document.getElementById('iframId');  

              var targetOrigin = ";

              iframe_dom.contentWindow.postMessage('hello world!', targetOrigin);  

          };

          備注:



          postMessage的使用方法:



          originwindow.postMessage(message, targetOrigin);



          originwindow:是說的目標窗口,即要給某個window發消息,是 window.frames 屬性的成員或者由 window.open 方法創建的窗口

          message: 是要發送的消息,類型為 String、Object (但IE8、9 不支持)

          targetOrigin: 是限定消息接收范圍,不限制請使用 '*

          頁面N通過message事件監聽并接受消息如下:



          let onmessage = function (event) {  

            var data = event.data;//由發送窗口傳過來的消息內容  

            var origin = event.origin;//由發送窗口傳過來的消息來源地址  

            var source = event.source;//源Window對象  

            if(origin=="
          ;

              console.log(data);//hello world!  

            }  

          };  

          if (typeof window.addEventListener != 'undefined') {  

            window.addEventListener('message', onmessage, false);  

          } else if (typeof window.attachEvent != 'undefined') {  

            //for ie  

            window.attachEvent('onmessage', onmessage);  

          }

          或者為了防止接入方的命名沖突,也可以約定事件名,以此加以區分



          例如



          window.addEventListener("message", function(event) {

            if (

              event &&

              typeof event.data == "object" &&

              event.data.event == "FUNCTION_NAME"

          ){

          document.getElementById("val").innerHTML = event.data.value;

          } });

          2.通過JSONP



          上面那種方式的通信是雙向的,頁面與iframe或是頁面與頁面之間的



          JSONP主要是封裝好的請求方式添加callback,這個callback是由前后端約定好的



          它的優劣勢:



          JSONP的優點:它不像XMLHttpRequest對象實現的Ajax請求那樣受到同源策略的限制;它的兼容性更好,在更加古老的瀏覽器中都可以運行,不需要XMLHttpRequest或ActiveX的支持;并且在請求完畢后可以通過調用callback的方式回傳結果。

          JSONP的缺點:它只支持GET請求而不支持POST等其它類型的HTTP請求;它只支持跨域HTTP請求這種情況,不能解決不同域的兩個頁面之間如何進行JavaScript調用的問題;無法判斷它是否請求成功,只能通過timeout

          3.CORS跨域



          實現CORS通信的關鍵是服務器端,只要服務端那邊實現了CORS接口,就可以跨源通信



          CORS(Cross-Origin Resource Sharing)跨域資源共享,定義了必須在訪問跨域資源時,瀏覽器與服務器應該如何溝通。CORS背后的基本思想就是使用自定義的HTTP頭部讓瀏覽器與服務器進行溝通,從而決定請求或響應是應該成功還是失敗。目前,所有瀏覽器都支持該功能,IE瀏覽器不能低于IE10。整個CORS通信過程,都是瀏覽器自動完成,不需要用戶參與。對于開發者來說,CORS通信與同源的AJAX通信沒有差別,代碼完全一樣。瀏覽器一旦發現AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感覺



          服務器端對于CORS的支持,主要就是通過設置Access-Control-Allow-Origin來進行的。如果瀏覽器檢測到相應的設置,便可以允許Ajax進行跨域的訪問



           



          CORS和JSONP對比



          JSONP只能實現GET請求,而CORS支持所有類型的HTTP請求。



          使用CORS,開發者可以使用普通的XMLHttpRequest發起請求和獲得數據,比起JSONP有更好的錯誤處理。



          JSONP主要被老的瀏覽器支持,它們往往不支持CORS,而絕大多數現代瀏覽器都已經支持了CORS)。



          CORS與JSONP相比,顯然更為先進、方便和可靠。



          4.設置代理



          目前市場上用vue技術不在少數,下面介紹一種配置代理方式



          在vue.config.js該文件里面配置如下:



           devServer: {

                  port: 8001,

                  open: true,

                  disableHostCheck: true,

                  proxy: {

                      '/api': {

                          target: 'https:/xxx.com',

                          secure: true, // false為http訪問,true為https訪問

                          ws: true,

                          changeOrigin: true,

                          pathRewrite: {

                              '^/api': ''

                          }

                       }

                  }

           }

           



          后面請求是需要帶上‘/api’請求即可


          ES6的解構賦值的用途總結

          seo達人

          二 - ES6的解構賦值的用途總結

          2 - 什么是ES6解構

          在ES6中添加了一個新屬性:解構,允許你使用類似數組或對象字面量的語法將數組和對象的屬性賦給各種變量。解構是一種打破數據結構,將其拆分為更小部分的過程,允許我們將右邊的表達式看起來也像變量聲明一般,然后在左邊將值一一提取。 解構這種賦值語法較為簡潔,比傳統的屬性訪問更為清晰。

          還不了解什么是解構賦值的,請參考:https://blog.csdn.net/azxqwe123/article/details/103296603

          下面只講怎么應用:



          2.1 - ES6解構賦值7種場景案例—用途

          (1)交換變量的值



          [x, y] = [y, x];

          上面代碼交換變量x和y的值,這樣的寫法不僅簡潔,而且易讀,語義非常清晰。



          (2)從函數返回多個值



          函數只能返回一個值,如果要返回多個值,只能將它們放在數組或對象里返回。有了解構賦值,取出這些值就非常方便。



          // 返回一個數組



          function example() {

            return [1, 2, 3];

          }

          var [a, b, c] = example();



          // 返回一個對象



          function example() {

            return {

              foo: 1,

              bar: 2

            };

          }

          var { foo, bar } = example();



          (3)函數參數的定義



          解構賦值可以方便地將一組參數與變量名對應起來。



          // 參數是一組有次序的值

          function f([x, y, z]) { ... }

          f([1, 2, 3]);



          // 參數是一組無次序的值

          function f({x, y, z}) { ... }

          f({z: 3, y: 2, x: 1});



          (4)提取JSON數據



          解構賦值對提取JSON對象中的數據,尤其有用。



          var jsonData = {

            id: 42,

            status: "OK",

            data: [867, 5309]

          };



          let { id, status, data: number } = jsonData;



          console.log(id, status, number);

          // 42, "OK", [867, 5309]

          上面代碼可以快速提取JSON數據的值。



          (5)函數參數的默認值



          jQuery.ajax = function (url, {

            async = true,

            beforeSend = function () {},

            cache = true,

            complete = function () {},

            crossDomain = false,

            global = true,

            // ... more config

          }) {

            // ... do stuff

          };





          指定參數的默認值,就避免了在函數體內部再寫var foo = config.foo || ‘default foo’;這樣的語句。



          (6)遍歷Map結構



          任何部署了Iterator接口的對象,都可以用for…of循環遍歷。Map結構原生支持Iterator接口,配合變量的解構賦值,獲取鍵名和鍵值就非常方便。



          var map = new Map();

          map.set('first', 'hello');

          map.set('second', 'world');



          for (let [key, value] of map) {

            console.log(key + " is " + value);

          }

          // first is hello

          // second is world

          如果只想獲取鍵名,或者只想獲取鍵值,可以寫成下面這樣。



          // 獲取鍵名

          for (let [key] of map) {

            // ...

          }



          // 獲取鍵值

          for (let [,value] of map) {

            // ...

          }



          (7)輸入模塊的指定方法



          加載模塊時,往往需要指定輸入那些方法。解構賦值使得輸入語句非常清晰。



          const { SourceMapConsumer, SourceNode } = require("source-map");


          vue項目刷新當前頁面的幾種方式

          seo達人

          在vue項目中,經常會遇到需要刷新當前頁面的需求。

          因為vue-router判斷如果路由沒有變化,是不會刷新頁面獲取數據的。



          方式1:go(0)和reload()

          通過location.reload()或是this.$router.go(0)兩種強制刷新方式,相當于按F5,會出現瞬間白屏,體驗差,不推薦。



          方式2:定義一個空白路由頁面,路由跳轉到該空白頁后立馬跳回當前頁,實現路由刷新。

          在router路由表中定義一個空白路由,



           // 強制刷新當前頁所用的中間跳轉頁

             {

                  path: '/redirect/:path*',

                  component: () => import('@/views/redirect/index')

            }



          寫一個空白路由組件



          //redirect/index

          <script>

          export default {

            created() {

              const { params, query } = this.$route

              const { path } = params

              this.$router.replace({ path: '/' + path, query })

            },

            render: function(h) {

              return h() // avoid warning message

            }

          }

          </script>





          在需要刷新的頁面使用



          refresh() {

                // 刷新當前路由

                const { fullPath } = this.$route

                this.$router.replace({

                  path: '/redirect' + fullPath

                })

              }



          這種方式,基本上能夠應付絕大多數情況,推薦使用。

          但是,有時候,有一些極端情況下,這種刷新不起作用,而又不想用第一種那種毛子般的簡單粗暴的方式的話,下面的方式可以選擇使用。



          方式3:provede/inject 方式

          vue官方文檔說了,這個依賴注入方式是給插件開發使用的,普通應用中不推薦使用。

          但是,效果卻很好。

          app.vue修改



          <template>

            <div id="app">

              <router-view v-if="isRouterAlive" />

            </div>

          </template>

          <script>

          export default {

            name: 'App',

            provide() {

              return {

                reload: this.reload

              }

            },

            data() {

              return {

                isRouterAlive: true

              }

            },

            methods: {

              reload() {

                this.isRouterAlive = false

                this.$nextTick(function(){

                  this.isRouterAlive = true

                })

              }

            }

          }

          </script>





          使用的時候:

          demo.vue



          <template>

            <div class="container">

            xxx

            </div>

          </template>



          <script>

          export default {

            inject: ['reload], // 依賴注入

            name: 'Demo',

            computed: {

              message() {

                return '抱歉,您訪問的頁面地址有誤或者該頁面不存在...'

              }

            },

            methods: {

            handleReload() {

            this.reload() // 直接在需要刷新的方法中調用這個reload()

          }

            }

          }

          </script>



          <style lang="scss" scoped>

          </style>



          原理就是通過依賴注入的方式,在頂部app通過v-if的顯示隱藏來強制切換顯示,以此來讓vue重新渲染整個頁面,app中通過provide方式定義的reload方法,在它的后代組件中,無論嵌套多深,都能夠觸發調用這個方法。具體說明查看官方文檔。


          用three.js構建自己的后處理渲染器第一篇---抗鋸齒的選擇

          seo達人

          說到渲染引擎就不得不提到延遲渲染,基本上一個引擎如果沒有實現延遲渲染就不能說是一個好的渲染引擎,不過可惜的是three.js并沒有實現延遲渲染(ps:呼吁作者趕緊實現mrt吧)。由于沒有mrt和延遲渲染,本來不打算寫后處理的,但是即使沒有,我們也希望能實現一些炫酷的效果,那就在現在的基礎上對three.js進行簡單的改造來實現一套高性能的后處理渲染器吧。

          要實現后處理我們首先要考慮需求,是否要兼顧移動端,是否要兼顧大屏(4k),是否要支持webgl1,是否要在各種顯卡中都有一個還算不錯的性能。目前我主要考慮的是:性能要好,可以兼顧大屏,不打算完美支持webgl1,盡量多使用webgl2的特性。后面所有的性能測試為都以N卡作為性能測試指標,先不管AMD卡(AMD抗鋸齒的處理性能會高些的,但是動態處理性能會偏低,這里有很多細節問題)

          好了,我們關心的是好的性能,盡量多使用webgl2的特性,盡量能兼顧大屏(這里主要是要注意顯存問題),現在開始準備我們的渲染器吧

          要完成一個后處理渲染器,我們首先要考慮抗鋸齒,常用的有超采樣技術和多重采樣技術,具體可以看這個介紹 添加鏈接描述

          three.js已經實現了SSAA,SMAA,TAA這三種超采樣技術,效果都還不錯,具體實現three.js都有例子,就不詳細說明了。SSAA抗鋸齒效果是最好的,但是性能最差,現實情況下根本無法使用。SMAA性能會好一些,2000個物體差不多掉15幀吧(SMAA比FXAA計算稍微復雜一些,SMAA研究的少,不知道能不能解決line的鋸齒問題,如果知道的歡迎留言)。SMAA效果基本可以接受,但是2000個物體掉的幀率還是有點多,這個也不是我們首選的。TAA效果很好,如果場景里面很少動的東西,它是個不錯的選擇,如果有運動的物體或者動畫等等,基本上抗鋸齒就沒效果了,理論上應該可以實現動態的TAA,但是用目前的技術很難實現。所以TAA先不考慮加入我們的后處理渲染器(真實使用場景下一般都有動畫或者貼圖流動效果,所以TAA無法使用)。

          SMAA:效果不錯,開銷15幀左右(2000物體)

          SSAA:效果最好,開銷太大 (2000物體基本已經沒有了幀率)





          TAA:效果基本和SSAA差不多,但目前只有靜止的時候才有效果



          再來看看多重采樣MSAA,這個特性必須使用webgl2,是webgl提供的方式,和瀏覽器自身的抗鋸齒原理一樣,效果不錯,和正常渲染的結果沒有區別,性能開銷也不是太大,前提是我們不要使用stencilbuffer。而且three.js MSAA這塊的釋放有些小問題,詳細可以在deallocateRenderTarget這個接口中進行修改?,F在我們可以把MSAA作為主要的抗鋸齒技術。MSAA雖然性能開銷不大,但是唯一的不足是比較吃顯存,如果是大屏,而且顯卡不好的話還是容易崩,無法開啟。因此我們還要繼續選擇一個開銷小不吃顯存的抗鋸齒(當然也可以考慮SMAA,目前由于幀率開銷較大(2000物體掉了15幀左右),我們不考慮加入SMAA)

          MSAA:基本沒有幀率開銷,效果不錯,但是耗費顯存(2000物體)



          最后的備選方案就是FXAA了,FXAA可以參考這個文章:添加鏈接描述講的很詳細,FXAA性能開銷很小,但是效果很一般,特別是細線的鋸齒沒法解決,轉動攝影機邊緣的閃動效果也無法解決,而且還有一個問題是由于FXAA就是靠邊緣模糊抗鋸齒,所以必然導致畫面會略有模糊。但是它最大的好處是開銷很小而且不耗費顯存,并且集成到后處理渲染器中最簡單。但是當顯存不足顯卡太差的時候它還是個不錯的選擇。因此需要加入FXAA。

          FXAA:效果一般,開銷很小,無法解決線的鋸齒問題,帶來模糊(2000物體)

          我們看了下各大引擎,基本每個引擎都實現了FXAA,還有很多引擎實現了FXAA3,FXAA3效果會好一些,但是依然無法解決線的問題。cesium的抗鋸齒就是完全采用FXAA3,效果還可以接受,所以目前我們把cesium的fxaa3_11拿過來用,最終引擎選擇使用MSAA加FXAA3_11的抗鋸齒策略(當然SMAA和TAA也可以選擇)。


          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合