Greasy Fork

网页弹窗无障碍化

为视障人士设计,解决在网页中点击出现弹窗后难聚焦到弹窗、弹窗中内容不可访问的问题。

// ==UserScript==
// @name         网页弹窗无障碍化
// @version      0.6
// @description  为视障人士设计,解决在网页中点击出现弹窗后难聚焦到弹窗、弹窗中内容不可访问的问题。
// @author       You
// @match        *
// @match        */*
// @match        */*/*
// @match        */*/*/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @require      https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js
// @license      Mozilla Public License 1.1
// @namespace https://greasyfork.org/users/961092
// ==/UserScript==

'use strict';
this.$ = this.jQuery = jQuery.noConflict(true);
var nowpop;//当前弹窗
function Clickcan(element){//该元素下是否有可点击元素
    let stack= [];
    stack.push(element);
   while(stack.length!=0){
		let temp = stack.pop();
        if(clickableele(temp) && temp.target!='_blank' ){
                return true;
        }
     let stackson = [];
		stackson = Array.from(temp.children);//伪数组数组化
		if(stackson.length==0){
			continue;
		}else{
		for(let i=stackson.length-1;i>-1;i--){
			stack.push(stackson[i]);
		  }
		}
    }
	return false;
}
function buclick(element){
    if(element.tagName!='P'&&element.target!='_blank'&&!Belongfa(element,nowpop)){
        return true;
    }else{
    return false;
    }

}//只要不是链接到外面,里面只要有东西非p都加上
function SomethingIn(element){
    if(element.tagName=='SVG'||typeof element=='undefined'||typeof element.innerText=='undefined'){
        return false;
    }
    if(element.innerText.length>0 || window.getComputedStyle(element).backgroundImage.indexOf('url')!=-1
      ){
        return true;
    }else{
        return false;
    }

}
function Sonnotfather(element) {//除该元素外其子元素无其他元素满足条件
	let stack= [];
    stack.push(element);
    while(stack.length!=0){
		let temp = stack.pop();
		if(temp != element){
			if(typeof temp!='undefined'&&clickableele(temp)&& temp.target != '_blank' && SomethingIn(temp)){
				return false;
			}
            if(temp.tagName=='A' && temp.target!='_blank'&&!Belongfa(temp,nowpop)){
                    return false;
            }
            if(temp.tagName=='BUTTON' && temp.target!='_blank'&&!Belongfa(temp,nowpop)){
                    return false;
            }
            if(buclick(temp)){
                return false;
            }
		}
        let stackson = [];
		stackson = Array.from(temp.children);//伪数组数组化
		if(stackson.length==0){
			continue;
		}else{
		for(let i=stackson.length-1;i>-1;i--){
			stack.push(stackson[i]);
		  }
		}
    }
	return true;
}
function runtest(element){//可能的元素添加事件
    console.log('当前nowpop为:')
    console.log(nowpop)
    let stack= [];
    stack.push(element);
   while(stack.length!=0){
		let temp = stack.pop();
        if(typeof temp!='undefined'&&temp.tagName!='SVG'&&clickableele(temp) && temp.target!='_blank' && SomethingIn(temp)&&!Belongfa(temp,nowpop)){
			if(Sonnotfather(temp)){
                temp.removeEventListener("click", delaypop)
				temp.addEventListener("click", delaypop)
				//console.log(temp);
			}
		}else if(temp.tagName=='A' && temp.target!='_blank'&&!Belongfa(temp,nowpop)){
			if(Sonnotfather(temp)){
                temp.removeEventListener("click", delaypop)
				temp.addEventListener("click", delaypop)
				//console.log(temp);
			}
		}else if(temp.tagName=='BUTTON' && temp.target!='_blank'&&!Belongfa(temp,nowpop)){
			if(Sonnotfather(temp)){
                temp.removeEventListener("click", delaypop)
				temp.addEventListener("click", delaypop)
				//console.log(temp);
			}
        }else if(temp.tagName!='SVG'&&buclick(temp)){
            if(Sonnotfather(temp)){
                temp.removeEventListener("click", delaypop)
				temp.addEventListener("click", delaypop)
          }
        }
     let stackson = [];
		stackson = Array.from(temp.children);//伪数组数组化
		if(stackson.length==0){
			continue;
		}else{
		for(let i=stackson.length-1;i>-1;i--){
			stack.push(stackson[i]);
		  }
		}
    }
    console.log('已更新可能元素')
}
function delaypop(){
    window.setTimeout(popupisnot,1000);
}

