Javascript 你能把桌子放在一个iframe里吗?
我正试图增强我们其中一个工具的GUI,但我失败得很惨。UI由一个主体和多个iFrame组成,我想从中选择一个并稍微更改内容 问题是,当使用我的选择器Javascript 你能把桌子放在一个iframe里吗?,javascript,jquery,google-chrome,iframe,tampermonkey,Javascript,Jquery,Google Chrome,Iframe,Tampermonkey,我正试图增强我们其中一个工具的GUI,但我失败得很惨。UI由一个主体和多个iFrame组成,我想从中选择一个并稍微更改内容 问题是,当使用我的选择器frame=$(“iframe[src*='/vs/virt.jsp'])时似乎找不到元素 以下是代码(除了日志之外,不做任何其他操作): 当在页面上运行此命令时,我会得到两个页面加载,并显示位置对象,前后。但是帧对象是完全空的 然而,当在页面加载后在Chrome开发者控制台中运行相同的东西时,我得到了我正在寻找的元素 我尝试了不同的方法,仅在页面加
frame=$(“iframe[src*='/vs/virt.jsp'])时代码>似乎找不到元素
以下是代码(除了日志之外,不做任何其他操作):
当在页面上运行此命令时,我会得到两个页面加载,并显示位置对象,前后。但是帧对象是完全空的
然而,当在页面加载后在Chrome开发者控制台中运行相同的东西时,我得到了我正在寻找的元素
我尝试了不同的方法,仅在页面加载等之后加载脚本,但仍然不起作用
更新:
我补充说:
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
然后试着这样做:
waitForKeyElements (
"iframe[src*='/vs/virt.jsp']",
test()
);
function test(){
frame = $("iframe[src*='/vs/virt.jsp']");
console.log(frame.attr("id"));
}
还是一样的结果。值得注意的是,我使用的是Tampermonkey,但可能是相同的
编辑2:
function timer() {
frame = $("iframe[src*='/vs/virt.jsp']");
console.log(frame.attr("id"));
setTimeout(timer, 1000);
}
timer();
它一直输出“undefined”,而如果我在Chrome开发者控制台中尝试,我会得到这个对象。就像Tampermonkey没有访问权限一样?因为您的iFrame与主页位于同一个域中,所以使用waitForKeyElements()
以iFrame更改为目标相对简单。它的设计考虑到了这种可能性。
将有效的iFrame选择器作为第四个参数传递
例如:
去。它会动态创建一个id为tstIframe
的iframe,如下所示:
当您单击该按钮时,它会在iframe中添加一行文本——在一个div中,该div带有classcomment
假设我们要处理该文本,则此脚本将执行以下操作:
// ==UserScript==
// @name Dynamic iframe content manipulator
// @match http://fiddle.jshell.net/5zqfthx7/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
introduced in GM 1.0. It restores the sandbox.
*/
waitForKeyElements (
".comment",
styleComment,
false,
"#tstIframe"
);
function styleComment (jNode) {
jNode.css ("background", "lime");
}
当您安装该脚本、重新加载页面并按下按钮时,您将看到每一行都变为彩色,如下所示:
注:
在这种情况下,不要使用@noframes
。Tampermonkey不能在这种iframe操作中正确地应用它——特别是如果iframe没有src
使用@require
时,请始终使用@grant
而不是none
,除非您确切知道页面的JS和脚本的JS将如何交互和冲突李>
Firefox上提供了其他选项。Chrome仍然具有挑剔/有限的iframe支持
最后,由于您的iFrame有一个src
,您通常可以为它编写脚本,就好像它是唯一的页面一样。调整您的@match
,等等,在iFrame上触发指令,并可能将代码包装在if(self!==top){…}
结构中。
例如,见
$(“iframe[iframe[src*='/vs/virt.jsp']))
这是问题中的一个输入错误,对吧,那不是实际的代码?这是一个输入错误。现在更正它。感谢您的观察!iframe元素可能是稍后创建的。尝试使用waitforkyelments
或MutationObserver
。这样做并报告回发waitforkyelments。MutationObserver看起来超出了我的能力职系:)
// ==UserScript==
// @name Dynamic iframe content manipulator
// @match http://fiddle.jshell.net/5zqfthx7/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
introduced in GM 1.0. It restores the sandbox.
*/
waitForKeyElements (
".comment",
styleComment,
false,
"#tstIframe"
);
function styleComment (jNode) {
jNode.css ("background", "lime");
}