HTML表格-Javascript选择和取消选择元素(单元格)

时间:2018-11-13 12:25:39

标签: javascript jquery html angularjs

我已创建此HTML + JavaScript表用于计划目的。 它使我可以选择表中的多个单元格,并以很少的其他功能将其输出到JSON文件中。

此刻,当我尝试选择多个单元格时,它会正确创建“虚拟”矩形并选择所有必需的单元格。

我想要取消选择相同的东西,但是由于某种原因,我看不出问题出在哪里。

有人有什么主意吗?

这是代码段。

<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<script>

    var app = angular.module('plunker', []);

    app.controller('MainCtrl', function ($scope) {
        $scope.ids = [];
    });

    app.directive('dragSelect', function ($window, $document) {
        return {
            scope: {
                dragSelectIds: '='
            },
            controller: function ($scope, $element) {
                var cls = 'eng-selected-item';
                var startCell = null;
                var dragging = false;
                var weekdays = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"];

                function mouseUp(el) {
                    dragging = false;
                    // Select or deselect the all class switchers

                    // Make sure that headers are not selected for weekdays
                    for (var k = 0; k < weekdays.length; k++) {
                        var count_selected = 0;
                        for (i = 0; i < 11; i++) {
                            var id = weekdays[k] + "-" + i;
                            if (document.getElementById(id).classList.contains(cls)) {
                                count_selected = count_selected + 1
                            };

                        }
                        if (count_selected === 11) {
                            var id = weekdays[k] + "-all";

                            document.getElementById(id).classList.add(cls);
                        } else {
                            var id = weekdays[k] + "-all";
                            document.getElementById(id).classList.remove(cls);
                        };
                    }

                    // Make sure that headers are not selected for hours
                    for (i = 0; i < 11; i++) {
                        var count_selected = 0;
                        for (var k = 0; k < weekdays.length; k++) {
                            var id = weekdays[k] + "-" + i;
                            if (document.getElementById(id).classList.contains(cls)) {
                                count_selected = count_selected + 1
                            };

                        }
                        if (count_selected === 7) {
                            var id = "hour-" + i;
                            document.getElementById(id).classList.add(cls);
                        } else {
                            var id = "hour-" + i;
                            document.getElementById(id).classList.remove(cls);
                        }


                    }


                }

                function mouseDown(el) {
                    dragging = true;
                    setStartCell(el);
                    setEndCell(el);
                }



                function setStartCell(el) {
                    startCell = el;
                }

                function mouseEnter(el) { if (!dragging) return; setEndCell(el); }


                function setEndCell(el) {

                    // Code for Monday
                    var day_of_week = "mon";
                    if (el.attr('id') === day_of_week + "-all") {
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < 24; i++) {
                                var id = day_of_week + "-" + i
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };
                        }

                    };

                    var day_of_week = "tue";
                    if (el.attr('id') === day_of_week + "-all") {
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };
                        }

                    };

                    var day_of_week = "wed";
                    if (el.attr('id') === day_of_week + "-all") {
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };
                        }

                    };

                    var day_of_week = "thu";
                    if (el.attr('id') === day_of_week + "-all") {
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };
                        }

                    };

                    var day_of_week = "fri";
                    if (el.attr('id') === day_of_week + "-all") {
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < 24; i++) {
                                var id = day_of_week + "-" + i
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };
                        }

                    };

                    var day_of_week = "sat";
                    if (el.attr('id') === day_of_week + "-all") {
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };
                        }

                    };

                    var day_of_week = "sun";
                    if (el.attr('id') === day_of_week + "-all") {
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };
                        }

                    };

                    // Code for hours

                    if (el.attr('id').startsWith("hour")) {
                        var hour = el.attr('id').split("-")[1];
                        console.log(hour);
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < weekdays.length; i++) {
                                var id = weekdays[i] + "-" + hour;
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < weekdays.length; i++) {
                                var id = weekdays[i] + "-" + hour;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };

                        }

                    }


                    if (el.hasClass(cls)) { // if added then remove on click
                        el.removeClass(cls);
                        var elIndex = $scope.dragSelectIds.indexOf(el[0].id);
                        elIndex !== -1 && $scope.dragSelectIds.splice(elIndex, 1)
                        return false;
                    }
                    if (!$scope.dragSelectIds) {
                        $scope.dragSelectIds = [];
                    }
                    //$element.find('td').removeClass(cls);
                    $(cellsBetween(startCell, el)).each(function () {
                        var el = angular.element(this);
                        el.addClass(cls);
                        // change if added, then not to add twice.
                        var elIndex = $scope.dragSelectIds.indexOf(el[0].id);
                        elIndex === -1 && $scope.dragSelectIds.push(el.attr('id'));
                    });


                }



                function rectangleSelect(selector, x1, x2, y1, y2) {
                    var elements = [];
                    jQuery(selector).each(function () {
                        var $this = jQuery(this);
                        var offset = $this.offset();
                        var x = offset.left;
                        var y = offset.top;
                        var w = $this.width();
                        var h = $this.height();

                        if (x >= x1 && x <= x2 && y >= y1 && y <= y2) {
                            // this element fits inside the selection rectangle
                            elements.push($this.get(0));
                        }
                    });
                    return elements;
                }

                function cellsBetween(start, end) {

                    var bounds = { minX: 0, minY: 0, maxX: 0, maxY: 0 };
                    bounds.minX = $window.Math.min($(start).offset().left, $(end).offset().left);
                    bounds.minY = $window.Math.min($(start).offset().top, $(end).offset().top);
                    bounds.maxX = $window.Math.max($(end).offset().left + $(end).width(), $(start).offset().left + $(start).width());
                    bounds.maxY = $window.Math.max($(end).offset().top + $(end).height(), $(start).offset().top + $(start).height());

                    var initiallySelectedTds = rectangleSelect("td", bounds.minX, bounds.maxX, bounds.minY, bounds.maxY);

                    for (var i = 0; i < initiallySelectedTds.length; i++) {
                        if ($(initiallySelectedTds[i]).offset().left < bounds.minX)
                            bounds.minX = $(initiallySelectedTds[i]).offset().left;
                        if ($(initiallySelectedTds[i]).offset().left + $(initiallySelectedTds[i]).width() > bounds.maxX)
                            bounds.maxX = $(initiallySelectedTds[i]).offset().left + $(initiallySelectedTds[i]).width();
                        if ($(initiallySelectedTds[i]).offset().top < bounds.minY)
                            bounds.minY = $(initiallySelectedTds[i]).offset().top;
                        if ($(initiallySelectedTds[i]).offset().top + $(initiallySelectedTds[i]).height() > bounds.maxY)
                            bounds.maxY = $(initiallySelectedTds[i]).offset().top + $(initiallySelectedTds[i]).height();
                    }
                    return rectangleSelect("td", bounds.minX, bounds.maxX, bounds.minY, bounds.maxY);

                }


                function wrap(fn) {
                    return function () {
                        var el = angular.element(this);
                        $scope.$apply(function () {
                            fn(el);
                        });
                    }
                }

                $element.delegate('td', 'mousedown', wrap(mouseDown));
                $element.delegate('td', 'mouseenter', wrap(mouseEnter));
                $document.delegate('body', 'mouseup', wrap(mouseUp));
            }
        }
    });
