如何在 FineUIMvc 中引用第三方 JavaScript 庫

聲明:FineUIMvc(基礎版)是免費軟件,本系列文章適用於基礎版。javascript

引入第三方顏色選擇器

在 FineUIMvc 中使用第三方 JavaScript 遵循必定的約定,也很是簡單。css

下面以官網示例爲例:http://fineui.com/demo_mvc/#/demo_mvc/ThirdParty/ColorPickerhtml

這個例子引入了第三方的顏色選擇器,配合 FineUIMvc 的 TextBox 控件一塊兒使用。java

咱們來看下本頁面的視圖定義:jquery

@{
    ViewBag.Title = "ThirdParty/ColorPicker";
    var F = @Html.F();
}
@section head {
    <link rel="stylesheet" href="~/third-party/res/spectrum/spectrum.css" />
    <style>
        .mycolor .f-field-body {
            display: inline-block !important;
            width: 150px;
            margin-right: 5px;
        }

        .mycolor .sp-replacer {
            border-width: 0;
            padding: 0;
            position: absolute;
            top: 50%;
            margin-top: -10px;
        }

        .mycolor .sp-dd {
            display: none;
        }

        .mycolor .sp-preview {
            margin-right: 0;
        }
    </style>
}

@section body {

    @(F.SimpleForm()
        .ID("SimpleForm1")
        .BodyPadding(5)
        .Width(450)
        .EnableCollapse(true)
        .ShowBorder(true)
        .Title("表單")
        .ShowHeader(true)
        .Items(
            F.DatePicker()
                .Required(true)
                .Label("日期一")
                .EmptyText("請選擇日期一")
                .ID("DatePicker1")
                .ShowRedStar(true),
            F.TextBox()
                .ID("tbxMyBox")
                .CssClass("mycolor")
                .Text("#f90")
                .Required(true)
                .ShowRedStar(true)
                .Label("選擇顏色"),
            F.Button()
                .ID("btnSubmit")
                .ValidateForms("SimpleForm1")
                .Text("提交表單")
                .OnClick(Url.Action("btnSubmit_Click"),
                    new Parameter("dateValue", "F.ui.DatePicker1.getText()"),
                    new Parameter("textValue", "F.ui.tbxMyBox.getValue()"))
        )
    )

}

@section script {
    <script src="~/third-party/res/spectrum/spectrum.js" type="text/javascript"></script>
    <script src="~/third-party/res/spectrum/i18n/jquery.spectrum-zh-cn.js" type="text/javascript"></script>
    <script>
        F.ready(function () {
            var tbxMyBox = F.ui.tbxMyBox;

            tbxMyBox.bodyEl.spectrum({
                preferredFormat: "hex3",
                showInput: true,
                showPalette: true,
                palette: [
                    ["#000", "#444", "#666", "#999", "#ccc", "#eee", "#f3f3f3", "#fff"],
                    ["#f00", "#f90", "#ff0", "#0f0", "#0ff", "#00f", "#90f", "#f0f"],
                    ["#f4cccc", "#fce5cd", "#fff2cc", "#d9ead3", "#d0e0e3", "#cfe2f3", "#d9d2e9", "#ead1dc"],
                    ["#ea9999", "#f9cb9c", "#ffe599", "#b6d7a8", "#a2c4c9", "#9fc5e8", "#b4a7d6", "#d5a6bd"],
                    ["#e06666", "#f6b26b", "#ffd966", "#93c47d", "#76a5af", "#6fa8dc", "#8e7cc3", "#c27ba0"],
                    ["#c00", "#e69138", "#f1c232", "#6aa84f", "#45818e", "#3d85c6", "#674ea7", "#a64d79"],
                    ["#900", "#b45f06", "#bf9000", "#38761d", "#134f5c", "#0b5394", "#351c75", "#741b47"],
                    ["#600", "#783f04", "#7f6000", "#274e13", "#0c343d", "#073763", "#20124d", "#4c1130"]
                ]
            });
        });
    </script>
}

總體上講分爲三大部分:瀏覽器

1. @section head:全部的 CSS 定義都放在這裏面,包含第三方的 CSS 文件引用。mvc

2. @section body:正文部分函數

3. @section script:腳本區域,放置第三方腳本引用和初始化腳本。工具

 

下面看下頁面的初始化腳本:佈局

