Javascript 你能把桌子放在一个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开发者控制台中运行相同的东西时,我得到了我正在寻找的元素 我尝试了不同的方法,仅在页面加

我正试图增强我们其中一个工具的GUI,但我失败得很惨。UI由一个主体和多个iFrame组成,我想从中选择一个并稍微更改内容

问题是,当使用我的选择器
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带有class
    comment

  • 假设我们要处理该文本,则此脚本将执行以下操作:

    // ==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");
    }