</script>
[drag-select] {
    cursor: pointer;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
   -khtml-user-select: none;
   -moz-user-select: none;
   -ms-user-select: none;
   user-select: none;
  }
  
  [drag-select] .eng-selected-item {
    background: green;
    color: white;
  }
<!DOCTYPE html>
<html ng-app="plunker">
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
    crossorigin="anonymous">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp"
    crossorigin="anonymous">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
    crossorigin="anonymous"></script>

<head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="jquery" data-semver="2.0.3" src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
    <script data-require="angular.js@1.2.x" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js"
        data-semver="1.2.16"></script>
    <script src="app.js"></script>
</head>


<body ng-controller="MainCtrl">

    <div class="container">
        <div class="col-lg-6">
            <table drag-select drag-select-ids="ids" class="table table-responsive table-bordered">
                <tr>
                    <td id="hour">Hours ></td>
                    <td id="hour-0">00</td>
                    <td id="hour-1">01</td>
                    <td id="hour-2">02</td>
                    <td id="hour-3">03</td>
                    <td id="hour-4">04</td>
                    <td id="hour-5">05</td>
                    <td id="hour-6">06</td>
                    <td id="hour-7">07</td>
                    <td id="hour-8">08</td>
                    <td id="hour-9">09</td>
                    <td id="hour-10">10</td>
                    
                </tr>
                <tr>
                    <td id="mon-all">MON</td>
                    <td id="mon-0"></td>
                    <td id="mon-1"></td>
                    <td id="mon-2"></td>
                    <td id="mon-3"></td>
                    <td id="mon-4"></td>
                    <td id="mon-5"></td>
                    <td id="mon-6"></td>
                    <td id="mon-7"></td>
                    <td id="mon-8"></td>
                    <td id="mon-9"></td>
                    <td id="mon-10"></td>
                    
                </tr>
                <tr>
                    <td id="tue-all">TUE</td>
                    <td id="tue-0"></td>
                    <td id="tue-1"></td>
                    <td id="tue-2"></td>
                    <td id="tue-3"></td>
                    <td id="tue-4"></td>
                    <td id="tue-5"></td>
                    <td id="tue-6"></td>
                    <td id="tue-7"></td>
                    <td id="tue-8"></td>
                    <td id="tue-9"></td>
                    <td id="tue-10"></td>
                    
                </tr>
                <tr>
                    <td id="wed-all">WED</td>
                    <td id="wed-0"></td>
                    <td id="wed-1"></td>
                    <td id="wed-2"></td>
                    <td id="wed-3"></td>
                    <td id="wed-4"></td>
                    <td id="wed-5"></td>
                    <td id="wed-6"></td>
                    <td id="wed-7"></td>
                    <td id="wed-8"></td>
                    <td id="wed-9"></td>
                    <td id="wed-10"></td>
                    
                </tr>
                <tr>
                    <td id="thu-all">THU</td>
                    <td id="thu-0"></td>
                    <td id="thu-1"></td>
                    <td id="thu-2"></td>
                    <td id="thu-3"></td>
                    <td id="thu-4"></td>
                    <td id="thu-5"></td>
                    <td id="thu-6"></td>
                    <td id="thu-7"></td>
                    <td id="thu-8"></td>
                    <td id="thu-9"></td>
                    <td id="thu-10"></td>
                    
                </tr>
                <tr>
                    <td id="fri-all">FRI</td>
                    <td id="fri-0"></td>
                    <td id="fri-1"></td>
                    <td id="fri-2"></td>
                    <td id="fri-3"></td>
                    <td id="fri-4"></td>
                    <td id="fri-5"></td>
                    <td id="fri-6"></td>
                    <td id="fri-7"></td>
                    <td id="fri-8"></td>
                    <td id="fri-9"></td>
                    <td id="fri-10"></td>
                    
                </tr>
                <tr>
                    <td id="sat-all">SAT</td>
                    <td id="sat-0"></td>
                    <td id="sat-1"></td>
                    <td id="sat-2"></td>
                    <td id="sat-3"></td>
                    <td id="sat-4"></td>
                    <td id="sat-5"></td>
                    <td id="sat-6"></td>
                    <td id="sat-7"></td>
                    <td id="sat-8"></td>
                    <td id="sat-9"></td>
                    <td id="sat-10"></td>
                    
                </tr>
                <tr>
                    <td id="sun-all">SUN</td>
                    <td id="sun-0"></td>
                    <td id="sun-1"></td>
                    <td id="sun-2"></td>
                    <td id="sun-3"></td>
                    <td id="sun-4"></td>
                    <td id="sun-5"></td>
                    <td id="sun-6"></td>
                    <td id="sun-7"></td>
                    <td id="sun-8"></td>
                    <td id="sun-9"></td>
                    <td id="sun-10"></td>
                    
                </tr>
            </table>
        </div>
    </div>
    <p>Selected IDs: {{ids | json}}</p>
