CSDN问答——精选问答Vol.6

Posted 问答小精灵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSDN问答——精选问答Vol.6相关的知识,希望对你有一定的参考价值。

《精选问答》挑选CSDN问答频道每周最新最热的优质回答,为大家提供可信赖的优质解答,点击查看更多已解决问题

目录

1、python自定义类的私有类中,如何实例化私有类本身

2、VUE中如何实现鼠标移动到某网页区域,屏蔽滚轮的功能

3、vue3的render函数绑定点击事件失败

4、C中free报错问题:heap corruption detected

5、通过id调用的函数,如何在一个页面中运行多次?

6、echarts 实现动态数据展示效果

7、原生js页面内点击导航按钮跳转到指定位置,为什么实现不了?


1、python自定义类的私有类中,如何实例化私有类本身

问题描述:

在下述代码中,执行之后会有出错提示 NameError: name '_B__B' is not defined

class A:
    def __init__(self):
        self.name = '测试类'
        self.class1 = self.__B()
        self.class2 = self.class1.doSomeThing()
 
    class __B:
        def __init__(self):
            self.name = '私有类'
 
        def doSomeThing(self):
            return __B()
 
a = A()

 请问,如何在私有类中实例化本身的类型,使用公有类可以实例化,不用回答这个方式了

解决方案——来自@sHlsy1995的回答

关键还是你是一个私有类,所以在A里的名字不是__B而是_A__B

class A:
    def __init__(self):
        self.name = "测试类"
        self.class1 = self.__B()
        self.class2 = self.class1.doSomeThing()
 
    class __B:
        def __init__(self):
            self.name = "私有类"
 
        def doSomeThing(self):
            return self.__class__()

本题更多回答戳链接:https://ask.csdn.net/questions/7449628


2、VUE中如何实现鼠标移动到某网页区域,屏蔽滚轮的功能

问题描述:

如图,这是一个用canvas库(fabric.js)生成的图像,用鼠标滚轮能使图像缩放。问题是用滚轮的同时,整个网页也会上下滚动。有没有办法让我鼠标停留在图像上滚动时,屏蔽网页的滚动。

我知道Vue有一个@scroll.prevent的写法,但是好像只能用在特定的组件上,如input.

如果用VUE不行的话,用原生js解决也行。

以下是滚轮实现canvas画布缩放的代码

onMouseWheel(){
    // 滚动缩放画布大小
    this.canvas.on('mouse:wheel', (options) => {
      let zoom = (options.e.deltaY > 0 ? -0.1 : 0.1) + this.canvas.getZoom()
      // 最小为原来的1/10
      zoom = Math.max(0.1, zoom)
      // 最大是原来的3倍
      zoom = Math.min(5, zoom)
      // 在中心缩放
      const zoomPoint = new fabric.Point(this.canvas.width / 2, this.canvas.height / 2)
      this.canvas.zoomToPoint(zoomPoint, zoom)
    })
  }

——————————————————6月15日更新

贴出我最后实现的代码,唯一的缺点就是滚动条会消失

window.onload = ()=>{
  let mapcover = document.getElementById("mapcover");
  console.log('执行了')
  mapcover.onmouseout = ()=>{
    document.documentElement.style.overflow='auto';
  }
  mapcover.onmouseover = ()=>{
    document.documentElement.style.overflow='hidden';
  }
}

解决方案——来自@雨生百谷,方为谷雨的回答

你可以试试给canvas绑定个mouseover和mouseout事件在这个里可以设置个禁用滚轮 类似这样https://www.cnblogs.com/linjiangxian/p/11460930.html ,其他方法都会很麻烦,比如鼠标移动获取坐标,之类的

本题更多回答戳链接:https://ask.csdn.net/questions/7448934


 

3、vue3的render函数绑定点击事件失败

问题描述:

 app.component("child", {
        props: ["count"],
        methods: {
          handleClick() {
            console.log("test");
          },
        },
        render() {
          const { h } = Vue;
          return h(
            "div",
            {
              on: {
                click: this.handleClick,
              },
              style: {
                cursor: "pointer",
              },
            },
            " count: " + this.count
          );
        },
      });

代码如上,我想使用render函数创建一个组件模板,并且给该组件绑定一个点击事件,为什么不能成功?应该怎么写,上面是我百度的写法。可这写法写上去,只是让html代码多一个on的属性,和事件没什么关系。

<div on="[object Object]" test="test" style="cursor: pointer;"> count: 1</div>

 解决方案——来自@前端-海鸟的回答

vue3中需要使用onClick驼峰写法,这样写就生效,具体参考官方文档:https://v3.cn.vuejs.org/guide/render-function.html#h-%E5%8F%82%E6%95%B0

本题更多回答戳链接:https://ask.csdn.net/questions/7450129


4、C中free报错问题:heap corruption detected

问题描述:

这是一个关于AVL树的问题,我对current复制后,并没有改动其内容,怎么会free报错呢?以下是删除AVL节点的函数,在图中画红线的地方报了错。

解决方案——来自@qfl_sdu ​​​​​​的回答