function addfuncprint(elements) {
	for(let ele of elements){
		ele.addEventListener("click", () => {
			console.log(ele);
		})
	}
}
function sleep(callback, time) {
    if (typeof callback == "function") {
        setTimeout(callback, time);
    }
}
//以上是运行前的准备









function popupisnot(){//弹窗处理模块
var presuccessclassName = '';
var modalele = null;
var presuccess;
var maskelestack = [];
//判断过的遮罩层集合(但由于元素消失后无法获得element,故改为存储类名)
var modalelestack = [];
//已经取过的弹窗元素集合(但由于元素消失后无法获得element,故改为存储类名)
var multimodalstack = [];
//遮罩层和弹窗元素的合并集合(但由于元素消失后无法获得element,故改为存储类名)

function sleep(callback, time) {
    if (typeof callback == "function") {
        setTimeout(callback, time);
    }
}
function Ifrmodal(){
    function GetModal(ele) {
            function getSize(ele) {
            //判断元素的大小,长*宽
            if(window.getComputedStyle(ele).display == 'none'
               ||window.getComputedStyle(ele).display == 'hidden' ){
                return 0;
            }
            var rect = ele.getBoundingClientRect();
            var top = document.documentElement.clientTop;
            var left = document.documentElement.clientLeft;
            let top0 = rect.top - top;
            let bottom0 = rect.bottom - top;
            let left0 = rect.left - left;
            let right0 = rect.right - left;
            if((bottom0 - top0) * (right0 - left0)==0 && ele.children.length!=0){
                let allson = Array.from(ele.children);
                let sum = 0;
                for(let i=0;i<allson.length;i++){
                    sum+=getSize(allson[i]);
                }
                return sum;
            }else{
                return (bottom0 - top0) * (right0 - left0);
            }
        }
            function blackable(ele) {
            //判断是否满足是遮罩层条件的,主要是获取RGB值,各个位置应该取值范围
            let groundcolor = window.getComputedStyle(ele).backgroundColor;
            let rrrggbb = groundcolor.split('(')[0];
            //获取字符串元素进行比较,背景色只有两种形式
            let mayequal = false;
            if (rrrggbb == 'rgb') {
                let firststr = groundcolor.split('(')[1].split(',')[0];
                let secondstr = groundcolor.split('(')[1].split(',')[1];
                let thirdstr = groundcolor.split('(')[1].split(',')[2].split(')')[0];
                let first = parseInt(firststr.trim());
                let second = parseInt(secondstr.trim());
                let third = parseInt(thirdstr.trim());
                mayequal = (first - second > -6) && (first - second < 6) && (first - third > -6) && (first - third < 6);
                if (mayequal && first < 111) {
                    return true;
                } else if (first < 25 && second < 25 && third < 25) {
                    return true;
                } else {
                    return false;
                }
            } else if (rrrggbb == 'rgba') {
                //四个位置对应四个数字
                let firststr = groundcolor.split('(')[1].split(',')[0];
                let secondstr = groundcolor.split('(')[1].split(',')[1];
                let thirdstr = groundcolor.split('(')[1].split(',')[2];
                let fourthstr = groundcolor.split('(')[1].split(',')[3].split(')')[0];
                let first = parseInt(firststr.trim());
                let second = parseInt(secondstr.trim());
                let third = parseInt(thirdstr.trim());
                let fourth = Number(fourthstr.trim());
                if (first < 40 && second < 40 && third < 40 && fourth > 0 && fourth < 0.9) {
                    return true;
                } else {
                    return false
                }
            }
            console.log(groundcolor)
            console.log(rrrggbb)
            return false;

        }
        function Notcomplexin(element) {//遮罩层是不复杂的
            if(element.querySelector('a') ==null &&
               element.querySelector('video')==null && element.querySelector('script') ==null){
                return true;
            }else{
                return false;
            }
        }
        function ChilddivNum(ele) {//含有div标签数量
            if(ele.children.length ==0){
                return 0;
            }
            let childstack= [];
            childstack = Array.from(ele.children);
            let sumnum = 0;
            for(let i=0;i<childstack.length;i++){
                sumnum+=ChilddivNum(childstack[i]);
            }
            if(ele.tagName == 'DIV'){
                return 1+sumnum;
            }else{
                return sumnum;
            }
        }
        function modalneed(element){//可能是弹窗需要的条件
            if(ChilddivNum(element)>5||element.querySelector('table')!=null||element.querySelector('iframe')!=null){
               return true;
               }
            return false;
        }
        function CanUseele(element){
           let allson = Array.from(element.children);
           let simple = false;
           for(let i=0;i<allson.length;i++){
               if(window.getComputedStyle(allson[i]).display == 'block' ){
                   simple = true;
                  }
                if(allson[i].tagName == 'IFRAME'){
                    simple =true;
                }
           }
           return simple;
        }
        let stack = [];
        //辅助栈,存储元素,实现DFS
        let isis = 0;
        //是否有遮罩层出现
        let zindex = 99999999;
        //记录遮罩层的Zindex
        let zindexmax = 0;
        //页面中具有最大zindex 的值
        let zindexmaxstack = [0,0,0,0,0];
        //页面中具有最大zindexindex的集合
        let maybesize = 0;
        //可能是弹窗的尺寸
        let maybeele;
        //可能是弹窗的元素
        let must = 0;
        //是否已出现弹窗元素
        let premaybe;
        //在遮罩之前最大ZIndex的元素
        let premaybestack = [];
        //在遮罩之前最大ZIndex的元素集合
        let preverymaybestack = [];
        //在遮罩之前的且符合条件的
        let aftverymaybestack = [];
        //在遮罩后且符合条件的,进行对比
        let initmaystack = [];
        //在遮罩层深处的可能弹窗
        let masksize;
        //mask的尺寸
        stack.push(ele);
        while (stack.length != 0) {
            let temp = stack.pop();
            //深度优先,在DOM树里是DIV标签元素以及在显示状态的元素是可能的目标
            let simple = false;
            if(typeof temp == 'undefined'){
                continue;
            }
            if (window.getComputedStyle(temp).display == 'none'
                || temp.tagName != 'DIV' || window.getComputedStyle(temp).display == 'hidden'
               ) {
                if (temp.tagName != 'BODY'&&temp.tagName != 'TABLE') {
                    //筛选DIV
                    continue;
                }
            }
            if (maskelestack.length != 0 || modalelestack.length != 0) {
               // console.log('mask里有');
             //   console.log(maskelestack.length);
              //  console.log('modal里有');
             //   console.log(modalelestack.length);
                for (let i = 0; i < maskelestack.length; i++) { //筛选已经判断过的(但公用就判断不出了)
                    if(typeof maskelestack[i]=='object'){
                        if (temp == maskelestack[i]) {
                        simple = true;
                        }
                    }
                    if(typeof maskelestack[i]=='string'){
                        if (temp.className == maskelestack[i]) {
                        simple = true;
                        }
                    }
                }
                for (let i = 0; i < modalelestack.length; i++) {
                    if(typeof modalelestack[i]=='object'){
                        if (temp == modalelestack[i]) {
                        simple = true;
                        }
                    }
                    if(typeof modalelestack[i]=='string'){
                        if (temp.className == modalelestack[i]) {
                        simple = true;
                        }
                    }
            }
        }//现在没加进去的内容
            if(maskelestack.length==0){//遮罩层出来前的记录
                let i=0;
                if(premaybestack.length<5){
                    i =premaybestack.length;
                }
                for(i;i<5;i++){
                    if (parseInt(window.getComputedStyle(temp).zIndex) > zindexmaxstack[i]
                        && CanUseele(temp)) {


                    //将当前为显示状态的DIV元素的最大Zindex值记录
                    zindexmaxstack[i] = parseInt(window.getComputedStyle(temp).zIndex);
                    //并存储元素值,防止错过弹窗DIV
                        if(premaybestack.length<5){
                            premaybestack.push(temp);
                            break;
                        }else{
                            premaybestack[i] = temp;
                            break;
                        }
                    }
                }
            }
            if (blackable(temp) && (getSize(temp) > 64000) &&
                window.getComputedStyle(temp).top == '0px'&&parseInt(window.getComputedStyle(temp).zIndex)>0) {
                if(ChilddivNum(temp)>5||Notcomplexin(temp)){//里面要么啥也没有,要么含个弹窗
                    isis++;
                zindex = parseInt(window.getComputedStyle(temp).zIndex);
                masksize = getSize(temp);
                console.log('遮罩层:');
                console.log(temp);
                if(temp.className == ''){
                    maskelestack.push(temp);
                }else{
                    maskelestack.push(temp.className);
                }
                if(ChilddivNum(temp)>5){
                    let sonofit = Array.from(temp.children);
                    for(let i=0;i<sonofit.length;i++){
                        if(ChilddivNum(sonofit[i])>5){
                            initmaystack.push(sonofit[i]);
                        }
                    }
                    let max1 = 0;
                    let maxsize = getSize(initmaystack[0]);
                    for (let i = 0; i < initmaystack.length; i++) {
                         if(getSize(initmaystack[i])>maxsize){
                            maxsize = getSize(initmaystack[i]);
                            max1 = i;
                        }
                    }
                    modalele = initmaystack[max1];
                    modalelestack.push(modalele);
                    console.log('弹窗与遮罩在一起');
                    must ++;
                }
                for(let i=0;i<premaybestack.length;i++){
                    if (zindexmaxstack[i] > zindex &&
                        zindexmaxstack[i]< 100*zindex&&modalneed(premaybestack[i])) {
                    //遮罩层前的元素有比遮罩层zindex大一倍以内的就说明是弹窗,并在这里记录
                    //console.log('弹窗元素就是:');
                    //  console.log(premaybe);
                    preverymaybestack.push(premaybestack[i]);
                    }
                }//预先可能是弹窗的集合
              }
                //符合条件的是遮罩层
            }
            if (window.getComputedStyle(temp).zIndex != 'auto') {
                //筛选比遮罩zindex大的元素
                let tempindex = parseInt(window.getComputedStyle(temp).zIndex);
                if (tempindex > zindex && tempindex<100*zindex&&modalneed(temp)) {
                    //console.log('弹窗元素就是:');
                    //console.log(temp);
                    aftverymaybestack.push(temp);
                }else if (getSize(temp) > maybesize && tempindex > 0 &&modalneed(temp)) {
                    //没有zindex更大弹窗时,记录显示的最大元素
                    if(maskelestack.length != 0){
                            if(temp== maskelestack[0] || temp.className == maskelestack[0].className||getSize(temp) == masksize){
                                //直接跳过
                            }else{
                                   maybesize = getSize(temp);
                                   maybeele = temp;
                            }
                    }
                }
            }
            let stackson = [];
            stackson = Array.from(temp.children);
            //伪数组数组化
            if (stackson.length == 0) {
                continue;
            } else {
                for (let i = stackson.length - 1; i > -1; i--) {
                    stack.push(stackson[i]);
                }
            }
        }
        if(preverymaybestack.length + aftverymaybestack.length!=0){//开始分析zindex符合要求的哪个是弹窗

                    if(preverymaybestack.length!= 0){
                        console.log("预先的有东西")
                        let max1 = 0;
                        let max2 = 99;
                        let maxsize = getSize(preverymaybestack[0]);
                        for (let i = 0; i < preverymaybestack.length; i++) {
                          if(getSize(preverymaybestack[i])>maxsize){
                             maxsize = getSize(preverymaybestack[i]);
                             max1 = i;
                        }
                      }
                        for(let i=0;i<aftverymaybestack.length;i++){
                            if(getSize(aftverymaybestack[i])>maxsize){
                             maxsize = getSize(aftverymaybestack[i]);
                             max2 = i;
                        }
                      }
                      if(max2==99){//没变说明预先里是最大的
                            modalele = preverymaybestack[max1];
                            console.log('预先里的被输出')
                      }else{
                          modalele = aftverymaybestack[max2];
                          console.log('其后里的被输出')
                      }
                      if(modalele.className == ''){//都经过的输出
                        modalelestack.push(modalele);
                        }else{
                            modalelestack.push(modalele.className);
                        }
                        console.log(modalele)
                        must ++;
                    }else{
                        console.log("后面的有东西")
                        let max2 = 0;
                        let maxsize = getSize(aftverymaybestack[0]);
                        for(let i=0;i<aftverymaybestack.length;i++){
                            if(getSize(aftverymaybestack[i])>maxsize){
                             maxsize = getSize(aftverymaybestack[i]);
                             max2 = i;
                          }
                        }
                        modalele = aftverymaybestack[max2];
                        if(modalele.className == ''){//都经过的输出
                            modalelestack.push(modalele);
                        }else{
                            modalelestack.push(modalele.className);
                        }
                        console.log(modalele);
                        console.log('2');
                        must ++;
                    }
        }
        if (modalelestack.length == 0&&maskelestack.length !=0) {
            if(typeof maybeele == 'undefined'){
                console.log('没找到配套弹窗')
            }else{
                //当有遮罩层时
                //不是第一种情况就只能是最大的了
                //console.log('可能弹窗元素就是:');
                // console.log(maybeele);
                modalele = maybeele;
                if(modalele.className == ''){
                        modalelestack.push(modalele);
                }else{
                        modalelestack.push(modalele.className);
                     }
                console.log(modalele)
                console.log('选的最大的被输出')
            }
        }
    }
    //主函数结束

    GetModal(document.querySelector('body'));
    try {
        for (let o = 0; o < frames.length; o++) {
            //其他frame里会有可能有遮罩层
            GetModal(window.frames[o].document.querySelector('body'));
        }
    } catch (e) {
        console.log(e.message);
    }
}//Ifrmodal函数结束



Ifrmodal();
console.log('遮罩层的数量:');
console.log(maskelestack.length);
for (let i = 0; i < maskelestack.length; i++) {
    console.log(i+1);
    if(typeof maskelestack[i]=='object'){
        console.log(maskelestack[i]);
                    }
    if(typeof maskelestack[i]=='string'){
        console.log(document.querySelector('.'+maskelestack[i].split(' ')[0]));
                    }
    multimodalstack.push(maskelestack[i]);//加到总的集合中
}
console.log('弹窗层的数量:')
console.log(modalelestack.length);
for (let i = 0; i < maskelestack.length; i++) {
    console.log(i+1);
    if(typeof modalelestack[i]=='object'){
        console.log(modalelestack[i]);
		insideallshould(modalelestack[i])
        modalelestack[i].focus()
		nowpop = modalelestack[i];
                    }
    if(typeof modalelestack[i]=='string'){
        console.log(document.querySelector('.'+modalelestack[i].split(' ')[0]));
		insideallshould(document.querySelector('.'+modalelestack[i].split(' ')[0]))
        document.querySelector('.'+modalelestack[i].split(' ')[0]).focus();
        nowpop = document.querySelector('.'+modalelestack[i].split(' ')[0]);
                    }
    multimodalstack.push(modalelestack[i]);//加入总集
}
//window.alert(multimodalstack.length);
}








