如何在 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