监听DIV等标记的class属性改变,实现onshow,onhi
2019-06-12 本文已影响0人
毛毛v5
貌似h5标记有click等事件的监听,没有show,hide等事件的监听。用了一个tab样式库,想实现切换tab时刷新页面数据,这个库也没说明招接口也不好找。看到他是在div的class属性上面addClass("active show"),removeClass("active show"),来实现切换时的隐藏和显示的。于是就想有没有监听class改变的方法,百度到 MutationObserver
用示例代码测试了一下,果真可以。
<script>
$(document).ready(function(){
var targetNode = document.getElementById('article-original-review').parentNode;
var config = { attributes: true };
var callback = function(mutationsList) {
for(var mutation of mutationsList) {
if (mutation.type == 'attributes') {
if($(targetNode).hasClass("active")){
setTimeout(function(){ getlist()},100);
}
}
}
};
var observer = new MutationObserver(callback);
observer.observe(targetNode, config);
});
function getlist(){
var newidolurl = "/api/private/";
$.ajax({
type: "POST", //data 传送数据类型。post 传递
dataType: 'json', // 返回数据的数据类型json
contentType: "application/json; charset=utf-8",
url: newidolurl, // yii 控制器/方法
cache: false,
data: JSON.stringify({action:'original-review-list'}), //传送的数据
error:function(res){
alert("数据传输错误");
},success: function (data) {
if(data.status == 0){
}else{
alert(data.msg);
}
}
})
}
</script>
测试tab点击切换按钮时,果真触发了ajax请求。但是有个问题,为啥连续触发两次啊。后来想一想难道时addClass("active show") 两个属性就触发两次,搞不懂啊。找不到原因也要解决阿。于是引入setTimeout来过滤重复请求。代码如下:
<script>
$(document).ready(function(){
var targetNode = document.getElementById('article-original-review').parentNode;
var config = { attributes: true };
var idTimeout = 0;
var callback = function(mutationsList) {
for(var mutation of mutationsList) {
if (mutation.type == 'attributes') {
clearTimeout(idTimeout)
if($(targetNode).hasClass("active")){
idTimeout = setTimeout(function(){ getlist()},100);
}
}
}
};
var observer = new MutationObserver(callback);
observer.observe(targetNode, config);
});
function getlist(){
var newidolurl = "/api/private/";
$.ajax({
type: "POST", //data 传送数据类型。post 传递
dataType: 'json', // 返回数据的数据类型json
contentType: "application/json; charset=utf-8",
url: newidolurl, // yii 控制器/方法
cache: false,
data: JSON.stringify({action:'original-review-list'}), //传送的数据
error:function(res){
alert("数据传输错误");
},success: function (data) {
if(data.status == 0){
}else{
alert(data.msg);
}
}
})
}
</script>
ok,搞定,仅作记录。