function getnowfocus() {//获得当前具有焦点的元素
    return document.activeElement;
}

function Belongfa(ele1,ele2) {//两个元素之间是否有从属关系,先儿子后爹
    if(ele1 == null&& ele2==null) return false;
    if(typeof ele1!="object" ||typeof ele2!="object"){
        return false;
    }
    var temp1 = ele1;
    var temp2 = ele2;
    while (temp1 != document.body){
        if(temp1 == ele2){
            return true;
        }else{
            temp1 = temp1.parentElement;
        }
    }

    return false;
}


function attentionfocus() {//获得焦点
    function getnowfocus() {
    console.log(document.activeElement);
    }
    var t =setInterval(getnowfocus,500);
    function stopfocus() {
    clearInterval(t);
    }
}

function addfocusable(element) {//使元素可能被聚焦
    if(element.tabIndex>"-1"){
        console.log(element.tabIndex);
    }else{
        element.tabIndex = '0';
        console.log('已经更改为:')
        console.log(element.tabIndex);
    }
}




function Sonword(element) {//是否所有元素含字,且长度小于总体大小

        let stackson = [];
        let sum = 0;
		stackson = Array.from(element.children);//伪数组数组化
        if(stackson.length ==0||typeof element.innerText != 'string'){
            return false;
        }
        if(typeof element.value == 'string'){
        var reg = new RegExp(' ','g');//去除可能产生的无效字符
        var reg2 = new RegExp('\n','g');
        var word = (element.innerText + element.value).replace(reg,"").replace(reg2,"");
        sum = word.length;
        }else{
            var reg1 = new RegExp(' ','g');
            var reg12 = new RegExp('\n','g');
            var word1 = (element.innerText).replace(reg1,"").replace(reg12,"");
            sum = word1.length;
        }
        let sonsum = 0;
        if( sum != 0){
    		  for(let i=stackson.length-1;i>-1;i--){
                if(typeof stackson[i].value == 'string'&& typeof stackson[i].innerText == 'string'){
                  sonsum += (stackson[i].innerText + stackson[i].value).length;
                }else if(typeof stackson[i].innerText == 'string'){
                  sonsum += stackson[i].innerText.length;
                  }else if(typeof stackson[i].value == 'string'){
                       sonsum += stackson[i].value.length;
                  }else{
                      continue;
                  }
          }
	   }
       return sum>sonsum;
}


