gpt4 book ai didi

javascript - execCommand ('copy' ) 无法以编程方式工作,仅当通过 DevTools 控制台执行时

转载 作者:行者123 更新时间:2023-12-01 03:59:18 27 4
gpt4 key购买 nike

来源:

const package = document.querySelector('td[data-bind="text: packageName"');

if (package.textContent.indexOf('Adaptive') !== -1) {
package.click();

const stacks_tab = document.querySelector('ul[class="tabsExpanded"]').children[5];

stacks_tab.click();

function get_sources() {
const sources = [];

const stacks = document.querySelectorAll('span[data-bind="text:duration"]');

for (let i = 0; i < stacks.length; i++) {
stacks[i].click();

let renditions = document.querySelectorAll('span[class="blockUnSelected"]');
renditions[(i+1) * 8 - 1].click();

sources.push(document.querySelectorAll('p[data-bind="text: $data.name"]')[0].textContent);
}

let copy = '';

for (let i = 0; i < sources.length; i++) {
const change_brackets = sources[i].replace(/\/tveorigin\/vod\/ae\//, '');
const no_pd1 = change_brackets.replace(/-pd1/g, '');
copy += no_pd1 + ',';
}

if (copy === '') {
setTimeout(get_sources, 500);
} else {
const hidden = document.createElement('input');
hidden.value = copy;
document.querySelector('body').appendChild(hidden);
hidden.select();

function copy_sources() {
console.log('running');

hidden.select();

if (!document.execCommand('copy')) {
setTimeout(copy_sources, 500);
} else {
console.log('Sources copied!');
}
}

copy_sources();
}
}

get_sources();
} else {
console.log('There is no Adaptive package in this content.');
}

第 45 行不起作用。

该代码没有多大意义,但这是用例:

我正在尝试通过将一些 JavaScript 注入(inject)到我们用于工作视频内容的 CMS 上的 Chrome DevTools 控制台来自动化部分工作。该脚本的作用是单击几个元素,然后抓取一些文件位置并将它们作为逗号分隔值复制到剪贴板。我之前工作得很好,但我决定尝试让脚本变得更好......现在 document.execCommand('copy') 不起作用。

如您所见,我使用一些递归来连续选择隐藏输入值,然后尝试复制它,如果失败,我会在 500 毫秒后重试。我还记录 'running' 以确保该函数实际上正在运行(确实如此)。 execCommand() 函数每 500 毫秒不断返回 false。但是,如果我手动将其输入控制台并运行它,即使递归函数继续返回 false,它也会返回 true 并且工作正常。因此,由于某种原因,它在我的脚本上下文中不起作用,但在手动运行时工作得很好。

就像我之前说过的,它之前是通过编程方式工作的,但是我更改了一些内容以使脚本更好、更自动化,并且它不再工作了。这是 execCommand() 工作正常的代码:

const sources = [];

const stacks = document.querySelectorAll('span[data-bind="text:duration"]');

for (let i = 0; i < stacks.length; i++) {
stacks[i].click();

let renditions = document.querySelectorAll('span[class="blockUnSelected"]');
renditions[(i+1) * 8 - 1].click();

sources.push(document.querySelectorAll('p[data-bind="text: $data.name"]')[0].textContent);
}

let copy = '';

for (let i = 0; i < sources.length; i++) {
const change_brackets = sources[i].replace(/\/tveorigin\/vod\/ae\//, '');
const no_pd1 = change_brackets.replace(/-pd1/g, '');
copy += no_pd1 + ',';
}

const hidden = document.createElement('input');
hidden.value = copy;
document.querySelector('body').appendChild(hidden);
hidden.select();
document.execCommand('copy');

我刚刚测试了该代码,它仍然有效,并按预期将文本复制到剪贴板。我看到的唯一显着的不同是,在旧代码中,我在全局上下文中运行 execCommand() ,而在新脚本中,它在函数上下文中运行。会不会跟这个有关系?

最佳答案

所以这个问题的解决方案很奇怪。 execCommand() 只能由用户事件处理程序触发,所以我必须做的是将 click 监听器附加到 window,然后在hidden 节点上调用click 事件。因为这触发了一个点击处理程序,所以它起作用了!

关于javascript - execCommand ('copy' ) 无法以编程方式工作,仅当通过 DevTools 控制台执行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42324719/

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