javascript - 图像过滤器插件在一个元素中有效,但在另一个元素中无效

标签 javascript jquery html css

我正在使用 w3schools 的插件来过滤元素。它在我的一个元素中完美运行。但是现在我想在我的另一个元素中使用它但是它不起作用。这是代码笔:

https://codepen.io/zakero/pen/mZYBPz

请问有人能找出其中的问题吗?

Javascript:

filterSelection("all")
function filterSelection(c) {
  var x, i;
  x = document.getElementsByClassName("work-images");
  if (c == "all") c = "";
  for (i = 0; i < x.length; i++) {
    w3RemoveClass(x[i], "show");
    if (x[i].className.indexOf(c) > -1) w3AddClass(x[i], "show");
  }
}

function w3AddClass(element, name) {
  var i, arr1, arr2;
  arr1 = element.className.split(" ");
  arr2 = name.split(" ");
  for (i = 0; i < arr2.length; i++) {
    if (arr1.indexOf(arr2[i]) == -1) {element.className += " " + arr2[i];}
  }
}

function w3RemoveClass(element, name) {
  var i, arr1, arr2;
  arr1 = element.className.split(" ");
  arr2 = name.split(" ");
  for (i = 0; i < arr2.length; i++) {
    while (arr1.indexOf(arr2[i]) > -1) {
      arr1.splice(arr1.indexOf(arr2[i]), 1);     
    }
  }
  element.className = arr1.join(" ");
}


// Add active class to the current button (highlight it)

// change is-checked class on buttons
$('.button-group').each( function( i, buttonGroup ) {
  var $buttonGroup = $( buttonGroup );
  $buttonGroup.on( 'click', 'button', function() {
    $buttonGroup.find('.is-checked').removeClass('is-checked');
    $( this ).addClass('is-checked');
  });
});

最佳答案

抱歉,编写一个新过滤器比解决一个问题要容易得多。

我更改了 HTML(添加了一个 data-filtertype 属性),并编写了一个调用过滤器的 jQuery 点击函数(filterByType).

代码更简单,出错的地方更少。如果您唯一想要的只是过滤图像,那么这就可以了。 (这就是为什么建议写出您想要的结果 - 获得结果的方式并不总是您的想法。)

$(".button").on('click', function(e) {
  e.preventDefault();
  filterByType($(this).attr('data-filtertype'))
})

function filterByType(type) {
  $('.work-images').each(function(i, e) {
    if (type !== 'all' && !$(e).hasClass(type)) {
      $(e).hide()
    } else {
      $(e).show()
    }
  })
}
* {
  box-sizing: border-box;
}

.button {
  display: inline-block;
  padding: 10px 40px;
  background: #FF6760;
  border: none;
  font-weight: bold;
  color: #fff;
  font-family: lato_lightregular;
  font-size: 14px;
  cursor: pointer;
  text-transform: uppercase;
}

.button:hover {
  background: #616161;
  color: #fff;
}

.button:active,
.button.is-checked {
  background-color: #616161;
  outline: 0;
}

.button.is-checked {
  color: white;
  text-shadow: 0 -1px hsla(0, 0%, 0%, 0.8);
}

.button:active {
  box-shadow: inset 0 1px 10px hsla(0, 0%, 0%, 0.8);
}

.button-group {
  margin-bottom: 20px;
}

.button-group:after {
  content: '';
  display: block;
  clear: both;
}

.button-group .button {
  border-radius: 5px;
  margin-left: 0;
  margin-right: 8px;
}

.grid {
  display: -ms-flexbox;
  display: flex;
  -ms-flex-wrap: wrap;
  flex-wrap: wrap;
  margin: 10px -16px;
}


/* clear fix */

.grid:after {
  content: '';
  display: block;
  clear: both;
}

.work-images {
  -ms-flex: 25%;
  flex: 25%;
  max-width: 25%;
  border: 11px solid #fff;
}

.work-images img {
  vertical-align: middle;
  width: 100%;
  height: 210px;
}

.work-images img:hover {
  filter: none;
}

.close {
  text-decoration: none;
  float: right;
  font-size: 24px;
  font-weight: bold;
  color: white;
}

.content {
  display: inline-block;
}

.show {
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<section class="portfoliosection">
  <div class="container">
    <div class="myworks text-center">
      <h2>Our Featured Works</h2>
      <p>Curabitur blandit tempus porttitor. Maecenas faucibus mollis interdum.</p>
      <div class="work-filter">
        <div id="filters" class="button-group">
          <button class="button is-checked" data-filtertype="all"> All</button>
          <button class="button" data-filtertype="web"> Web Design</button>
          <button class="button" data-filtertype="mob"> Mobile Design</button>
          <button class="button" data-filtertype="photo"> Photography</button>
        </div>

        <div class="grid">
          <div class="work-images web">
            <img src="https://i.imgur.com/FZED8Yb.jpg" onclick="onClick(this)" alt="Web Design">

          </div>
          <div class="work-images mob">
            <img src="https://i.imgur.com/Jzts3Bm.jpg" onclick="onClick(this)" alt="Mobile Design">

          </div>
          <div class="work-images photo">
            <img src="https://i.imgur.com/IC4tsi0.jpg" onclick="onClick(this)" alt="Photography">

          </div>
          <div class="work-images mob">
            <img src="https://i.imgur.com/1x1X5S6.jpg" onclick="onClick(this)" alt="Mobile Design">

          </div>
          <div class="work-images web">
            <img src="https://i.imgur.com/RckvhDi.jpg" onclick="onClick(this)" alt="Web Design">

          </div>
          <div class="work-images photo">

            <img src="https://i.imgur.com/zjteEnm.jpg" onclick="onClick(this)" alt="Photography">

          </div>
          <div class="work-images web">

            <img src="https://i.imgur.com/i34YqDD.jpg" onclick="onClick(this)" alt="Web Design">

          </div>
          <div class="work-images photo">

            <img src="https://i.imgur.com/2qwcGam.jpg" onclick="onClick(this)" alt="Photography">

          </div>
          <div class="work-images mob">

            <img src="https://i.imgur.com/CoEb43e.jpg" onclick="onClick(this)" alt="Mobile Design">

          </div>
          <div class="work-images photo">

            <img src="https://i.imgur.com/EemBYgT.jpg" onclick="onClick(this)" alt="Photography">

          </div>
          <div class="work-images web">

            <img src="https://i.imgur.com/RdDfJUp.jpg" onclick="onClick(this)" alt="Web Design">

          </div>
          <div class="work-images photo">

            <img src="https://i.imgur.com/FeKM3fp.jpg" onclick="onClick(this)" alt="Photography">

          </div>
        </div>
      </div>
    </div>
  </div>
</section>

关于javascript - 图像过滤器插件在一个元素中有效,但在另一个元素中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57026371/

相关文章:

jquery - 在 Fabric JS 中更改 Canvas 的背景

javascript - 使用 VueJS 保持页面刷新

javascript - 从对象数组中,仅提取属性的特定值作为数组

javascript - 使用 AngularJS 和 Canvas 实现流程图

javascript - 如何让 window.print() 在本地运行?

javascript - 如何将文本从一个多重输入复制到另一个

javascript - 为什么我的刷卡器未定义?

JQuery 事件处理程序范围

javascript - 如何更改IE浏览器的标志?

python - 在 BeautifulSoup 中查找特定属性