</body>


</html>

更新 创建了GIF,希望可以更好地解释它: https://media.giphy.com/media/39yUQuAbdRSmfVfCll/giphy.gif ->取消选择时,我必须一一取消选择单元格,而不是取消选择多个单元格。

1 个答案:

答案 0 :(得分:3)

尝试此代码段。我将总结我的更改(您可以在代码中将其视为注释)

摘要:

  

(1)根据起始单元格确定要删除还是添加

您需要根据起始单元格确定要删除集合还是要添加集合。

  

(2)不要在这里返回

在删除单元格时,您不想返回,因为我们希望它运行用于删除范围的代码。

  

(3)在此处删除或添加每个元素

这是最重要的更改。在.each()函数中,您实际上需要将每个元素删除或添加到集合中。我创建了名为removeElementaddElement的辅助函数,只是为了提高可读性。

我还建议您尝试重构代码,因为我看到很多重复的逻辑可以分离为各自的功能。但是为了这个例子,我基本上保持不变。

<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<script>

    var app = angular.module('plunker', []);

    app.controller('MainCtrl', function ($scope) {
        $scope.ids = [];
    });

    app.directive('dragSelect', function ($window, $document) {
        return {
            scope: {
                dragSelectIds: '='
            },
            controller: function ($scope, $element) {
                var cls = 'eng-selected-item';
                var startCell = null;
                var isRemoving = false;
                var dragging = false;
                var weekdays = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"];

                function mouseUp(el) {
                    dragging = false;
                    // Select or deselect the all class switchers

                    // Make sure that headers are not selected for weekdays
                    for (var k = 0; k < weekdays.length; k++) {
                        var count_selected = 0;
                        for (i = 0; i < 11; i++) {
                            var id = weekdays[k] + "-" + i;
                            if (document.getElementById(id).classList.contains(cls)) {
                                count_selected = count_selected + 1
                            };

                        }
                        if (count_selected === 11) {
                            var id = weekdays[k] + "-all";

                            document.getElementById(id).classList.add(cls);
                        } else {
                            var id = weekdays[k] + "-all";
                            document.getElementById(id).classList.remove(cls);
                        };
                    }

                    // Make sure that headers are not selected for hours
                    for (i = 0; i < 11; i++) {
                        var count_selected = 0;
                        for (var k = 0; k < weekdays.length; k++) {
                            var id = weekdays[k] + "-" + i;
                            if (document.getElementById(id).classList.contains(cls)) {
                                count_selected = count_selected + 1
                            };

                        }
                        if (count_selected === 7) {
                            var id = "hour-" + i;
                            document.getElementById(id).classList.add(cls);
                        } else {
                            var id = "hour-" + i;
                            document.getElementById(id).classList.remove(cls);
                        }


                    }


                }

                function mouseDown(el) {
                    dragging = true;
                    setStartCell(el);
                    setEndCell(el);
                }



                function setStartCell(el) {
                    startCell = el;
                    // (1) determine if we're removing or adding based on the start cell
                    isRemoving = el.hasClass(cls);
                }

                function mouseEnter(el) { if (!dragging) return; setEndCell(el); }


                function setEndCell(el) {

                    // Code for Monday
                    var day_of_week = "mon";
                    if (el.attr('id') === day_of_week + "-all") {
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < 24; i++) {
                                var id = day_of_week + "-" + i
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };
                        }

                    };

                    var day_of_week = "tue";
                    if (el.attr('id') === day_of_week + "-all") {
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };
                        }

                    };

                    var day_of_week = "wed";
                    if (el.attr('id') === day_of_week + "-all") {
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };
                        }

                    };

                    var day_of_week = "thu";
                    if (el.attr('id') === day_of_week + "-all") {
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };
                        }

                    };

                    var day_of_week = "fri";
                    if (el.attr('id') === day_of_week + "-all") {
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < 24; i++) {
                                var id = day_of_week + "-" + i
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };
                        }

                    };

                    var day_of_week = "sat";
                    if (el.attr('id') === day_of_week + "-all") {
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };
                        }

                    };

                    var day_of_week = "sun";
                    if (el.attr('id') === day_of_week + "-all") {
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < 11; i++) {
                                var id = day_of_week + "-" + i;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };
                        }

                    };

                    // Code for hours

                    if (el.attr('id').startsWith("hour")) {
                        var hour = el.attr('id').split("-")[1];
                        console.log(hour);
                        // If highlighted true
                        if (el.hasClass(cls) === true) {
                            var i;
                            for (i = 0; i < weekdays.length; i++) {
                                var id = weekdays[i] + "-" + hour;
                                document.getElementById(id).classList.remove(cls);
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                $scope.dragSelectIds.splice(elIndex, 1)

                            };

                        }
                        /// If highlighted false
                        if (el.hasClass(cls) === false) {
                            var i;
                            for (i = 0; i < weekdays.length; i++) {
                                var id = weekdays[i] + "-" + hour;
                                var elIndex = $scope.dragSelectIds.indexOf(id);
                                document.getElementById(id).classList.add(cls);
                                elIndex === -1 && $scope.dragSelectIds.push(id);
                            };

                        }

                    }

                    if (el.hasClass(cls)) { // if added then remove on click
                        el.removeClass(cls);
                        var elIndex = $scope.dragSelectIds.indexOf(el[0].id);
                        elIndex !== -1 && $scope.dragSelectIds.splice(elIndex, 1)
                        // (2) don't return here
                        // return false; 
                    }
                    if (!$scope.dragSelectIds) {
                        $scope.dragSelectIds = [];
                    }
                    
                    // (3) remove or add each element here
                    $(cellsBetween(startCell, el)).each(function(i, elem) {
                        if (isRemoving)
                          removeElement($(elem));
                        else 
                          addElement($(elem));
                    });


                }

                function removeElement(el) {
                  el.removeClass(cls);
                  var elIndex = $scope.dragSelectIds.indexOf(el[0].id);
                  elIndex !== -1 && $scope.dragSelectIds.splice(elIndex, 1)
                }
                
                function addElement(el) {
                  el.addClass(cls);
                  var elIndex = $scope.dragSelectIds.indexOf(el[0].id);
                  elIndex === -1 && $scope.dragSelectIds.push(el.attr('id'));
                }

                function rectangleSelect(selector, x1, x2, y1, y2) {
                    var elements = [];
                    jQuery(selector).each(function () {
                        var $this = jQuery(this);
                        var offset = $this.offset();
                        var x = offset.left;
                        var y = offset.top;
                        var w = $this.width();
                        var h = $this.height();

                        if (x >= x1 && x <= x2 && y >= y1 && y <= y2) {
                            // this element fits inside the selection rectangle
                            elements.push($this.get(0));
                        }
                    });
                    return elements;
                }

                function allCells(start, end) {
                  console.log('start, end', start, end);
                }

                function cellsBetween(start, end) {

                    var bounds = { minX: 0, minY: 0, maxX: 0, maxY: 0 };
                    bounds.minX = $window.Math.min($(start).offset().left, $(end).offset().left);
                    bounds.minY = $window.Math.min($(start).offset().top, $(end).offset().top);
                    bounds.maxX = $window.Math.max($(end).offset().left + $(end).width(), $(start).offset().left + $(start).width());
                    bounds.maxY = $window.Math.max($(end).offset().top + $(end).height(), $(start).offset().top + $(start).height());

                    var initiallySelectedTds = rectangleSelect("td", bounds.minX, bounds.maxX, bounds.minY, bounds.maxY);

                    for (var i = 0; i < initiallySelectedTds.length; i++) {
                        if ($(initiallySelectedTds[i]).offset().left < bounds.minX)
                            bounds.minX = $(initiallySelectedTds[i]).offset().left;
                        if ($(initiallySelectedTds[i]).offset().left + $(initiallySelectedTds[i]).width() > bounds.maxX)
                            bounds.maxX = $(initiallySelectedTds[i]).offset().left + $(initiallySelectedTds[i]).width();
                        if ($(initiallySelectedTds[i]).offset().top < bounds.minY)
                            bounds.minY = $(initiallySelectedTds[i]).offset().top;
                        if ($(initiallySelectedTds[i]).offset().top + $(initiallySelectedTds[i]).height() > bounds.maxY)
                            bounds.maxY = $(initiallySelectedTds[i]).offset().top + $(initiallySelectedTds[i]).height();
                    }
                    return rectangleSelect("td", bounds.minX, bounds.maxX, bounds.minY, bounds.maxY);

                }


                function wrap(fn) {
                    return function () {
                        var el = angular.element(this);
                        $scope.$apply(function () {
                            fn(el);
                        });
                    }
                }

                $element.delegate('td', 'mousedown', wrap(mouseDown));
                $element.delegate('td', 'mouseenter', wrap(mouseEnter));
                $document.delegate('body', 'mouseup', wrap(mouseUp));
            }
        }
    });
