css中的:hover伪类是定义鼠标指针在某个元素上悬停时的样式,这是web开发中经常用到的一种情况。但是有些情况下,我们需要移除悬停样式。这时候就可以使用jquery来移除:hove效果。
方法一:使用removeClass()
使用jQuery的removeClass()方法来移除:hover伪类的样式代码是最简单的方法。它的语法如下:
$("selector").removeClass("className");
这个方法可以应用于任何具有类名的元素。例如:
$("a").removeClass("hover");
这个方法可以从所有a元素中移除类名为hover的样式。
方法二:使用mouseleave事件
使用jQuery的mouseleave事件也可以实现移除:hover伪类效果。当鼠标离开指定元素时,执行自定义操作。mouseleave事件是对应于mouseenter事件的。
它的语法如下:
$("selector").mouseleave(function(){
// 移除相关的指定样式代码
});
例如:
$("a").mouseleave(function(){
$(this).css("background-color","white");
});
这个例子是当鼠标离开一个链接时,将该链接的背景颜色设置为白色。
方法三:使用Mouseout事件
使用jQuery的mouseout事件也可以实现同样的效果,当一个元素的鼠标离开它时,执行某种操作。
它的语法如下:
$("selector").mouseout(function(){
// 移除相关指定样式代码
});
例如:
$("a").mouseout(function(){
$(this).css("background-color","white");
});
这与上述的mousemove事件是相同的,因为它们都是当鼠标离开一个元素后执行相应的操作。
总结
在实际的开发中,开发人员需根据实际情况选择不同的方法进行移除:hover伪类的效果。以上三种方法是实际开发中最常用的方法,可以达到比较好的效果。
python 解析nmap_利于python脚本编写可视化nmap和masscan
介绍
我编写了一个快速且带有斑点的python脚本,以可视化nmap和masscan的结果。它通过解析来自扫描的XML日志并生成所扫描IP范围的直观表示来工作。以下屏幕截图是输出示例:
由于缺少更好的词,我将从现在开始将输出称为地图。每个主机由一个彩色正方形表示。覆盖地图大部分内容的浅蓝色方块表示主机处于脱机状态(或仅未响应masscan的SYN。)其他彩色方块表示处于联机状态且具有开放端口的主机。正方形的颜色从蓝色到红色。正方形越红,表示主机上打开的端口越多。将鼠标悬停在每个方块上,将在工具提示中显示IP地址和打开的端口。
该工具非常有用,因为它使您可以大致了解IP范围,而不必在日志文件中拖网。它使您可以轻松查看扫描中的主机块。该工具可以从github下载,但是我将在下面描述代码的工作方式。
如何使用
首先,我要说这段代码没有经过优化。我已经针对/ 21的日志运行了代码,并花费了大约40秒钟来生成输出映射。
第一步是查找运行扫描的IP地址范围。由于扫描命令未保存在日志文件中,因此这真是一个痛苦。因此,我们必须根据最低和最高IP结果来计算范围。我们从扫描中解析XML文件,并将扫描到的每个IP地址附加到名为ipList的列表中
ipList = []for event, element in etree.iterparse('output.xml', tag="host"): for child in element: if child.tag == 'address': ipList.append(child.attrib['addr'])
然后,我们遍历ipList并将每个八位位组分成单独的列表,分别称为firstOctetRange,secondOctetRange,thirdOctetRang和forwardOctetRange。
firstOctetRange = []secondOctetRange = []thirdOctetRange = []forthOctetRange = []bitDelimeter = 0startingIP = 0endingIP = 0for ip in ipList: binaryOctet = '' octets = ip.split('.') firstOctetRange.append(int(octets[0])) secondOctetRange.append(int(octets[1])) thirdOctetRange.append(int(octets[2])) forthOctetRange.append(int(octets[3]))
然后,我们将每个结果的每个八位位组与另一个结果的相同八位位组进行比较,以确定值发生变化的八位位组。例如。如果前两个八位位组始终相同。我们知道扫描的CIDR表示法将大于/ 16。我使用了变量bitDelimeter来存储CIDR表示法截取的八位字节的值。
if min(firstOctetRange) != max(firstOctetRange): bitDelimeter = 0elif min(secondOctetRange) != max(secondOctetRange): bitDelimeter = 1elif min(thirdOctetRange) != max(thirdOctetRange): bitDelimeter = 2elif min(forthOctetRange) != max(forthOctetRange): bitDelimeter = 3
扫描的IP地址范围被添加到称为parsedServers的有序字典中。ip地址是使用一系列4个嵌套的FOR循环生成的,每个循环在0 – 256范围内循环。此范围开始的八位位组取决于bitDelimeter。例如。如果扫描了IP地址范围192.168.10.0/24。位定界符将为3,指示最后一个八位位组是更改其值的八位位组。因此,用于生成要放入parsedServers的IP地址的循环将固定前三个八位字节,并仅对最后一个八位字节循环范围为0 – 256。如果我们扫描/ 21,则位定界符将为2,因此生成IP地址的循环将固定前两个八位位组。将根据扫描的最小第三八位字节值和扫描的最大第三八位字节值的范围生成第三八位字节。第四个八位位组的范围是0 – 256。
if bitDelimeter == 0: for one in range(min(firstOctetRange), max(firstOctetRange) + 1): for two in range(0, 256): for three in range(0, 256): for four in range(0, 256): ip = "%d.%d.%d.%d" % (one, two, three, four) parsedServers[ip] = []if bitDelimeter == 1: one = min(firstOctetRange) for two in range(min(secondOctetRange), max(secondOctetRange) + 1): for three in range(0, 256): for four in range(0, 256): ip = "%d.%d.%d.%d" % (one, two, three, four) parsedServers[ip] = []if bitDelimeter == 2: one = min(firstOctetRange) two = min(secondOctetRange) for three in range(min(thirdOctetRange), max(thirdOctetRange) + 1): for four in range(0, 256): ip = "%d.%d.%d.%d" % (one, two, three, four) parsedServers[ip] = []if bitDelimeter == 3: one = min(firstOctetRange) two = min(secondOctetRange) three = min(thirdOctetRange) for four in range(min(forthOctetRange), max(forthOctetRange) + 1): ip = "%d.%d.%d.%d" % (one, two, three, four) parsedServers[ip] = []
现在,我们有一个parsedServer排序的dict,其中包含我们扫描范围内的所有IP地址。下一步是将扫描中找到的打开端口添加到parsedServer字典中。
for event, element in etree.iterparse('output.xml', tag="host"): for child in element: if child.tag == 'address': ipAddress = child.attrib['addr'] if child.tag == 'ports': for subChild in child: port = [subChild.attrib['portid']] parsedServers[ipAddress].append(port)
现在,我们需要生成一个HTML页面,可用于可视化结果。这是使用Flask完成的。我们遍历包含所有数据的pasedServers字典。创建一个infoString,其中包含当前迭代的IP地址和端口。当光标悬停在地图上的正方形上时,将在工具提示中使用此功能。创建htmlBuffer并将其附加到parsedServers字典的每次迭代中。每次迭代都会添加HTML代码,以使用从colourRange列表中提取的颜色添加新的表格数据单元。范围中总地址的平方根表示何时需要在表中添加新行。这样可以使结果在页面上显示为正方形。
count = 0htmlBuffer = Markup('')for key, value in parsedServers.items(): infoString = str(key) + '
' if value: infoString += 'Ports:' for portValue in value: infoString += str(portValue) + ',' colourRange = ['94A5FF', '0024E5', '2422C5', '4821A6', '6D1F87', '911E67', 'B61C48', 'DA1B29', 'FF1A0A'] htmlBuffer += Markup('