F.ready(function () {
    var tbxMyBox = F.ui.tbxMyBox;

    tbxMyBox.bodyEl.spectrum({
        ......
    });
});

1. F.ready 相似於 jQuery 的 $.ready 函數,在頁面上全部的控件初始化完畢以後觸發。

2. F.ui.tbxMyBox 用來獲取頁面上 id=tbxMyBox 的控件實例,在 FineUIMvc 的客戶端腳本中,你能夠經過這種方式獲取全部的控件實例。若是你以前用過FineUI(開源版),知道還有另外一種獲取控件實例的方式:F('tbxMyBox'),爲了兼容以前的代碼,這種方式依然支持。

3. tbxMyBox.bodyEl 表示的是文本輸入框的 input 標籤,是一個 jQuery 對象。經過瀏覽器的調試工具,咱們很容易的觀察 bodyEl 所指向的元素:

 

常見錯誤

 一個看似簡單的任務,可是若是不瞭解其中的原理,也會常常出錯,下面就列出網友常常犯錯的地方。

重複引入jQuery庫

錯誤代碼:

@section script {
    <script src="~/res/jquery.js" type="text/javascript"></script>
    <script src="~/third-party/res/spectrum/spectrum.js" type="text/javascript"></script>
    <script src="~/third-party/res/spectrum/i18n/jquery.spectrum-zh-cn.js" type="text/javascript"></script>
    <script>
    
    ...
    </script>
}

由於 FineUIMvc 的客戶端庫裏已經引入了 jQuery,所以無需再引入 jQuery 庫,重複引入 jQuery 會出現各類問題。

所以上面的代碼要把  <script src="~/res/jquery.js" type="text/javascript"></script> 這一行刪掉。

 

JavaScript引用位置錯誤

錯誤代碼:

@section head {
    <link rel="stylesheet" href="~/third-party/res/spectrum/spectrum.css" />
    
    <script src="~/third-party/res/spectrum/spectrum.js" type="text/javascript"></script>
    <script src="~/third-party/res/spectrum/i18n/jquery.spectrum-zh-cn.js" type="text/javascript"></script>
    <script>
    ...
    </script>
}

這是另一個常見的錯誤,將 JavaScript 代碼放入 head 節中。之因此這樣作是錯誤的,還要看佈局視圖的定義(_Layout.cshtml): 

<!DOCTYPE html>
<html>
<head>
    @F.RenderCss()
    
    @RenderSection("head", false)
</head>
<body>
    @Html.AntiForgeryToken()

    @F.PageManager

    @RenderSection("body", true)

    @F.RenderScript()
    @RenderSection("script", false)
</body>
</html>

這是一個簡化的佈局視圖,注意其中咱們放置的順序,@F.RenderScript() 用來渲染 FineUIMvc 所須要的 JavaScript 引用,因此第三方和自定義 JavaScript 引用都要放到這個的後面,也就是 script 節中(固然,若是你調整了佈局視圖的定義,就另當別論了)。

 

$.ready 仍是 F.ready

錯誤代碼:

@section script {
    <script src="~/third-party/res/spectrum/spectrum.js" type="text/javascript"></script>
    <script src="~/third-party/res/spectrum/i18n/jquery.spectrum-zh-cn.js" type="text/javascript"></script>
    <script>
        $.ready(function () {
            var tbxMyBox = F.ui.tbxMyBox;

            tbxMyBox.bodyEl.spectrum({
                ...
            });
        });
    </script>
}

這個錯誤也會常常出現,不少網友認爲 DOMReady 時($.ready)應該就能夠寫初始化代碼了。其實否則,由於你的初始化代碼中包含對 FineUIMvc 控件的引用(F.ui.tbxMyBox),而在 DOMReady 時這些控件尚未初始化。

記着一點:自定義初始化腳本放到 F.ready() 裏面。

 

小結

本篇文章講解了如何引入第三方 JavaScript 庫到 FineUIMvc 主導的頁面中,這個過程遵循必定的規則,簡單明瞭。同時也分析了網友常見的錯誤,它們分別是重複引入 jQuery 庫,JavaScript 放置的位置不對,以及自定義腳本放到了 DOMReady 裏面。 

 

 

《FineUIMvc隨筆》目錄:http://www.cnblogs.com/sanshi/p/6473592.html 

相關文章
相關標籤/搜索