</script>
[drag-select] {
    cursor: pointer;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
   -khtml-user-select: none;
   -moz-user-select: none;
   -ms-user-select: none;
   user-select: none;
  }
  
  [drag-select] .eng-selected-item {
    background: green;
    color: white;
  }
<!DOCTYPE html>
<html ng-app="plunker">
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
    crossorigin="anonymous">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp"
    crossorigin="anonymous">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
    crossorigin="anonymous"></script>

<head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="jquery" data-semver="2.0.3" src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
    <script data-require="angular.js@1.2.x" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js"
        data-semver="1.2.16"></script>
    <script src="app.js"></script>
</head>


<body ng-controller="MainCtrl">

    <div class="container">
        <div class="col-lg-6">
            <table drag-select drag-select-ids="ids" class="table table-responsive table-bordered">
                <tr>
                    <td id="hour">Hours ></td>
                    <td id="hour-0">00</td>
                    <td id="hour-1">01</td>
                    <td id="hour-2">02</td>
                    <td id="hour-3">03</td>
                    <td id="hour-4">04</td>
                    <td id="hour-5">05</td>
                    <td id="hour-6">06</td>
                    <td id="hour-7">07</td>
                    <td id="hour-8">08</td>
                    <td id="hour-9">09</td>
                    <td id="hour-10">10</td>
                    
                </tr>
                <tr>
                    <td id="mon-all">MON</td>
                    <td id="mon-0"></td>
                    <td id="mon-1"></td>
                    <td id="mon-2"></td>
                    <td id="mon-3"></td>
                    <td id="mon-4"></td>
                    <td id="mon-5"></td>
                    <td id="mon-6"></td>
                    <td id="mon-7"></td>
                    <td id="mon-8"></td>
                    <td id="mon-9"></td>
                    <td id="mon-10"></td>
                    
                </tr>
                <tr>
                    <td id="tue-all">TUE</td>
                    <td id="tue-0"></td>
                    <td id="tue-1"></td>
                    <td id="tue-2"></td>
                    <td id="tue-3"></td>
                    <td id="tue-4"></td>
                    <td id="tue-5"></td>
                    <td id="tue-6"></td>
                    <td id="tue-7"></td>
                    <td id="tue-8"></td>
                    <td id="tue-9"></td>
                    <td id="tue-10"></td>
                    
                </tr>
                <tr>
                    <td id="wed-all">WED</td>
                    <td id="wed-0"></td>
                    <td id="wed-1"></td>
                    <td id="wed-2"></td>
                    <td id="wed-3"></td>
                    <td id="wed-4"></td>
                    <td id="wed-5"></td>
                    <td id="wed-6"></td>
                    <td id="wed-7"></td>
                    <td id="wed-8"></td>
                    <td id="wed-9"></td>
                    <td id="wed-10"></td>
                    
                </tr>
                <tr>
                    <td id="thu-all">THU</td>
                    <td id="thu-0"></td>
                    <td id="thu-1"></td>
                    <td id="thu-2"></td>
                    <td id="thu-3"></td>
                    <td id="thu-4"></td>
                    <td id="thu-5"></td>
                    <td id="thu-6"></td>
                    <td id="thu-7"></td>
                    <td id="thu-8"></td>
                    <td id="thu-9"></td>
                    <td id="thu-10"></td>
                    
                </tr>
                <tr>
                    <td id="fri-all">FRI</td>
                    <td id="fri-0"></td>
                    <td id="fri-1"></td>
                    <td id="fri-2"></td>
                    <td id="fri-3"></td>
                    <td id="fri-4"></td>
                    <td id="fri-5"></td>
                    <td id="fri-6"></td>
                    <td id="fri-7"></td>
                    <td id="fri-8"></td>
                    <td id="fri-9"></td>
                    <td id="fri-10"></td>
                    
                </tr>
                <tr>
                    <td id="sat-all">SAT</td>
                    <td id="sat-0"></td>
                    <td id="sat-1"></td>
                    <td id="sat-2"></td>
                    <td id="sat-3"></td>
                    <td id="sat-4"></td>
                    <td id="sat-5"></td>
                    <td id="sat-6"></td>
                    <td id="sat-7"></td>
                    <td id="sat-8"></td>
                    <td id="sat-9"></td>
                    <td id="sat-10"></td>
                    
                </tr>
                <tr>
                    <td id="sun-all">SUN</td>
                    <td id="sun-0"></td>
                    <td id="sun-1"></td>
                    <td id="sun-2"></td>
                    <td id="sun-3"></td>
                    <td id="sun-4"></td>
                    <td id="sun-5"></td>
                    <td id="sun-6"></td>
                    <td id="sun-7"></td>
                    <td id="sun-8"></td>
                    <td id="sun-9"></td>
                    <td id="sun-10"></td>
                    
                </tr>
            </table>
        </div>
    </div>
    <p>Selected IDs: {{ids | json}}</p>
</body>


</html>