首頁 web前端 html教學 動態綁定HTML的方法

動態綁定HTML的方法

Mar 08, 2017 pm 03:49 PM
html

在Web前端開發中,我們經常會遇見需要動態的將一些來自後端或是動態拼接的HTML字串綁定到頁面DOM顯示,特別是在內容管理系統(CMS:是Content Management System的縮寫),這樣的需求,更是遍地皆是。

對於對angular的讀者肯定首先會想到ngBindHtml,對,angular為我們提供了這個指令來動態綁定HTML,它會將計算出來的表達式結果用innerHTML綁定到DOM。但是,問題並不是這麼簡單。在網路安全性中XSS(Cross-site scripting,腳本注入攻擊),它是在網路應用程式中很典型的電腦安全漏洞。 XSS攻擊指的是透過對網頁注入可執行客戶端程式碼且成功地被瀏覽器執行,來達到攻擊的目的,形成了一次有效XSS攻擊,一旦攻擊成功,它可能會獲取到用戶的一些敏感資訊、改變使用者的體驗、誘導使用者等非法行為,有時XSS攻擊還會合其他攻擊方式同時實施例如SQL注入攻擊伺服器和資料庫、Click劫持、相對連結劫持等實施釣魚,它帶來的危害是巨大的,也是web安全的頭號大敵。更多的Web安全問題,請參考wiki https://en.wikipedia.org/wiki/Cross-site_scripting%E3%80%82

在angular中默認是不相信添加的HTML內容,對於新增的HTML內容,首先必須利用$sce.trustAsHtml,告訴angular這是可信的HTML內容。否則你將會得到$sce:unsafe的異常錯誤。

Error: [$sce:unsafe] Attempting to use an unsafe value in a safe context.
登入後複製

下面是一個綁定簡單的angular連結的demo:

HTML:

<div ng-controller="DemoCtrl as demo">
    <div ng-bind-html="demo.html"></div>
</div>
登入後複製

JavaScript:

angular.module("com.ngbook.demo", [])
    .controller("DemoCtrl", ["$sce", function($sce) {
        var vm = this;

        var html = &#39;<p>hello <a href="https://angular.io/">angular</a></p>&#39;;
        vm.html = $sce.trustAsHtml(html);

        return vm;
    }]);
登入後複製

對於簡單的靜態HTML,這個問題就解決了。但對於複雜的HTML,這裡的複雜是指帶有angular表達式、指令的HTML模板,對於它們來說,我們不僅希望綁定大DOM顯示,同時還希望得到angular強大的雙向綁定機制。 ngBindHhtml並不會和$scope關聯雙向綁定,如果在HTML中存在ngClick、ngHref、ngSHow、ngHide等angular指令,它們並不會被compile,點擊這些按鈕,也不會發生任何反應,綁定的表達式也不會在更新。例如嘗試將上次的連結變成:ng-href=“demo.link”,連結並不會被解析,在DOM看見的仍會是原樣的HTML字串。

在angular中的所有指令要生效,都需要經過compile,在compile中包含了pre-link和post-link,連接上特定行為,才能工作。大部分情況下compile,是會在angular啟動時,自動compile的。但如果是對於動態新增的模板,則需要手動的compile。 angular中為我們提供了$compile服務來實現這項功能。下面是一個比較通用的compile範例:

HTML:

<body ng-controller="DemoCtrl as demo">
    <dy-compile html="{{demo.html}}">
    </dy-compile>
    <button ng-click="demo.change();">change</button>
</body>
登入後複製

JavaScript:

angular.module("com.ngbook.demo", [])
    .directive("dyCompile", ["$compile", function($compile) {
        return {
            replace: true,
            restrict: &#39;EA&#39;,
            link: function(scope, elm, iAttrs) {
                var DUMMY_SCOPE = {
                        $destroy: angular.noop
                    },
                    root = elm,
                    childScope,
                    destroyChildScope = function() {
                        (childScope || DUMMY_SCOPE).$destroy();
                    };

                iAttrs.$observe("html", function(html) {
                    if (html) {
                        destroyChildScope();
                        childScope = scope.$new(false);
                        var content = $compile(html)(childScope);
                        root.replaceWith(content);
                        root = content;
                    }

                    scope.$on("$destroy", destroyChildScope);
                });
            }
        };
    }])
    .controller("DemoCtrl", [function() {
        var vm = this;

        vm.html = &#39;<h2>hello : <a ng-href="{{demo.link}}">angular</a></h2>&#39;;

        vm.link = &#39;https://angular.io/&#39;;
        var i = 0;
        vm.change = function() {
            vm.html = &#39;<h3>change after : <a ng-href="{{demo.link}}">&#39; + (++i) + &#39;</a></h3>&#39;;
        };
    }]);
登入後複製

這裡建立了一個叫dy-compile的指令,它首先會監聽綁定屬性html值的變化,當html內容存在的時候,它會嘗試先創個子scope,然後利用$compile服務來動態連接傳入的html,並替換掉當前DOM節點;這裡創建子scope的原因,是方便在每次銷毀DOM的時,也能容易的銷毀掉scope,去掉HTML compile帶來的watchers函數,並在最後的父scope銷毀的時候,也會嘗試銷毀該scope。

因為有了上邊的compile的編譯和連接,則ngHref指令就可以生效了。這裡只是試著給出動態compile angular模組的例子,具體的實作方式,請參考你的業務來聲明特定的directive。


以上是動態綁定HTML的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1327
25
PHP教程
1273
29
C# 教程
1252
24
HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

HTML 表格佈局 HTML 表格佈局 Sep 04, 2024 pm 04:54 PM

HTML 表格佈局指南。在這裡,我們詳細討論 HTML 表格佈局的值以及範例和輸出。

HTML 輸入佔位符 HTML 輸入佔位符 Sep 04, 2024 pm 04:54 PM

HTML 輸入佔位符指南。在這裡,我們討論 HTML 輸入佔位符的範例以及程式碼和輸出。

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在這裡我們也分別討論了 HTML 有序列表和類型的介紹以及它們的範例

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

See all articles