function insideallshould(element){//元素内按理应可聚焦元素
    element.tabIndex = 0;
    let stack= [];
    let waitstack =[];//等待可聚焦的集合
    let istack = [];//I标签的集合
    stack.push(element);
   while(stack.length!=0){
	 let temp = stack.pop();
     let may = false;
     let stackson = [];
	 stackson = Array.from(temp.children);//伪数组数组化
       if(stackson.length>1){
           for(let i=stackson.length-1;i>-1;i--){
			if(stackson[i].tagName == "LABEL"){
                may = true;
            }
		  }
       }
     if((Sonword(temp)&&Sonnotfatherword(temp))||(may)){//让连续的文字元素块可聚焦
            if(typeof temp.value == 'string'){
           if(temp.type != 'hidden'){
              if((temp.innerText + temp.value).length != 0){
              console.log(temp)
              console.log(temp.tabIndex)
              temp.tabIndex = 0;
              }
           }
          }else{
           if(temp.innerText.length != 0){
              console.log(temp)
              console.log(temp.tabIndex)
              temp.tabIndex = 0;
           }
        }
       }else if(simplewordele(temp) && temp.parentElement.tabIndex!=0&&temp.tagName!='LABEL'){//让单独文字块就可聚焦
           console.log(temp)
           console.log(temp.tabIndex)
           temp.tabIndex = 0;
       }
       if( temp.tagName!="P"&&temp.target!='_blank'
                &&typeof temp.innerText=='string'&& temp.innerText.length <2
          && (window.getComputedStyle(temp).background).indexOf('url') != -1){//让“x”部件可聚焦
         //这里要求要可点击元素,但暂时没有可用的,因此用差的方法
            temp.tabIndex = 0;
            waitstack.push(temp);
            console.log(temp)
            temp.ariaLabel = "可点击 图标";
        }
       if(temp.tagName=="I"){
		   istack.push(temp);
           console.log(temp)
	    }

		if(stackson.length==0){
			continue;
		}else{
		for(let i=stackson.length-1;i>-1;i--){
			stack.push(stackson[i]);
		  }
		}
   }
    let tempx = -100;
    let tempy = 9999;
    let maybeclose;
    if(waitstack.length==1){
        maybeclose = waitstack[0];
    }
    if (waitstack.length == 0 && istack.length!=0){//一般的情况不满足,就找i图标的
        console.log('i图标')
		for(let i=0;i<istack.length;i++){
		console.log(istack[i])
		     if(tempx-tempy > istack[i].getBoundingClientRect().x-istack[i].getBoundingClientRect().y){
		        continue;
		    }else {
	        tempx = istack[i].getBoundingClientRect().x;
	        tempy = istack[i].getBoundingClientRect().y;
	        maybeclose = istack[i];
		    }
		}
	}else if (waitstack.length != 0){//一般情况
        console.log('一般情况')
		for(let i=0;i<waitstack.length;i++){
		console.log(waitstack[i])
	     if(tempx-tempy > waitstack[i].getBoundingClientRect().x-waitstack[i].getBoundingClientRect().y){
	        continue;
	    }else {
	        tempx = waitstack[i].getBoundingClientRect().x;
	        tempy = waitstack[i].getBoundingClientRect().y;
	        maybeclose = waitstack[i];
	    }
	  }
	}else if(waitstack.length+ istack.length == 0){//所有情况都不是的话,就找右上角
        console.log('右上角')
		 let stack =[];
		let tempx = -100;
       let tempy = 9999;
		let rightestele;
		 stack.push(element);
    while(stack.length!=0){
		let temp = stack.pop();
       	   if(tempx-tempy > temp.getBoundingClientRect().x-temp.getBoundingClientRect().y){
	       }else {
	        tempx = temp.getBoundingClientRect().x;
	        tempy = temp.getBoundingClientRect().y;
	        rightestele = temp;
	    }
     let stackson = [];
		stackson = Array.from(temp.children);//伪数组数组化
		if(stackson.length==0){
			continue;
		}else{
		for(let i=stackson.length-1;i>-1;i--){
			stack.push(stackson[i]);
		  }
		}
      }
		maybeclose = rightestele;
	}

    console.log(maybeclose);
    console.log("关闭弹窗");
    maybeclose.ariaLabel = "关闭弹窗";
}

