Knockout: 使用CSS绑定和event的blur失去焦点事件, 给未通过校验的输入框添加红色边框突出显示.

目的:使用knockout提供的机制实现输入框失去焦点后的校验工作,并使用CSS绑定给未通过校验的输入框添加红色边框突出显示.

步骤: 先在htm中添加.error的css样式, 并在输入框中的data-bind属性中添加 event: {blur: ChecktFirstNameIsValid},和css: { error: !firstNameIsValid()}, 然后再在ViewModel中在firstName监控属性后面再添加一个firstNameIsValid布尔型监控属性, 并给ViewModel添加一个ChecktFirstNameIsValid函数, 在这里检查输入框中的值是否符合校验规则, 如果不通过, 就把firstNameIsValid设置为false, 这样, 输入框就有了红色边框, 如果输入正确, 则把firstNameIsValid设置为true, 这样, 输入框的红色边框就消失了.


1.htm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<head>
    <title></title>
     <script src="Lib/require/require.js" data-main="JsDemo2_Main"></script>
       <style type="text/css">
        .error {
            border: 2px solid red;
        }
 
        input {
            border: 1px solid #AAA;
            padding: 4px;
        }
    </style>
</head>
<body>
    <input id="txtFirstName" type="text" data-bind="value:firstName, css: { error: !firstNameIsValid()}, event: {blur: ChecktFirstNameIsValid}" />
    <input id="txtLastName" type="text" data-bind="value:lastName, css: { error: !lastNameIsValid()}, event: {blur: ChecktLastNameIsValid}" />
    <button id="btn" data-bind="click:SubmitClick" >btn</button>
    <br /><br />
    <!--显示错误提示信息 start-->
    <font color="red">
    <b>
        <div id="ErrorMessage"></div>
    </b>
    </font>              
    <!--显示错误提示信息 end-->
</body>
</html>

  

2.JsDemo2_Main.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
require.config({
    paths: {
        "knockout": "Lib/knockout/knockout-2.3.0",
        "jquery": "Lib/jquery/jquery-1.9.1.min"
    }
});
 
require([‘knockout‘, ‘jquery‘], function ( ko, $) {
    //数据绑定
    var viewModel = {
        firstName: ko.observable(""),
        firstNameIsValid: ko.observable(true),
        firstNameInValidMessage: ko.observable(),
        lastName: ko.observable(""),
        lastNameIsValid: ko.observable(true),
        lastNameInValidMessage: ko.observable(),
        AllErrorMessage: ko.observable(),
        SubmitClick: function () {
            viewModel.ChecktFirstNameIsValid();
            viewModel.ChecktLastNameIsValid();
            if (viewModel.AllErrorMessage().length > 0) {              
                alert("fail");
                return false;
            }
            else {
                alert("ok");
                return true;
                //可以提交数据了.
            }
        },
        ChecktFirstNameIsValid: function () {
            if (viewModel.firstName().length <= 10) {
                viewModel.firstNameIsValid(false);
                viewModel.firstNameInValidMessage("firstName请输入至少10位字符")
            }
            else {
                viewModel.firstNameIsValid(true);
                viewModel.firstNameInValidMessage("")
            }
            viewModel.ShowAllErrorMessage();
        },
        ChecktLastNameIsValid: function () {
            if (viewModel.lastName().length <= 10) {
                viewModel.lastNameIsValid(false);
                viewModel.lastNameInValidMessage("lastName请输入至少10位字符")
            }
            else {
                viewModel.lastNameIsValid(true);
                viewModel.lastNameInValidMessage("")
            }
            viewModel.ShowAllErrorMessage();
        },      
        ShowAllErrorMessage: function () {
            var message = "";
 
            if (!viewModel.firstNameIsValid()) {
                message += "\n" + viewModel.firstNameInValidMessage();
            }
 
            if (!viewModel.lastNameIsValid()) {
                message += "\n" + viewModel.lastNameInValidMessage();
            }
 
            viewModel.AllErrorMessage(message);
 
            if (viewModel.AllErrorMessage().length > 0) {
                $("#ErrorMessage").html(message);
            }
            else {
                $("#ErrorMessage").html("");
            }
        }
    };
 
 
    /*document.getElementById("txtFirstName").onblur = function () {
        viewModel.ChecktFirstNameIsValid();
        viewModel.ShowAllErrorMessage();
    }*/
 
    /*$(‘#txtFirstName‘).on(‘blur‘, function () {
        viewModel.ChecktFirstNameIsValid();
        viewModel.ShowAllErrorMessage();      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    });*/
 
    /*$(‘#txtLastName‘).on(‘blur‘, function () {
        viewModel.ChecktLastNameIsValid();
        viewModel.ShowAllErrorMessage();      
    });*/
 
    viewModel.afterkeydown = ko.dependentObservable(function () {
        viewModel.firstName(viewModel.firstName().toUpperCase());
        viewModel.lastName(viewModel.lastName().toUpperCase());
    }, viewModel);
 
    $(document).ready(function () {
        ko.applyBindings(viewModel);
    });
 
    
});

3.截图

Knockout: 使用CSS绑定和event的blur失去焦点事件, 
给未通过校验的输入框添加红色边框突出显示.

4.总结

综合前两文:

Knockout: 实践CSS绑定和jQuery的blur失去焦点事件, 给未通过校验的输入框添加红色边框突出显示. http://www.cnblogs.com/liuzhendong/p/3595949.html

Knockout: 实践CSS绑定和afterkeydown事件, 给未通过校验的输入框添加红色边框突出显示; 使用afterkeydown事件自动将输入转大写字母. http://www.cnblogs.com/liuzhendong/p/3595845.html

可以看到,使用Jquery的blur事件,使用原生Javascript中的onblur事件,以及使用ko中的event: {blur: ChecktFirstNameIsValid},都可以完成这个工作.

不过如果使用knockout,还是使用本身的event方案从代码风格上更统一一些.

 

5.注释

LostFocus是WinForm控件的失去焦点事件, 例子如下, 它不能用在htm页面控件失去焦点时,  在htm中要用onblur或blur才对.

1
2
3
4
5
6
7
8
9
10
public Form2()
{
    InitializeComponent();
    this.textBox3.LostFocus += textBox3_LostFocus;
}
 
void textBox3_LostFocus(object sender, EventArgs e)
{
    MessageBox.Show("a");
}

  

Knockout: 使用CSS绑定和event的blur失去焦点事件, 给未通过校验的输入框添加红色边框突出显示.,布布扣,bubuko.com

Knockout: 使用CSS绑定和event的blur失去焦点事件, 给未通过校验的输入框添加红色边框突出显示.

上一篇:Struts 2实现类似ThinkPHP的MVC开发方式


下一篇:DIV+CSS制作带箭头提示框