Discussions » Development

油猴子操作框架内容

§
Posted: 2018-05-27
Edited: 2018-05-27

油猴子操作框架内容

刚开始接触油猴子,想自己编写一个脚本,但是页面中有框架,代码在浏览器控制台中操作没有问题,但是使用油猴子操作就没有反应了。代码如下:

// ==UserScript==
// @name            爱奇艺重构
// @description     爱奇艺重构
// @include         https://tuiguang.iqiyi.com/orderGroup/index
// @require         https://tuiguang.iqiyi.com/js/jquery-2.1.1.min.js
// @version         0.0.1
// ==/UserScript==

window.onload=function(){
  var btn=$("<input type='button' id='testBtn' value='Test'>");
  $(window.rightIframe.document).find("form#searchForm").append(btn);
};
§
Posted: 2018-05-27

没人会吗

§
Posted: 2018-05-30

这并不是框架的问题,而是脚本的注入时机问题,具体可以看 run_at文档 如果脚本注入过早,注入时页面中还没有这个东西当然不会有效果,如果目标元素在DOMContentLoaded 完成后就已经存在,那么使用// @run-at document-idle 控制脚本注入时机即可解决问题,当然有些页面内容是在DOMContentLoaded 事件完成之后再由前端代码填充的,那么在填充的前端代码执行完成前无论你选择哪种注入时机脚本都会找不到执行元素。这时候脚本就只能选择使用 MutationObserver 或者 .addEventListener('DOMNodeInserted',function(event){...}) 给目标元素的已存在父节点添加监听事件监听待执行元素的插入,等到目标插入才能执行代码。需要注意的是,目标元素的父节点也不一定一开始就存在,这时候就需要监听父节点的父节点,甚至再往上直到document上,而且被插入的目标元素也不一定会是自身插入的,而是可能连同父节点或者父节点的父节点这样一整块插入的,如果无法判断目标的插入时机和方式,那么最好的方法当然是每插入一个东西就检查一遍目标元素,但是这种方法效率很低,当然更简单粗暴的方式是脚本启动后延迟一段时间再执行,但是这种方法不可靠性较高

Deleted user 108456
§
Posted: 2018-06-30

你的代码是在 iframe 中操作的,然而 window.onload 的时候 iframe 一定没开始加载。 因此一定无效。

Post reply

Sign in to post a reply.