function Sonnotfatherword(element) {//其子元素无其他元素满足条件(子元素含字,但子元素长度小于总长度)
	let stack= [];
    stack.push(element);
    while(stack.length!=0){
		let temp = stack.pop();
		if(temp != element){
			if(Sonword(temp)){
				return false;
			}
		}
        let stackson = [];
		stackson = Array.from(temp.children);//伪数组数组化
		if(stackson.length==0){
			continue;
		}else{
		for(let i=stackson.length-1;i>-1;i--){
			stack.push(stackson[i]);
		  }
		}
    }
	return true;
}
function clickableele(ele){
    return eleisclick(ele)||anotherclick(ele)
}
function anotherclick(ele){
	if(typeof $._data(ele,"events")!='undefined'&& $._data(ele,"events").click!=null){
		return true;
	}else if(typeof $(ele).data("events")!='undefined'&& $(ele).data("events").click!=null){
        return true;
    }else{
		return false;
	}

}

function eleisclick(ele) {
	if(ele.onclick!=null){
		return true;
	}
	if(typeof ele.href!= 'undefined'&& typeof ele.target!= 'undefined'){
		return true;
	}
	return false;
}

function simplewordele(ele) {//含字元素且是单独元素无孩子节点
    if(typeof ele.innerText!='string'){
        return false;
    }
    if(ele.innerText.length !=0 && ele.children.length == 0){
        return true;
    }else{
        return false;
    }
}
function computeLPSArray(pattern) {
  const m = pattern.length;
  const lps = Array(m).fill(0);

  let len = 0;
  let i = 1;
  while (i < m) {
    if (pattern[i] === pattern[len]) {
      len++;
      lps[i] = len;
      i++;
    } else {
      if (len !== 0) {
        len = lps[len - 1];
      } else {
        lps[i] = 0;
        i++;
      }
    }
  }

  return lps;
}

function KMPSearch(text, pattern) {//KMP文本匹配
  const n = text.length;
  const m = pattern.length;

  const lps = computeLPSArray(pattern);

  let i = 0;
  let j = 0;
  while (i < n) {
    if (pattern[j] === text[i]) {
      i++;
      j++;
    }

    if (j === m) {
      return i - j;
    } else if (i < n && pattern[j] !== text[i]) {
      if (j !== 0) {
        j = lps[j - 1];
      } else {
        i++;
      }
    }
  }

  return -1;
}


function run(){
    runtest(document.querySelector('body'));
}
//到弹窗检测模块是弹窗后续处理模块


window.onload = function(){
   setInterval(run,1200);//运行程序
}