【问题标题】:Showing checkbox inside input field在输入字段内显示复选框
【发布时间】:2021-02-22 20:01:53
【问题描述】:

我正在尝试显示一个带有禁用其输入字段选项的日期选择器。 When "Never Expire" is selected like image below datepicker input field will be disabled

这是我到目前为止所做的:

<style>
.chkbox {
    padding-right: 10px;
    font-weight: bold;
    position: absolute;
}
</style>
<input type="text" placeholder="&#xf073; Select Date" id="datepicker" autocomplete="new-datepicker" name="expireDate" style="font-family:Arial, FontAwesome" />

这是我的问题:

  1. 如何在日期选择器输入字段的右侧添加“永不过期”复选框?
  2. 如何在选中“永不过期”选项时禁用日期选择器输入字段?
  3. 如何提交日期选择器或复选框值中唯一的一个选项?

感谢期待:)

【问题讨论】:

  • 选中的选项表示复选框值或选择日期,或两者兼而有之?
  • 将 padding-right 放入输入中并以绝对定位移动复选框
  • @DavidLiang Selected mean checkbox option because on checkbox selected option datepicker will be disabled

标签: javascript html jquery css bootstrap-4


【解决方案1】:

我不喜欢使用绝对定位将复选框移动到日期选择器输入中的想法。我认为这是使用Bootstrap input group 的好候选。

<form>
    <div class="form-group">
        <div class="input-group date-select-with-expire-option">
            <div class="input-group-prepend">
                <span class="input-group-text">
                    <i class="far fa-calendar-alt"></i>
                </span>
            </div>
            <input type="text" class="form-control date-input" name="SelectedDate"
                   placeholder="Select date" />
            <div class="input-group-append">
                <div class="input-group-text">              
                    <div class="custom-control custom-checkbox">
                        <input type="checkbox" 
                            class="custom-control-input expire-option"
                            name="DateNeverExpires" id="never-expired">
                        <label class="custom-control-label" for="never-expired">
                            Never expires
                        </label>
                    </div>
                </div>
            </div>
        </div>
    </div>
</form>

默认情况下如下所示:

然后你可以玩转 CSS/SASS 让它看起来像你想要的:

.input-group.date-select-with-expire-option {
    .input-group-text {
        background-color: transparent;
    }
    
    // Just in case there are multiple .form-control elements
    .form-control {
        // Set the first .form-control's left border color to transparent
        &:first-of-type {
            border-left-color: transparent;
        }
        
        // Set the last .form-control's right border-color to transparent
        &:last-of-type {
            border-right-color: transparent;
        }
    }
    
    .input-group-prepend {
        .input-group-text {
            border-right-color: transparent;
        }
    }
    
    .input-group-append {
        .input-group-text {
            border-left-color: transparent;
        }
    }
}

看起来像:

要在选中“永不过期”选项时禁用日期选择器输入字段,您可以编写一些 jQuery:

$(function() {
    $('.date-select-with-expire-option .expire-option[type=checkbox]').change(function() {
        console.info($(this));
        let $dateInput = $('.date-select-with-expire-option').find('.date-input');
        $dateInput.prop('disabled', $(this).is(':checked'));
    });
});

当复选框被选中时,它看起来像


我会同时提交它们,您可以在应用程序中运行逻辑来确定要使用的值。只需确保它们在输入元素中设置了 name 属性即可。


演示: https://jsfiddle.net/davidliang2008/thbfnd2s/38/


更新:安装日期范围选择器

我只是举一个使用Date Range Picker 作为日期输入的日期选择器实现的示例。

您可以通过引用其类或 Id(如果需要)轻松选择日期输入:

function() {
    $('.date-select-with-expire-option .date-input').daterangepicker({
        singleDatePicker: true
    });

    ...
}

演示: https://jsfiddle.net/davidliang2008/thbfnd2s/42/


更新:安装 jQuery 日期选择器

看起来作者在使用 jQuery 日期选择器时遇到了问题,所以让我来看看它需要什么。你需要安装

那么你需要改变的只是实例化日期选择器对象的那段代码:

$(function() {
    $('.date-select-with-expire-option .date-input').datepicker();
    
    ...
});

演示: https://jsfiddle.net/davidliang2008/thbfnd2s/43/

【讨论】:

  • @freedomn-m:你是什么意思?我的解决方案的哪一部分使用了绝对定位?我很想学习。
  • 打开小提琴,选择复选框,检查元素,选择输入类型=复选框,css:.custom-control-input { position: absolute } - 这并不重要,但引导 UI 做了很多相对的(和一些小的绝对) 定位。
  • @Murteza:我没有实现任何日期日历。我认为您的问题是将复选框与日期输入一起放置。您的 OP 也没有显示您正在使用的日期选择器的实现。其中有很多:jQuery datepicker、Bootstrap calendar、Date Range Picker 等。
  • @Murteza:我已经更新了我的答案,并向您展示了如何使用日期范围选择器,但过程与其他选择器实际上相同:您可以将 id 添加回日期输入,或者您可以像我一样通过类引用它。请阅读我的代码并了解它是如何工作的。我并不是想完全构建一个与您完全一样的解决方案,而是希望您了解其背后的概念。
  • @Murteza:请查看我的更新。您只需将实例化日期范围选择器的代码交换为 jQuery 日期选择器。我不确定你为什么会遇到问题。如果您必须使用 #datepicker 作为日期输入的 ID,则需要更改代码 let $dateInput = $('.disable-date-input').find('.date-input'); 以使用该 ID,例如 let $dateInput = $('#datepicker');
【解决方案2】:

您可以将两个输入(复选框和日期选择器)放在一个 div 上(作为包装器) 之后为复选框提供绝对位置。您可以将其与边距语法对齐。

【讨论】:

  • 我将复选框和日期选择器放在一个 div 包装器中,但它们仍然单独显示。我用这个css来对齐.chkbox { padding-right: 10px; font-weight: bold; position: absolute}
  • 相关:Your answer is in another castle: when is an answer not an answer? - 请在您的回答中演示如何做到这一点。
  • @Ali Safaei 我更新了我的问题。你能请jsFidle示例
猜你喜欢
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
相关资源
最近更新 更多