javascript - 捕获 anchor 标记

标签 javascript html overriding

我编写了一个 JavaScript 代码来覆盖 native alert() 方法。 我需要捕获包含 alert() 执行代码的 HTML 元素。 前两个案例是示例。我已经在 console.log 中打印了元素。

案例 1 - 捕获 <script>标签:

HTML: <script> alert(1); </script>

JS:

window.alert = function()
{ 
    console.log(document.currentScript); // <script> is printed
}

案例 2 - 捕获 <img>标签:

HTML: <img src='1' onerror="alert(1)">

JS:

window.alert = function()
{ 
    console.log(arguments.callee.caller.arguments[0].target);
    // arguments.callee --> console.log()
    // arguments.callee.caller --> onerror(event) {}
    // arguments.callee.caller.arguments[0] --> event
    // arguments.callee.caller.arguments[0].target --> <img>
}

案例问题 - 捕获 <a>标签:

HTML: <a href="javascript:alert(1);">Click here for alert</a>

JS:

window.alert = function()
{ 
    console.log( // how to find <a> element) 
}

请不要建议我通过包含 <a> 的 ID 来修改 HTML或类似的东西。考虑到 HTML 是纯静态的,我不能修改任何东西。我可以只添加一个 JavaScript,我只是想知道如何做到这一点。

最佳答案

您也许能够找到此类警报并将它们转换为点击事件。像这样的东西。请注意,点击事件警报调用可能会变得更加复杂,并且可能会使用 eval(),但我将其留给您去冒险。

window.alert = (function(){
  var selected = document.querySelectorAll("a[href^='javascript:alert('");

  Array.from(selected).forEach(function(item){
    var old = item.href
    item.addEventListener("click", function(){ alert(old.substring(11)); });
    item.href="javascript:void(0);";
  });

  var _alert = function(msg) {
    console.log(msg);
    console.log(arguments.callee.caller.arguments[0].target);
  };
  
  return _alert;
})();
<a href="javascript:alert(1);">test</a>

关于javascript - 捕获 anchor 标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38149828/

相关文章:

javascript - 访问配置文件中的环境变量

javascript - Firebase 云功能 Promise.all

javascript - javascript中的验证表单,单独点击输入

Java继承(方法覆盖和重载)

Scala 防止混合的方法

javascript - 在对象原型(prototype)方法中的 setInterval/setTimeout 中引用 "this"

javascript - $viewContentLoaded 检查是否成功

html - 当其他 sibling 淡出时如何调整一个div不移动

jquery - 使用 jQuery 将第二个类添加到 html

python - 在 Python 中使用对象作为列表索引