你看一下你创建节点的时候,申请的空间是多大,这个错误一般都是操作malloc或者new申请的内存溢出。 用malloc或new申请了一个特定大小的内存,但是后期对这块内存进行复制,可能超过了该内存大小的范围,再进行free或者delete的时候,就会报错。

free前需要判断是否为NULL,代码修改如下:

//原始代码
if(parent->left == current){
	parent->left = NULL;
	free(current);//这里需要判断current是不是NULL
}
 
//上述代码修改为:
if(parent->left == current){
	if(current) free(current);
	parent->left = NULL;
}

本题更多回答戳链接:https://ask.csdn.net/questions/7452154


5、通过id调用的函数,如何在一个页面中运行多次?

问题描述:

用了一个js脚本,是通过id调用的,但是只能调用一次,如何修改能多次调用该脚本,或者有别的方法解决问题,脚本如下:

(function () {
    var radioWrap = document.getElementById("radio_wrap"),
        li = radioWrap.getElementsByTagName("li");
    for (var i = 0; i < li.length; i++) {
        li[i].onclick = function () {
            for (var i = 0; i < li.length; i++) {
                li[i].className = "";
            }
            this.className = "checked";
        }
    }
})();

前端代码

<div id="radio_wrap">
                        <span class="GoodsInformation_reight-dt" style="display:inline-block;font-weight:700;margin-top:5px">机身分类</span>
                        <ul >
                            <li class="c checked">
                                <input type="radio" id="radio_a_01" name="radio_a" />
                                <label for="radio_a_01"><span style="display:inline-block">海风青</span></label>
                                <i></i>
                            </li>
                            <li class="c">
                                <input type="radio" id="radio_a_02" name="radio_a" />
                                <label for="radio_a_02"><span style="display:inline-block">暗夜蓝</span></label>
                                <i></i>
                            </li>
                            <li class="c">
                                <input type="radio" id="radio_a_03" name="radio_a" />
                                <label for="radio_a_03"><span style="display:inline-block">绯玉红</span></label>
                                <i></i>
                            </li>
                        </ul>
                    </div>
                    <script src="../js/checkedborder.js"></script>
                    <div id="radio_wrap">
                        <span class="GoodsInformation_reight-dt" style="display:inline-block;font-weight:700;margin-top:5px">机身分类</span>
                        <ul >
                            <li class="c checked">
                                <input type="radio" id="radio_a_04" name="radio_a" />
                                <label for="radio_a_01"><span style="display:inline-block">海风青</span></label>
                                <i></i>
                            </li>
                            <li class="c">
                                <input type="radio" id="radio_a_05" name="radio_a" />
                                <label for="radio_a_02"><span style="display:inline-block">暗夜蓝</span></label>
                                <i></i>
                            </li>
                            <li class="c">
                                <input type="radio" id="radio_a_06" name="radio_a" />
                                <label for="radio_a_03"><span style="display:inline-block">绯玉红</span></label>
                                <i></i>
                            </li>
                        </ul>
                    </div>
                    <script src="../js/checkedborder.js"></script>

解决方案——来自@CSDN专家-showbo的回答

id不能一样,一样需要使用属性选择器,不能用id选择器。你要分2组radio的话name不能一样,一样上下2组只能选择一个,只需要导入一次,在所有html代码最后导入一次就行。

<div id="radio_wrap">
    <span class="GoodsInformation_reight-dt" style="display:inline-block;font-weight:700;margin-top:5px">机身分类</span>
    <ul>
        <li class="c checked">
            <input type="radio" id="radio_a_01" name="radio_a" />
            <label for="radio_a_01"><span style="display:inline-block">海风青</span></label>
            <i></i>
        </li>
        <li class="c">
            <input type="radio" id="radio_a_02" name="radio_a" />
            <label for="radio_a_02"><span style="display:inline-block">暗夜蓝</span></label>
            <i></i>
        </li>
        <li class="c">
            <input type="radio" id="radio_a_03" name="radio_a" />
            <label for="radio_a_03"><span style="display:inline-block">绯玉红</span></label>
            <i></i>
        </li>
    </ul>
</div>
<div id="radio_wrap">
    <span class="GoodsInformation_reight-dt" style="display:inline-block;font-weight:700;margin-top:5px">机身分类</span>
    <ul>
        <li class="c checked">
            <input type="radio" id="radio_a_04" name="radio_b" />
            <label for="radio_a_01"><span style="display:inline-block">海风青</span></label>
            <i></i>
        </li>
        <li class="c">
            <input type="radio" id="radio_a_05" name="radio_b" />
            <label for="radio_a_02"><span style="display:inline-block">暗夜蓝</span></label>
            <i></i>
        </li>
        <li class="c">
            <input type="radio" id="radio_a_06" name="radio_b" />
            <label for="radio_a_03"><span style="display:inline-block">绯玉红</span></label>
            <i></i>
        </li>
    </ul>
