javascript - 如何用angularjs检测混合内容?

标签 javascript angularjs

我有一个 angularjs 应用程序在 tomcat 上运行,在 loadbalancer 后面

如果应用程序是通过负载均衡器使用 https 请求的,那么平衡器当然仍会通过 http 在内部请求应用程序。

问题:在这种情况下,我想隐藏一个显示混合内容的选项卡(因为我必须嵌入不支持 https 的外部 pdf 链接,因此我想隐藏它们)。

我无法使用 $location.protocol(),因为该应用位于负载均衡器之后,并且始终只获取 http

问题:我是否有机会检测浏览器是否实际显示了混合内容

最佳答案

您无法通过简单的方式检测到它。您可以尝试在 iframe 上监听加载事件并设置超时,当触发超时时,阻止 iframe,因为 iframe 没有像这样加载(jsfiddle example):

checkMixedContent(urlToCheck, function(urlToCheck) {
    // For example, change location
    alert('ok');
    // load iframe
}, function() {
    alert('Error: resource timed out');
    // hide iframe / show message
}, checkDelay);

function checkMixedContent(urlToCheck, successCallback, errorCallback, checkDelay, dontCheckOnError) {
    checkDelay = checkDelay || 10000;
    // 1. Create invisible iframe and append it to body
    var iframeHelper = document.createElement("iframe");
    iframeHelper.src = urlToCheck;
    iframeHelper.height = 0;
    iframeHelper.width = 0;
    iframeHelper.style.visibility = 'hidden';
    document.body.appendChild(iframeHelper);

    // 2. Set time out and while content on iframeHelper.src should be definitely loaded
    var checkTimeout = window.setTimeout(function() {
        errorCallback(urlToCheck);
    }, checkDelay);

    var onLoad = function() {
        window.clearTimeout(checkTimeout); // if OK - not show error => clearTimeout

        iframeHelper.removeEventListener('load', onLoad);
        iframeHelper.removeEventListener('error', onError);
        document.body.removeChild(iframeHelper);
        successCallback(urlToCheck);
    };

    var onError = function() {
        window.clearTimeout(checkTimeout); // if OK - not show error => clearTimeout

        iframeHelper.removeEventListener('load', onLoad);
        iframeHelper.removeEventListener('error', onError);
        document.body.removeChild(iframeHelper);
        errorCallback(urlToCheck);
    };

    // 3. If everything is fine - "load" should be triggered
    iframeHelper.addEventListener('load', onLoad);


    // Turn "true" in case of "X-Frame-Options: SAMEORIGIN"
    if (!dontCheckOnError) {
        iframeHelper.addEventListener('error', onError);
    }

}

关于javascript - 如何用angularjs检测混合内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35599810/

相关文章:

javascript - 如何在angular js中显示嵌套ng-repeat的另一个表中的数据

angularjs - Angular UI-Grid 无法获取要显示的数据

javascript - 在 Angularjs 中捕获文档级按键事件

javascript - 当我调用服务时获取未定义的数据

http - 如何在页面重新加载时在 AngularJS 中保留 REST 身份验证凭据?

javascript - 使用 componentDidUpdate 更改组件中的状态

javascript - AngularJS 服务依赖注入(inject)错误

javascript - 如何从自定义 Node REPL 获取子进程中的输入

javascript - bootstrap4 carousel - 在 'slide.bs.carousel' 事件中停止滑动

javascript - 在 tempateURL 之后加载脚本