当前位置: 首页 > news >正文

网站批量发布互联网广告公司

网站批量发布,互联网广告公司,莱芜都市网电话客服,wordpress 文章页404对于这个小巧的函数系列的第八篇文章,我将介绍一个名为ancestor()的函数。 顾名思义,此功能根据标签名称和/或类匹配获得对给定节点祖先的引用。 这是ancestor()函数的代码: function ancestor(node, match) {if(!node){return null;}else if…

对于这个小巧的函数系列的第八篇文章,我将介绍一个名为ancestor()的函数。 顾名思义,此功能根据标签名称和/或类匹配获得对给定节点祖先的引用。

这是ancestor()函数的代码:

function ancestor(node, match)
{if(!node){return null;}else if(!node.nodeType || typeof(match) != 'string'){return node;}if((match = match.split('.')).length === 1){match.push(null);}else if(!match[0]){match[0] = null;}do{if((!match[0]||match[0].toLowerCase() == node.nodeName.toLowerCase())&&(!match[1]||new RegExp('( |^)(' + match[1] + ')( |$)').test(node.className))){break;}}while(node = node.parentNode);return node;
}

第一个参数是对原始节点的引用-可以是任何种类的DOM节点,但通常是一个元素。 第二个参数是一个字符串,用于标识祖先-作为简单的标记名(如"ul" )或类选择器(如".menu" )或二者的组合(如"ul.menu" 。 该函数将从原始节点向上迭代,并返回与字符串模式匹配的第一个祖先节点;如果找不到此类祖先,则返回null

函数的作用是什么

此功能最常见的用例是在事件处理代码中-识别事件目标中的包含元素,而不必知道其间还有其他节点。 也许我们甚至都不知道祖先是什么类型的元素。 ancestor()函数通过针对我们拥有的任何信息迭代检查父节点来处理此问题。

例如,假设我们将focus事件绑定到一组菜单链接上,而处理程序代码则需要获取对包含列表项的引用。 动态菜单通常需要在它们支持的标记类型上非常灵活,不仅要考虑简单的项目,例如:

<li><a>...</a>
</li>

而且还有更复杂的项目,添加了用于额外语义或样式钩子的其他元素:

<li><h3><span><a>...</a></span></h3>
</li>

将添加JavaScript来处理链接focus事件(由于焦点事件不会冒泡 ,因此必须单独添加):

var links = menu.getElementsByTagName('a');for(var len = links.length, i = 0; i < len; i ++)
{links[i].addEventListener('focus', function(e){var link = e.target;}, false);
}

然后, ancestor()函数可以处理目标转换:

var item = ancestor(link, 'li');

第二个参数的灵活性允许使用不同的信息情况,例如,我们知道包含菜单将具有"menu" class ,但我们不知道它是<ul>还是<ol>元素:

var menu = ancestor(link, '.menu');

或者,也许我们有一个更深层的结构,其中各个子菜单是无序列表( <ul class="menu"> ),而顶层导航栏是具有相同class名的有序列表( <ol class="menu"> )。 我们可以在匹配中定义标签名称和class ,以获取所需的特定引用:

var navbar = ancestor(link, 'ol.menu');

在这种情况下的话,任何数量的其他的"menu"的元素将被忽略,如果用它既标签名称和相匹配的祖先只返回class

功能如何运作

基本功能只是通过DOM向上迭代 。 我们从原始节点开始,然后检查每个parentNode直到指定的祖先匹配为止;如果节点用完(即到达#document却找不到所需的节点),则放弃迭代。 但是,我们还有一些测试代码来确保两个参数都正确定义:

if(!node)
{return null;
}
else if(!node.nodeType || typeof(match) != 'string')
{return node;
}

如果输入node参数未定义或为null ,则函数返回null ; 或者,如果输入node不是节点,或者输入match不是字符串,则该函数将返回原始节点。 这些只是安全条件,通过减少对发送给它的数据进行预测试的需求,使功能更强大。

接下来,我们处理match参数以创建两个值的数组-第一个是指定的标记名(如果未指定,则为null ),第二个是指定的类名(如果未指定,则为null ):

if((match = match.split('.')).length === 1)
{match.push(null);
}
else if(!match[0])
{match[0] = null;
}

最后,我们可以进行迭代检查,将每次迭代中的当前参考节点与match数组中定义的标准进行比较。 如果match[0] (标记名称)为null任何元素都将匹配,否则我们仅匹配具有指定标记名称的元素(将两者都转换为小写,因此匹配不区分大小写)。 同样,如果match[1] (类名)为null那么一切都很好,否则元素必须包含指定的class

do
{if((!match[0]||match[0].toLowerCase() == node.nodeName.toLowerCase())&&(!match[1]||new RegExp('( |^)(' + match[1] + ')( |$)').test(node.className))){break;}
}
while(node = node.parentNode);

如果两个条件都匹配,我们中断迭代,并返回当前参考节点; 否则,我们继续下一个parentNode 。 如果我们都允许代码在两个match值都为null时达到这个目标,那么最终结果将是我们返回原始node ,这正是开始时的安全条件。

关于迭代本身的一件有趣的事情是do...while的使用:

do
{...
}
while(node = node.parentNode);

while评估内部,我们利用了在评估内部定义分配的功能。 每次进行评估时, node引用都会转换为parentNode node并重新分配。 该分配返回分配的node 。 如果父代不存在,则node引用将为null ,因此它将不通过while条件,因此迭代将停止并且函数将返回null 。 但是,如果父节点确实存在,它将通过while条件,因此迭代将继续,因为任何节点引用的评估结果为true ,而null评估结果为false

由于我们必须测试的节点数是未知的,因此只要父级存在,就必须使用while语句进行迭代。 但是,通过使用do...while而不是while ,我们可以转换为父节点之前评估原始节点(因为do是在第一个while之前评估的)。 最终,这意味着如果原始节点已经通过匹配条件,它将立即返回,这使我们不必在迭代之前定义单独的if条件。

结论

ancestor()函数不会因为复杂而赢得任何奖励! 但是简单功能的抽象是编程的基础,提供了可重复使用的代码,从而节省了重复键入相同的基本逻辑的麻烦。

From: https://www.sitepoint.com/finding-an-ancestor-node/

http://www.lbrq.cn/news/2750365.html

相关文章:

  • 江阴做网站的公司搜索引擎收录提交入口
  • 陕西企业营销型网站广东网络seo推广公司
  • sem推广是什么意思呢常德seo招聘
  • 图片制作表情包的软件惠州百度seo在哪
  • 网站建设首选唯美谷在线识别图片来源
  • 完整网站开发视频鸡西seo顾问
  • 长沙网站建设长沙建设银行吉林网络推广公司
  • 网站权重怎么查询企业查询
  • 用织梦做的网站好不好谷歌优化技巧
  • 做家政有什么网站做推广好河南百度关键词优化排名软件
  • 国外的网站模板网站建设公司哪家好
  • 社交网站建设百度在线使用网页版
  • 家里的电脑怎样做网站赚钱新浪体育最新消息
  • 网站底部版权信息潍坊自动seo
  • 做日语问卷调查的网站新闻最新消息
  • 网站服务器是网站的空间吗日本比分算1:1
  • 网站黑链怎么做的上海最新新闻热点事件
  • 动漫设计难不难学优化软件seo排名
  • 建站seo赚钱百度网站推广
  • 114百事通做网站是不是诈骗2020年百度搜索排名
  • 哪家网站建设比较好南宁网站优化
  • 建筑网站建设方案百度应用商店官网
  • 网站建设7个基竞价排名什么意思
  • 电子商务运营网站品牌营销网站建设
  • 建设工程教育网怎么样重庆seo顾问服务
  • 下沙做网站软件清博大数据舆情监测平台
  • IC 网站建设宁波seo快速优化平台
  • 从学习php到可以独立做网站需要多久百度人工服务热线24小时
  • 求西北地区网站建设专家 西安沉睡网络 官方网址?浅谈一下网络营销的几个误区
  • 海报设计模板网站百度seo排名优化系统
  • linux中已经启用的命令和替代命令
  • 多维视角下离子的特性、应用与前沿探索
  • 数据结构03(Java)--(递归行为和递归行为时间复杂度估算,master公式)
  • OpenCV 图像处理核心技术:边界填充、算术运算与滤波处理实战
  • 【科普向-第一篇】数字钥匙生态全景:手机厂商、车厂与协议之争
  • OBOO鸥柏丨75寸/86平板企业办公会议触控一体机核心国产化品牌招投标参数