绕过一次循环移除所有属性过滤(边循环边删除)
过滤方式:截取#后面的值,创建一个div,把#后面的值赋值给div,然后抓div的子元素,获取它的属性,再把子元素的属性全部删除(不管也没有用全都删除)
我们先输入#aaa看看
在输入看看结果
这里是因为用innerHTML添加的
这里已经获取到了第一个src
但是到了下一步,却获取不到onerror了
最后跳出了循环,没有删除onerror
这其中的原因是:本来是要删除2个,第一个src,第二个onerror,当他删除掉了第一个src的同时,第二个便往前移了移位,变到了现在的一个,for循环现在要删掉第二个时,发现第二个已经没有了,本来的第二个现在跑到了第一个,所以直接循环结束,没有删除onerror。
所以我们可以利用这一机制,将img标签中放入其他的属性,删除其他的属性来让我们要输出有用的属性进行输出。下面来验证这一想法
输入
可以看到我们的想法确实可以实现,但是src也被删除了,所以我们再添加一个属性,然后换个位置,输入
可以看到输出了我们要输出的属性并且成功弹窗
两次循环(先进数组,在数组里面循环删除)
这里的两次循环将属性都放入一个新的数组进行删除,就避免了上面一次循环导致的少删一个元素的情况,所以这里有两种思路(1)不进循环 (2)进循环不删除有用的属性
先试试一次循环的答案放在这里看是什么样子
可以看到只留下了一个img了
(1)进循环不删有用的数据
如果有一个元素可以拦截el.attributes,有可能删除的不是el而是里面的子元素,比如说在div标签里有form和img两个元素,将img的值删掉让form弹窗;要想进循环只有一个元素肯定不行,所以要想办法变成一个数组来进入循环,所以可以写进2个img
可以看到确实进入了循环,但是form没有触发,这里就需要用onfocus,而onfocus是input的属性,form没有,但是也要把焦点对到input里面,所以要用到tabindex(tabindex 全局属性 指示其元素是否可以聚焦,以及它是否/在何处参与顺序键盘导航)<input 20name=attributes> tabindex=1聚焦在input的子元素上;autofocus="ture“自动聚焦
弹窗可以但是这无限聚焦所以点了确定依旧弹窗,所以要加上执行一次就删除onfocus即<input 20name=attributes> 便可以实现
(2)不进循环
答案