简体   繁体   English

影响CSS规则的JavaScript / jQuery函数

[英]JavaScript/jQuery function affecting CSS rules

I am trying to write function that generates grid based on table data. 我正在尝试编写基于表数据生成网格的函数。 The function works, but, for some reason, the classes aren't causing style change. 该函数有效,但是由于某种原因,这些类并未引起样式更改。 My function looks like: 我的功能看起来像:

$(document).ready(function()
{
    // create 9:00 and 9:30 cells for both employees
    generateAvailabilityGrid($("#oneDay"), 30, 9, 10);
});


/* NOTE: This function works as expected. I have tested it */
// function that generates the availability grid for availabilitySchedule
// parameters: ID of container to write availability grid to (or index), size of interval block (in minutes, as integer), (optional) start time, (optional) end time
function generateAvailabilityGrid(identifier, intervalSize, floatStartTime, floatEndTime)
{
    // for good measure, define floatStartTime,floatEndTime as 9 AM,9 PM, respectively
    floatStartTime = floatStartTime || 9;
    floatEndTime = floatEndTime || 21;
    // enforce intervalSize to be greater than 10
    if (intervalSize < 10) return;
    // enforce floatSize,floatEndTime to be between 0 and 23.99
    if (((floatStartTime < 0) || (floatStartTime >= 24)) || ((floatEndTime <= 0) || (floatEndTime >= 24))) return;
    // create container div element (will serve as availabilityTable)
    var tableDiv = $('<div class="table"></div>');
    // create dummy row div, dummy cell div
    var dummyRowDiv = $('<div class="tableRow"></div>'),
        dummyCellDiv = $('<div class="tableCell"></div>');
    // get names from #employeeTable
    var names = $('#employeeTable tr:not(#titleRow)').map(function() { return $(this).children(':lt(2)').map(function() { return $(this).children('input').val(); }).get().join(" "); });
    // for every name in names
    $(names).each(
        function()
        {
            // copy dummy row and append label with name to it
            var row = $(dummyRowDiv).clone();
            row.append($("<label></label>").text(this));
            for (var m = floatStartTime * 60; m < floatEndTime * 60; m += intervalSize)
            {
                // create cells
                var tempCell = $(dummyCellDiv).clone();
                if ((m % 60 == 0) && (m > floatStartTime))
                {
                    $(tempCell).addClass('hourMark');
                }
                // have cell, on click, be marked 'available'
                $(tempCell).click(function() { $(this).toggleClass('available'); });
                // TODO: fetch data and use it to "fill" appropriate cells
                // append cells to row
                $(row).append(tempCell);
            }
            // append row to container div
            $(tableDiv).append(row);
        });
    // determine if identifier is int
    var isIntIdentifier = (identifier > -1);
    // append tableDiv to div identified by identifier
    // if identifier is int
    if (isIntIdentifier)
    {
        // use index to get container to append tableDiv to and append
        $('#availabilitySchedule :nth-child(' + (identifier + 1) + ')').append(tableDiv);
    }
    else
    {
        // get container to append tableDiv to by name and append
        $(identifier).append(tableDiv);
    }
}

The CSS rules that get "struck out" are: 被“淘汰”的CSS规则是:

.hourMark
{
    border-right: 2px solid #000;
}

.available
{
    background: #0f0;
}

I think issue with my code is the attempts to add class and mouse click listener to temp object created inside for-loop. 我认为我的代码存在问题是试图将类和鼠标单击侦听器添加到在for循环中创建的临时对象。 Here is the SSCCE: https://jsfiddle.net/b73fo0z5/ 这是SSCCE: https ://jsfiddle.net/b73fo0z5/

Does this mean that I am going to have to define everything outside the for-loop, after the cells have been added to the table div? 这是否意味着在将单元格添加到表div之后,我将不得不在for循环之外定义所有内容? If so, why? 如果是这样,为什么?

The issue is that css rules are ranked by selector specificity 问题是css规则按选择器特异性排序

Your classes alone are not specific enough to rank above the default rule used to set background. 仅您的类不够具体,无法排名超过用于设置背景的默认规则。 This can easily be inspected in browser dev tools css inspector for any element and the rules affecting element will be shown in order of their ranking 可以在浏览器开发工具css inspector中轻松检查此元素的任何元素,影响元素的规则将按照其排名顺序显示

Try 尝试

#availabilitySchedule .available
{
    background: red;
}

Helpful article https://css-tricks.com/specifics-on-css-specificity/ 有用的文章https://css-tricks.com/specifics-on-css-specificity/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM