gpt4 book ai didi

javascript - Ninja Kill a Rogue JavaScript 事件

转载 作者:行者123 更新时间:2023-11-28 15:48:55 25 4
gpt4 key购买 nike

这是情节,这是一个真实的故事(一个真实的人,即我,存在的问题):

您正在一个大型企业网站上工作,其中包含大量 JavaScript,特别是您无法控制的 jQuery 代码,并且不可能更改(祝您好运,甚至找出是谁编写的,或者为什么编写它) 。其中涉及多层身份验证和权限,因此只需假装它是一成不变的,您无法触及它。

在此代码中的某处,有一个事件在文档加载后将其滚动到页面顶部。 “好吧,这听起来无害”,有人可能会想 - 但现在您的任务是根据查询字符串或 anchor 将页面滚动到特定项目。

一般情况下一切正常,但是当您单击转到 example.com/list#item11 的链接时,浏览器会按预期工作,您会直接转到要链接到的项目...然后,whammo ,页面立即跳回页面顶部。

现在,您可能会说“好吧,这就是 document.ready() 的用途!” ...令你惊恐的是,你发现流氓事件还是发生了。

在 Stack Overflow 搜索要关联的更晚的事件后,您会发现这个 gem :

$(document).ready(function(e) {
$(window).load(function(e){ });
}

当然,这肯定会起作用!只是,事实并非如此。您尝试 return falsee.preventDefault(),但这对您没有任何作用。

您可以确定的是,这个恶意滚动事件发生在您的代码运行之后、DOM 准备好之后,并且绝对是在 window.load() 事件之后。除此之外,你什么都确定不了。

你能刺杀这个流氓事件吗?是否有某种机制可以拦截滚动事件并防止其发生?您可以链接到某个稍后发生的事件,例如“DOM 已准备好,窗口已加载,页面已解决, children 已经上床,并且所有其他事件都已处理完毕...... event()`”?

我现在能想到的唯一解决方案是“放弃 - 页面加载时的滚动行为在您的场景中不起作用”,“使用计时器并等待!然后提交切腹,因为这是一个肮脏的黑客!”,和“忍者暗杀任务!” (因为我不知道是谁写了有问题的代码,所以我不得不杀死他们的代码而不是他们 - 而且我确信他们有他们的理由,或者已经被暗杀了......或者至少等待传递并做我的事情的代码)。

是否有一些更好的方法,一些难以找到的功能,一些调用神秘的黑暗魔王反射的最后手段,或者是时候放弃并以其他方式解决问题了?

TLDR;

  1. 当您无法更改导致破坏性脚本事件(例如滚动)的代码时,如何阻止其发生?可接受的答案包括如何确保您的代码在之后运行 - 而不使用计时器黑客! - 和/或如果您的代码总是先运行,您如何防止后面的代码弄乱您的代码?

  2. 了解事件是如何定义的以及正在触发哪些事件可能会有所帮助,但我认为这是一个单独的问题,可能不一定需要解决这种情况。出于说明目的,假设有数千个事件事件和监听器分布在数十个缩小的脚本文件中。可能很难缩小到底发生的事情的范围,甚至尝试起来都很麻烦。

最佳答案

最好的解决方案是编辑声明就绪事件的源代码。

如果不能,您可以将此代码复制到其他位置并进行编辑。

如果完全不可能,那么

您无法取消绑定(bind)就绪事件,因为这可能会导致问题。

您可以通过其原型(prototype)覆盖 window.scrollTop() 函数

window.prototype.scrollTo2 = window.prototype.scrollTo;
window.prototype.scrollTo = function(){

/*Look in the url if you have an hash tab*/
// if yes return false
//if not
window.prototype.scrollTo2()
};

关于javascript - Ninja Kill a Rogue JavaScript 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21270310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com