</div>
<script>
    (function () {
        var radioWrap = document.querySelectorAll("div[id=radio_wrap]");
        for (var Wrap of radioWrap) {
            li = Wrap.getElementsByTagName("li");
            for (var i = 0; i < li.length; i++) {
                li[i].onclick = function () {
                    var li = this.parentNode.parentNode.getElementsByTagName("li");//通过dom关系获取各自的li
                    for (var i = 0; i < li.length; i++) {
                        li[i].className = "";
                    }
                    this.className = "checked";
                }
            }
        }
    })();
 
</script>

本题更多回答戳链接:https://ask.csdn.net/questions/7450844


6、echarts 实现动态数据展示效果

问题描述:

我现在正在用datav+vue 实现一个大屏展示的系统,我做的一个折线图,现在想实现动态显示效果。

我测试了一下,因为数据是从服务端取到的,我做了一个定时器每隔一段时间就去服务器端取一次数据,但是每次都是折线图整个刷新闪一下,然后在显示新的,根本实现不了那种不闪的动画效果。我如果不通信然后把数据随机set进去就可以实现,但是不通信也不行啊,大家有没有什么好的实现方案啊

这样的话就是有动画效果,看不出数据是刷新的,然后折现会变化。而如果数据是从后台服务器取出来的:

const setData = () => {
      cdata.category = [];
      cdata.lineData = [];
      for (var i = 0; i < 10; i++) {
        cdata.category.push((Math.random() * 10 + 40).toFixed(3));
        cdata.lineData.push((Math.random() * 20 + 4).toFixed(3));
    }}

这样两端代码用定时器调用,产生的效果不一样啊,后一种是明显是重新刷新的图表,而前一种就看不出来刷新,折线一直在动,第二种就是去服务器去一次数据闪一下,刷新图表,效果太不好了。 

const setData = () => {
      cdata.category = [];
      cdata.lineData = [];
       axios.post('http://localhost:8080/xy/list').then(
          function (response) {         
            for (var i = 0; i < response.data.length; i++) {
                 cdata.category.push(response.data[i].xy);
                 cdata.lineData.push(response.data[i].cd);
            }
          }
        );
    }

解决方案——来自@小P聊技术的回答

你如果是不要刷新效果,正常他会有过渡动画的。可以加这个配置:animation 是否开启动画。一般不做设置。

animation: true, 默认为true,如果设置了false,那么刷新的时候不会有动画效果,另外这个只要是bool值就行。
比如: animation: 1>=1, —> true, || animation: 1<1, —> false,option里面

option = {
 
animation:false
 
}
 
if (option && typeof option === 'object') {
    myChart.setOption(option);
}

本题更多回答戳链接:https://ask.csdn.net/questions/7448105


7、原生js页面内点击导航按钮跳转到指定位置,为什么实现不了?

问题描述:

原生js页面内点击导航按钮跳转到指定位置,为什么实现不了?,代码如下:

(function(){
	var productUl = document.getElementById("product_ul");
	var productLi = productUl.getElementsByTagName("li");
	var listul = document.getElementById("productUl");
	var listli = listul.getElementsByTagName("li");
	var pheight = document.getElementById("product_product");
		function productDh(dj){
			for(var i=0;i<productLi.length;i++){
				productLi[i].className = "";
				}
				productLi[dj].className = "producton";
				
			}
		for(var j=0;j<productLi.length;j++){
			productLi[j].index = j;
			productLi[j].onclick = function(){
				productDh(this.index);
				}
			}
		/*
            *循环每个导航按钮,添加监听点击事件,点击跳转到相应的位置,为什么实现不了,
            *我想把a的值根据productLi[i]点击哪一个跳转到相应的listli[j].offsetTop - h
        */	
		for(var i=0;i<productLi.length;i++){
			var h = pheight.offsetHeight;
			productLi[i].addEventListener("click",function(){	
				for(var j=0;j<listli.length;j++){
					var a = listli[j].offsetTop - h;
					console.log(a);//这里控制台都能输出每一项
					window.scrollTo(0,a);//这里就接收不了a里面的数值
					}
				});
			}
		}());

解决方案——来自@CSDN专家-showbo的回答

你这个代码是跳转到最后的listli所在位置了,应该改成下面这样:

 for (var i = 0; i < productLi.length; i++) {
            productLi[i].addEventListener("click", function () {
var h = pheight.offsetHeight;//放里面来,防止页面resize过


                var i = this.index;//this为当前点击的li,获取你上一次for循环设置的index property

                var a = listli[i].offsetTop - h;
                console.log(a);//这里控制台都能输出每一项
                window.scrollTo(0, a);//这里就接收不了a里面的数值

            });
        }

 

本题更多回答戳链接:https://ask.csdn.net/questions/7450770

以上是关于CSDN问答——精选问答Vol.6的主要内容,如果未能解决你的问题,请参考以下文章

CSDN问答——精选问答Vol.8

CSDN问答——精选问答Vol.7

CSDN问答——精选问答Vol.9

CSDN问答——精选问答Vol.11

CSDN问答——精选问答Vol.4

CSDN问答——精选问答Vol.5