美文网首页
phantomjs不支持获取vue动态创建的dom,如vue中的

phantomjs不支持获取vue动态创建的dom,如vue中的

作者: 愤怒的阿昆达 | 来源:发表于2020-06-11 10:22 被阅读0次
需求:

现有一个集合对象,想用v-for在html中显示出来,显示的内容是一个个的div,需要给div赋值动态的id,然后在使用echart获取到对应的div初始化渲染出来一个个的图表。
如:

<template>
    <div class="App">

        <div v-for="(hangdao,index) in yingli.hangDaoList">
           <div :id='generateYLId("yuntu",index)' ref='generateYLId("yuntu",index)'></div>
        </div>

    </div>
</template>

<script>
    export default {
      name: "App",
      created(){
        console.log('created');
      },
      data () {
        return {
          hangDaoList: [{}, {}]
        }
      },
      methods: {
        generateYLId(type,index){
          if(type=='yuntu')
            return 'yingliyuntu_'+index;
          else if(type=='cedian')
            return 'yinglicediantu_'+index;
        },
        loadYingli(){
          let vue = this;
          let totalHeight = 935;//屏幕总高度
          let yingliSize = vue.hangDaoList.length;
          let yuntuChartArr = [];
          let cediantuChartArr = [];

          //设置高度
          let yinglidiv = vue.$refs['generateYLId("cedian",index)'];
          for(let i=0;i<yinglidiv.length;i++){
            yinglidiv[i].style.height = totalHeight/(yingliSize*2)+"px";
          }
          
          for(let i=0;i<vue.hangDaoList.length;i++){
            let a = document.getElementById('yingliyuntu_'+i);
            let b = document.getElementById('yinglicediantu_'+i);
            //初始化echart容器
            yuntuChartArr.push(vue.$echarts.init(a));
            cediantuChartArr.push(vue.$echarts.init(b));
            //生成echarts
            generateChart(yuntuChartArr[i],cediantuChartArr[i],vue.hangDaoList[i]);
          }
          function generateChart(a,b,c){
            //...
          }
        },
        async mounted() {
          this.loadYingli();
        }
        
      }//end method
      
    }//end export
</script>
现象:

代码写完后,在谷歌浏览器测试是没问题的,按照list生成若干个echart图,如图:

image.png
但在phantomjs中执行时,报错:
error:null is ...(f.style)
反正就是f为null,有时报undefined,其实就是vue.$refs['generateYLId("cedian",index)']这个东西读到的是null,后来用document.getElementById('yingliyuntu_'+i);也是读不到的。
解决:

既然vue的v-for动态生成的div元素在phantom里执行不了,那就用原生的js写试试吧,下面是主要改动部分,后面会贴全的代码:

<div id="divYingli" ref="divYingli"></div>
...
...
let divYingli = vue.$refs['divYingli'];//非动态生成的是可以正常获取的
...
...
for(let i=0;i<vue.hangDaoList.length;i++){
            createSubDiv(divYingli,i);//原生js动态创建div,不能用vue的v-for动态创建,否则在phantomjs中无法解析。
            let a = document.getElementById('yingliyuntu_'+i);
            let b = document.getElementById('yinglicediantu_'+i);
            //设置高度
            a.style.height = totalHeight/(yingliSize*2)+"px";
            b.style.height = totalHeight/(yingliSize*2)+"px";
            //初始化echart容器
            yuntuChartArr.push(vue.$echarts.init(a));
            cediantuChartArr.push(vue.$echarts.init(b));
            //生成echarts
            generateChart(yuntuChartArr[i],cediantuChartArr[i],vue.hangDaoList[i]);
}

完整改动部分:

<template>
  <div class="App">

    <div id="divYingli" ref="divYingli">
<!--      <div v-for="(hangdao,index) in yingli.hangDaoList">-->
<!--        <div :id='generateYLId("yuntu",index)' ref='generateYLId("cedian",index)'></div>-->
<!--        <div :id='generateYLId("cedian",index)' ref='generateYLId("cedian",index)'></div>-->
<!--      </div>-->
    </div>

  </div>
</template>

export default {
      name: "App",
      created(){
        console.log('created');
      },
      data () {
        return {
          hangDaoList: [{}, {}, {}]
        }
      },
      methods: {
        /*generateYLId(type,index){
          if(type=='yuntu')
            return 'yingliyuntu_'+index;
          else if(type=='cedian')
            return 'yinglicediantu_'+index;
        },*/
        loadYingli(){
          let vue = this;
          let totalHeight = 935;//屏幕总高度
          let yingliSize = vue.hangDaoList.length;
          let yuntuChartArr = [];
          let cediantuChartArr = [];

          //设置高度
          // let yinglidiv = vue.$refs['generateYLId("cedian",index)'];
          // for(let i=0;i<yinglidiv.length;i++){
          //   yinglidiv[i].style.height = totalHeight/(yingliSize*2)+"px";
          // }

          let divYingli = vue.$refs['divYingli'];//非动态生成的是可以正常获取的
          for(let i=0;i<vue.hangDaoList.length;i++){
            //原生js动态创建div,不能用vue的v-for动态创建,否则在phantomjs中无法解析。
            createSubDiv(divYingli,i);
            let a = document.getElementById('yingliyuntu_'+i);
            let b = document.getElementById('yinglicediantu_'+i);
            //设置高度
            a.style.height = totalHeight/(yingliSize*2)+"px";
            b.style.height = totalHeight/(yingliSize*2)+"px";
            //初始化echart容器
            yuntuChartArr.push(vue.$echarts.init(a));
            cediantuChartArr.push(vue.$echarts.init(b));
            //生成echarts
            generateChart(yuntuChartArr[i],cediantuChartArr[i],vue.hangDaoList[i]);
          }

          function createSubDiv(obj,index){
            //添加div ,存放指标名称
            var div1 = document.createElement("div");
            div1.setAttribute('height',totalHeight/(yingliSize*2)+"px");
            div1.setAttribute('id','yingliyuntu_'+index);
            obj.appendChild(div1);
            //添加div ,存放指标名称
            var div2 = document.createElement("div");
            div2.setAttribute('height',totalHeight/(yingliSize*2)+"px");
            div2.setAttribute('id','yinglicediantu_'+index);
            obj.appendChild(div2);
          }
          function generateChart(a,b,c){
            //...
          }
        },
        async mounted() {
          this.loadYingli();
        }

      }//end method

    }//end export

相关文章

网友评论

      本文标题:phantomjs不支持获取vue动态创建的dom,如vue中的

      本文链接:https://www.haomeiwen.com/subject/iuvvtktx.html