如果有人能为此想到更好的标题,请不要犹豫更改它。
我是 jQuery 的新手,遇到过过滤元素的问题。
我通过 checkbox 使用更改功能过滤具有 data- 属性的 DIVS。
我的问题是,如果我过滤一个 data 属性(colour),然后过滤另一个属性(brand)元素都是隐藏的。但是,如果我取消选中其中一个过滤器,元素会重新弹出,即使它们仍然被另一个属性过滤。
有什么方法可以阻止这种情况发生?
这是代码。
<div data-brand="Nike" data-price="31" data-colour="Blue">Blue</div>
<div data-brand="Nike" data-price="31" data-colour="Red"> Red </div>
Colours:
Blue<input type="checkbox" id="BlueCB" checked>
Red<input type="checkbox" id="RedCB" checked>
Brand: Nike <input type="checkbox" id="NikeCB" checked>
<script>
var BlueSelector = $('#BlueCB');
BlueSelector.on("change", function(){
if($(this).is(":checked"))
{
var divs = $("div[data-colour=Blue]");
divs.css("display", "block");
} else
{
var divs = $("div[data-colour=Blue]");
divs.css("display", "none");
}
});
var RedSelector = $('#RedCB');
RedSelector.on("change", function(){
if($(this).is(":checked"))
{
var divs = $("div[data-colour=Red]");
divs.css("display", "block");
} else
{
var divs = $("div[data-colour=Red]");
divs.css("display", "none");
}
});
var NikeSelector = $('#NikeCB');
NikeSelector.on("change", function(){
if($(this).is(":checked"))
{
var divs = $("div[data-colour=Nike]");
divs.css("display", "block");
} else
{
var divs = $("div[data-brand=Nike]");
divs.css("display", "none");
}
});
</script>
要重现问题,请取消勾选耐克复选框,然后取消勾选蓝色复选框并再次勾选。该元素将弹回,这就是问题所在。
这是 JSFIDDLE
这可能听起来不是最好的解释,但我已尽我所能..你会在玩 fiddle 后明白。
最佳答案
下面的代码将适用于多品牌和多颜色,这是通过为品牌和颜色设置一个单独的过滤器数组来完成的,如果过滤器被选中,我们将添加到相应的过滤器数组,然后最后我们检查每个div 并检查它是否同时具有 brand 和 color 关键字,如果都满足我们显示( * ) 它,否则我们隐藏( * )它:
var Divs = $('.divs'),
CheckBoxes = $('.chbx'),
BlueSelector = $('#BlueCB'),
RedSelector = $('#RedCB'),
NikeSelector = $('#NikeCB'),
Index, Colour, Brand;
CheckBoxes.on("change", function() {
// Reset filters Arrays
var ColoursFilters = [],
BrandsFilters = [];
// If Blue checkbox is checked, add it to colours array -
// Otherwise it's unchecked, remove it from the colours array
if (BlueSelector.is(":checked")) {
ColoursFilters.push('Blue');
} else if (BlueSelector.is(":checked") == false) {
Index = ColoursFilters.indexOf('Blue');
ColoursFilters.splice(Index, 'Blue');
}
// If Red checkbox is checked, add it to colours array -
// Otherwise it's unchecked, remove it from the colours array
if (RedSelector.is(":checked")) {
ColoursFilters.push('Red');
} else if (RedSelector.is(":checked") == false) {
Index = ColoursFilters.indexOf('Red');
ColoursFilters.splice(Index, 'Red');
}
// If Nike checkbox is checked, add it to brands array -
// Otherwise it's unchecked, remove it from the brands array
if (NikeSelector.is(":checked")) {
BrandsFilters.push('Nike');
} else if (NikeSelector.is(":checked") == false) {
Index = BrandsFilters.indexOf('Red');
BrandsFilters.splice(Index, 'Blue');
}
// Now we check for every colour and every brand -
// If both conditions met, show the div, else hide it.
Divs.each(function() {
Colour = $(this).attr('data-colour');
Brand = $(this).attr('data-brand');
if ($.inArray(Colour, ColoursFilters) > -1) {
if ($.inArray(Brand, BrandsFilters) > -1) {
$(this).show();
} else {
$(this).hide();
}
} else {
$(this).hide();
}
})
});<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<div class="divs" data-brand="Nike" data-price="31" data-colour="Blue">
Blue</div>
<div class="divs" data-brand="Nike" data-price="31" data-colour="Red">
Red</div>
Colours: Blue
<input class="chbx" type="checkbox" id="BlueCB" checked>Red
<input class="chbx" type="checkbox" id="RedCB" checked>
<br>Brand: Nike
<input class="chbx" type="checkbox" id="NikeCB" checked>
编辑 1:
如果您想将所有复选框的默认状态设置为未选中,我们创建一个包含所有逻辑的函数checkFilters(),我们在页面首次加载以及每次加载时调用它其中一个复选框的状态已更改,如此 JS Fiddle 2 所示.
编辑 2:
javascript 代码仍然有冗余代码,这仅适用于 3 个复选框,假设有 10 个品牌,每个品牌有 5 种颜色,那么代码看起来会很乱,并且重复出现错误的机会更多,使代码更健壮、灵活且更短,我们为每个复选框添加了 data-type 和 data-keyword 属性,并根据 data-type 的值 属性,我们返回相应的数组并将 data-keyword 属性的值推送到相应的数组中,这样无论有多少种颜色或品牌复选框,它都会起作用,就像这样JS Fiddle 3
输入示例:
<input class="chbx" type="checkbox" id="BlueCB" data-type="Colours" data-keyword="Blue" checked> Red
JS:
function checkFilters() {
// Reset filters Arrays
var ColoursFilters = [],
BrandsFilters = [];
CheckBoxes.each(function() {
var $th = $(this), ArrayType, keyword;
// Using ternary operator, we return the array that corresponds to the data-type
ArrayType = $th.attr('data-type') == 'Colours' ? ColoursFilters : BrandsFilters;
keyword = $th.attr('data-keyword');
if ($th.is(':checked')) {
ArrayType.push(keyword);
} else if ($th.is(":checked") == false) {
Index = ArrayType.indexOf(keyword);
ArrayType.splice(Index, keyword);
}
});
// ...
}
* 注意 jQuery .show() "大致相当于调用 .css( "display", "block")"而 .hide() “大致相当于调用 .css( "display", "none")”
关于javascript - 如果已在 Jquery 中过滤,则保持过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34299387/
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
我有一个名为Post的类,我需要能够适应以下场景:如果用户选择了一个类别,则只显示该类别的帖子如果用户选择了一种类型,则只显示该类型的帖子如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子如果用户没有选择任何内容,则显示所有帖子我想知道我的Controller是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法-有谁知道我如何才能做到这一点?classPostsController 最佳答案 您最好遵循“胖模型,瘦Controller”的惯例,这意味着您应该将这种逻辑放在模型本身中。Post类应该能够报告
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过ajax执行,并将整个内容粘贴到另一个电子邮件表单中。我不知道如何将变量从我的HAML发送到我的Controllernew.html.haml-form_tagadmin_email_blast_pathdoSubject%br=text_field_tag'subject',:class=>"mass_email_subject"%brBody%br=text_area_tag'message','',:nam
啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组