- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通常我不会在 SO 中提出这种如此具体的问题,但我已经为这个问题苦苦挣扎了好几天,所以我在这里寻求一些帮助。
我正在构建一个应用程序来自动执行 Web 版 Whatsapp 中的任务 (https://web.whatsapp.com/)。我的目标是点击界面上的按钮显示一些选项,然后再次点击同一个按钮将其隐藏。
模拟我想手动做的事情:
1 - 打开 Whatsapp 网页版。
2 - 单击界面右上角的“附加”按钮,如下图所示。
3 - 附加选项将显示,如下图:
4 - 再次单击“附加”按钮,附加选项将隐藏。
就是这样,但我想使用 Javascript(纯 JS,无 JQuery)以编程方式执行此操作。
为了完成第 2 步中的任务,我成功地使用了以下代码:
var nodes = document.getElementsByTagName('span');
if (typeof lastElementId == 'undefined')
var lastElementId = 0;
var result = undefined;
for (var i = 0; i < nodes.length; i++) {
var h = nodes[i].outerHTML;
var flag = false;
flag = (h.toLowerCase().indexOf('data-icon="clip') > -1);
if (flag) {
result = h;
lastElementId = i;
break;
}
}
if (result !== undefined) {
function triggerMouseEvent(node, eventType) {
var clickEvent = document.createEvent('MouseEvents');
clickEvent.initEvent(eventType, true, true);
node.dispatchEvent(clickEvent);
}
triggerMouseEvent(nodes[i], "mouseover");
triggerMouseEvent(nodes[i], "mousedown");
} else {
console.log('Not found');
}
;
上面的代码可以执行第 2 步,但不能执行第 4 步。当我在选项显示后手动单击“附加”按钮时,选项将隐藏。但没有使用我的 JS 代码。
我在这里错过了什么?
提前致谢!
最佳答案
解决关闭问题:
inspect element
Event Listeners
选项卡并找到 mousedown
部分 screenX
和 screenY
以满足此特定业务逻辑并传递给 n.uie.requestDismiss ()
部分显然按照所说的去做。 所以现在我们有足够的信息来尝试一个可能的解决方案,目前显然可行。是这样的:
const toggleAttach = () => {
// select the span with reliable identification like data-*
const clipNode = document.querySelector('[data-icon="clip"]');
// take its element, i.e. the button itself
const clipButtonNode = clipNode.parentNode;
// extract the current offset position relative to the document
// more info here https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect
// we can use this for filling in the non-0 screenX and screenY
const clipButtonNodeClientRect = clipButtonNode.getBoundingClientRect();
clipButtonNode.dispatchEvent(new MouseEvent("mousedown", {
bubbles: true,
cancelable: true,
screenX: clipButtonNodeClientRect.x,
screenY: clipButtonNodeClientRect.y
}));
}
现在了解为什么第一个 mousedown 可以打开:
逆向工程要难得多,但我设法找到的是,如果你安装 React DevTools(因为 whatsapp web 是用 React 编写的)扩展并在 DevTools 中打开它的选项卡,你将看到:
在那里你会发现:
因此我们可以得出一个非常模糊的结论,即打开和关闭是在单独的函数中处理的。剩下的由您自己决定。
希望这对您有所帮助。
关于javascript - JS dispatchEvent 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50389861/
我正在使用 Angular2 + TypeScript,当我尝试执行这段代码时: var event = new Event('check'); window.dispatchEvent(event)
在我的 Angular 应用程序中,我必须打开一个新窗口并将一个事件发送回 Controller 。该代码适用于 Chrome 和 Firefox,但它不适用于 Edge 下面是来自外部文件的代码 t
我在获取 dispatchEvent 时遇到问题上类。我正在尝试消除对 jQuery 的依赖,并且一直在对 native API 进行自己的小扩展,但我无法获取我的 trigger 版本使用 disp
我有编写的代码: window.addEventListener("orientationchange", function() { //code here; }, false); 它工作正常
也许这是我的误解,但我认为当您创建一个自定义事件,然后创建“带有事件监听器的元素”(监听该事件)时,该事件(本身)会跟踪所有监听器谁在等待事件发生,并且当事件发生时,所有监听器都会自动收到通知。 但是
有没有办法调度所有元素? 例如,我们可以做 window.dispatchEvent(evt),但我想允许所有元素使用该事件。 (对于onclick,我们几乎可以使用所有元素) 最佳答案 var ev
我正在尝试为 WinJS 中的自定义事件编写事件处理程序。我不太确定这在 IE 中是如何工作的 -我正在创建一个自定义事件并发送它 - var eventObject = document.creat
如演示中所示,dispatchEvent 未按预期工作。 http://jsfiddle.net/DerekL/V8uEN/ 关键部分: btn.dispatchEvent( document
当我使用 dispatchEvent 模拟鼠标事件时,事件监听器的调用顺序与实际鼠标事件不同。特别是,某些bubble监听器会在同一目标上的capture监听器之前被调用。 这是一个 fiddle 来
如果我有一个无按钮表单,并且我想测试可能的 onsubmit 函数是否返回 true,然后提交它。这是我当前的代码,效果很好。 var form = document.getElementById('
通常我不会在 SO 中提出这种如此具体的问题,但我已经为这个问题苦苦挣扎了好几天,所以我在这里寻求一些帮助。 我正在构建一个应用程序来自动执行 Web 版 Whatsapp 中的任务 (https:/
在我的代码中我做了:element.onerror = my_function; 我想知道如何强制触发此事件以便我可以对其进行测试? 谁能告诉我如何使用 dispatchEvent 流程来做到这一点?
我正在尝试根据用户操作将字符发送到输入元素。 我正在尝试将 KeyboardEvent 与 dispatchEvent 一起使用,但无论我做什么,它都不起作用 例如: let keyEvent = n
我创建了一个事件,以便可以在事件发生时添加监听器。触发事件的场景会有所不同,因此需要跟踪触发事件的原因并进行适当的处理。但是,我尝试在循环内发生的函数中添加dispatchEvent,但收到 In
我有一个由特定函数触发的自定义事件。 此事件包含一个包含详细信息等的eventArgs。我希望处理程序/监听器能够更改 eventArgs,以便原始函数获得更改后的值。这可能吗? 到目前为止我已经尝试
我有以下代码 http://jsfiddle.net/yc7sj3pt/2/ document.getElementById('obj_one').addEventListener('mouseove
我在表单上有一个提交事件处理程序(以捕获使用 enter 提交表单的人,有时我需要手动触发(由用户点击提交按钮以外的其他内容触发) ,通过 dispatchEvent。 虽然我不希望它实际提交表单,但
当我在输入框上使用 dispatchEvent 触发 focus 事件时,它的 onfocus 被调用,但在 UI 上输入框是不专注。这种行为有什么原因吗? var test = document.g
我对下面的脚本感到困惑: var event = new Event('shazam'); document.body.addEventListener('shazam',function(){
我的要求是将事件从代码触发到父托管组件。 我在这里使用第一个答案作为引用:angular2 manually firing click event on particular element 如果我尝
我是一名优秀的程序员,十分优秀!