使用 iframe(jQuery 2.1.3 源代码)的任何替代方案?

Any alternative of using iframe ( jQuery 2.1.3 source code )?

提问人:TechTurtle 提问时间:4/13/2023 最后编辑:marc_sTechTurtle 更新时间:4/19/2023 访问量:75

问:

请看jQuery源码: https://code.jquery.com/jquery-2.1.3.js 如果我们搜索文本“<iframe”,那么我们可以看到以下函数:

function defaultDisplay( nodeName ) {
    var doc = document,
        display = elemdisplay[ nodeName ];

    if ( !display ) {
        display = actualDisplay( nodeName, doc );

        // If the simple way fails, read from inside an iframe
        if ( display === "none" || !display ) {

            // Use the already-created iframe if possible
            iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );

            // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
            doc = iframe[ 0 ].contentDocument;

            // Support: IE
            doc.write();
            doc.close();

            display = actualDisplay( nodeName, doc );
            iframe.detach();
        }

        // Store the correct default display
        elemdisplay[ nodeName ] = display;
    }

    return display;
}

这工作正常,但是,我们的 Web 防火墙会阻止此文件,因为怀疑可能存在 iframe 注入。该函数似乎正在创建 iframe 元素并附加该元素。稍后,它使用 iframe 来获取显示值。

使用 iframe 的任何解决方法/替代方案,以便我们可以替换以下行:

iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );

请注意,我无法更改防火墙提供商。此外,这是在 AngularJS 1.4.5 上,它对 jQuery 版本有任何依赖关系吗?我所知道的是 AngularJS 1.4.5 需要 jQuery,但不确定是哪个版本。

有没有人使用过 AngularJS 1.4.5 和最新的 jQuery 版本?

jQuery AngularJS的

评论

1赞 user229044 4/13/2023
修复防火墙,还是不依赖 CDN 托管的代码?
1赞 AKX 4/13/2023
摆脱损坏的Web防火墙,或托管自己的jQuery版本,而无需违规行。
2赞 user229044 4/13/2023
这是一个关于如何规避某些特定文本片段的防火墙规则的问题。文本是代码与实际问题无关,因此这与编程无关。真的不清楚你在这里想要什么。选项是更改防火墙或更改代码,显然没有其他选项。如果你不能改变损坏的防火墙,你只剩下一个选择,你似乎不愿意追求。
1赞 TechTurtle 4/13/2023
@phuzi AngularJS 使用 jQuery,但它们没有提供 jQuery 和 AngularJS 之间的确切版本映射。我只是想看看是否有人尝试过不同的版本。不幸的是,一些过于敏感的人认为我的问题不合适,但这很有帮助:stackoverflow.com/questions/65284866/......
1赞 phuzi 4/13/2023
@TechTurtle 链接问题的答案包括来自 AngularJS FAQ(链接:docs.angularjs.org/misc/...)的屏幕截图,其中指出“是的,如果 AngularJS 存在于您的应用程序中,则可以使用 jQuery......”(强调我的)。无需将 jQuery 加载到页面即可使用 AngularJS。

答:

0赞 phuzi 4/19/2023 #1

如果你查看 Angular JS FAQ,有一个关于在 Angular JS 1.4.5 中使用 jQuery 的问题重点是我的)

AngularJS 是否使用 jQuery 库?

是的,如果 jQuery 在引导应用程序时存在于您的应用程序中,Angular 可以使用它。如果脚本路径中不存在 jQuery,则 Angular 会回退到它自己的 jQuery 子集实现,我们称之为 jQLite。

Angular 1.3 仅支持 jQuery 2.1 或更高版本。jQuery 1.7 及更高版本可能与 Angular 一起正常工作,但我们不保证这一点。

从中可以看出,对jQuery完全没有硬依赖,Angular JS将使用自己的jQuery版本jQLite。

你应该可以从你的 Angular JS 页面中完全删除 jQuery,假设它没有在其他任何地方使用。

不幸的是,目前尚不清楚“支持 jQuery 2.1 或更高版本”是否包括主要版本。

评论

0赞 TechTurtle 4/19/2023
没错,但是我们还有其他依赖于 jQuery 的库,如 Bootstrap 等,因此我们必须将其包含在源代码中。
0赞 TechTurtle 4/19/2023 #2

这是我最终得到的:

//iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );

if (!iframe){
 iframe = document.createElement("iframe");
 iframe.frameBorder = iframe.width = iframe.height = 0;
}
doc.documentElement.appendChild(iframe);
doc = iframe[0].contentDocument;

//rest of the code

这样,现在代理服务器不会显示任何错误消息,因为找不到文本“<iframe”,我们正在通过其他 JS 方式创建。