2017-02-19 26 views
0

来源:45的execCommand( '复制')不是编程工作,只有当通过DevTools控制台执行

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.'); 
 
}

线就是不工作。

这些代码不会成为一个很大的意义,但这里的用例:

我试图通过注入一些JavaScript到我们的CMS,我们使用的Chrome DevTools控制台自动执行我工作的一部分用于我工作的视频内容。脚本所做的是单击几个元素,然后抓取一些文件位置并将它们作为逗号分隔值复制到剪贴板。我以前的工作很好,但我决定尝试使脚本更好...现在document.execCommand('copy')只是无法正常工作。正如你所看到的,我使用一些递归来连续选择hidden输入值,然后我尝试复制它,如果失败,我会在500毫秒内再试一次。我还登录'running'以确保该功能实际上正在运行(它是)。每500ms,execCommand()函数会一直返回false。但是,如果我手动输入到控制台并运行它,它将返回true并且工作正常,即使递归函数继续返回false。所以出于某种原因,它不会在我的脚本的上下文中工作,但手动运行时完全正常工作。

就像我之前说的,这是工作之前编程,但我改变了一些东西,使脚本更好,更自动化,它将不再工作。下面是与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(),而在新的脚本,它在功能方面。这可能与它有关吗?

+0

代替pastebin,在这里使用''''''''片段编辑器并创建一个[mcve] - 我们通常不希望在控制台中显示错误消息的真实示例可能会告诉某些事情时调试您的代码 – mplungjan

+0

我已经添加了片段!但看到这是一个脚本我注入到非公开的Web应用程序,它甚至不会运行在任何地方:/ –

回答

0

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