如何从外部影响页面中运行的JavaScript

如何从外部影响页面中运行的JavaScript,javascript,cross-browser,Javascript,Cross Browser,我希望能够通过在外部执行某些操作或设置某些操作,使我在网页中使用的JavaScript的行为有所不同。所以会有逻辑检查,如果(某物)执行功能一,否则执行功能二。我可以想出三种方法来做这件事,但我对其中任何一种都不太喜欢。至少,除非我能看到是否还有另一种显而易见的方法,不知何故,我现在正在逃避 在URL中添加一个无害的查询字符串(例如?choose_functionality_one=true),我的逻辑只需查看页面URL即可。我不喜欢这种情况的原因是,我的代码在跨域iframe中运行,我甚至无法

我希望能够通过在外部执行某些操作或设置某些操作,使我在网页中使用的JavaScript的行为有所不同。所以会有逻辑检查,如果(某物)执行功能一,否则执行功能二。我可以想出三种方法来做这件事,但我对其中任何一种都不太喜欢。至少,除非我能看到是否还有另一种显而易见的方法,不知何故,我现在正在逃避

  • 在URL中添加一个无害的查询字符串(例如?choose_functionality_one=true),我的逻辑只需查看页面URL即可。我不喜欢这种情况的原因是,我的代码在跨域iframe中运行,我甚至无法访问页面的URL(只有iframe的URL)。是的,我可以将查询字符串传递给iframe,但前提是我可以控制父页面,而我不能

  • 在页面的域中创建cookie,我的逻辑只需在document.cookie中查找即可。使用bookmarklet可以很容易地完成这项工作,并且不会遇到跨域问题,因为我只需打开一个窗口/选项卡,指向运行代码的域,并在该上下文中运行bookmarklet。这是我目前领先的选择

  • 在浏览器的useragent字符串中添加一些内容,并在我的逻辑中查找。通过about:config在Firefox上非常容易,但在其他浏览器上就不那么容易了,在Mac上就很难了。此外,在某些浏览器上,一旦设置了自定义值,就无法在更新浏览器时自动更新UA。你的UA的版本信息会被固定在你第一次定制时的位置


  • 任何人都可以想出另一种方式,通过电子邮件/即时通讯/电话,我可以对某人说“做这个”,他们会看到页面的行为不同,以便进行故障排除。不过,对于没有这样做的普通用户来说,它的运行完全正常。

    最简单的选择似乎是在您的站点上创建一个调试页面,让用户打开/关闭“调试”cookie,然后将您的常规站点代码排队以关闭cookie的存在。我建议让调试cookie在相当短的时间内过期,这样人们就不会不经意地把它打开了

    此选项具有您感兴趣的优点(无需修改用户代理,可在所有平台上使用,可与iFrame一起使用),我看不出任何缺点,但如果有人关闭了Cookie,此选项将不起作用,尽管现在很多web在没有Cookie的情况下无法工作,因此这似乎是您可以接受的

    此外,它也是用户最简单的使用方法。您只需将他们引导到您站点上的正确页面,他们只需单击所需的按钮即可打开或关闭该页面。您可以使页面非常自我解释,这当然比任何其他选项都容易

    好的,如果您只控制代码而没有HTML,那么您可以实现一个键盘快捷键,通过设置cookie来启用调试模式。说明可能是这样的:将键盘焦点放在X上,然后按Ctrl-D

    或者,您可以实现某种特殊类型的单击(例如在某个对象或某个页面角上按Ctrl键)。在本例中,说明可能类似于:按住Ctrl键并单击页面上的对象X


    您的JS代码可以实现这些快捷方式之一。您甚至可以在使用特殊键/单击确认打开或关闭调试模式时发出提示(所有内容都是动态创建的HTML对象)。

    我建议您使用一种可以调用的全局
    启用调试
    方法。只需让用户打开命令行并键入
    enableDebug()
    谢谢您的建议。我想影响的所有代码都可以在另一个域的iframe中,地址栏中执行的代码无法访问(这就是我认为您所说的命令行)。谢谢您的建议。不幸的是,没有“你的网站”。我想要影响的代码可以加载(JS文件)到首页,也可以加载到跨域iframe中。我现在想我的书签看起来仍然是最好的选择。它只需要从代码加载到的任何域中运行,这可能需要打开一个单独的窗口/选项卡,转到该域的根目录并在那里运行bookmarklet,然后返回到原始页面并刷新,这应该很好。或者,如果代码加载到了首页,在那里运行bookmarklet。这对我来说毫无意义。你在你的问题中说得对:“我在网页上有JavaScript”。大多数人的理解是,有一个网站包含您的代码,您可以控制该代码的内容。现在你告诉我你不能在那个网站上添加新页面?也许如果你描述了你正在尝试做的事情的整个背景,而不是将我们推到你正在寻找的解决方案的路径上,我们可以提供更好的帮助。每个问题总是缺少一些重要的方面,在这种情况下,是我没有控制页面,只是我的代码包含在其中。如果你对我的问题不完美感到不安,我很乐意把你的建议作为答案。我能为自己辩护的就是我尽了最大的努力。好吧,我在回答中又增加了一个想法。因为你只控制代码,我不知道还能提供什么。谢谢你的更新。我正在考虑我是否能让这种键盘方法起作用。就时间而言,他们必须在页面加载过程中的正确时间按下键。如果他们在我的JS被加载之前按下了键,那么我的代码就不会在那里看到它。如果他们在我的JS加载后点击它,那就太晚了,因为我的代码已经做出了选择。它不像是坐在那里运行,我可以异步告诉它在调试模式下工作