Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用angularjs检测混合内容?_Javascript_Angularjs - Fatal编程技术网

Javascript 如何使用angularjs检测混合内容?

Javascript 如何使用angularjs检测混合内容?,javascript,angularjs,Javascript,Angularjs,我有一个angularjs应用程序运行在tomcat上,在负载平衡器后面 如果应用程序是通过带有https的loadbalancer请求的,那么平衡器当然仍然通过http在内部请求应用程序 问题:在这种情况下,我想隐藏一个显示混合内容的选项卡(因为我必须嵌入不支持https的外部pdf链接,所以我想隐藏它们) 我无法使用$location.protocol(),因为该应用程序位于loadbalancer后面,并且始终只获取http 问题:我是否有可能检测到浏览器是否实际显示了混合内容 你无法用简

我有一个
angularjs
应用程序运行在
tomcat
上,在
负载平衡器后面

如果应用程序是通过带有
https
的loadbalancer请求的,那么平衡器当然仍然通过
http
在内部请求应用程序

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

我无法使用
$location.protocol()
,因为该应用程序位于loadbalancer后面,并且始终只获取
http


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

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


但该应用程序在客户端web浏览器中运行,该浏览器通过https请求页面。在您的网络内部通过http下载并不重要。您不理解我的意思:webapp将包含不支持https的嵌入式资源/链接。因此,我们有一个混合内容的问题,因此我想检测它。我无法通过loadbalancer后面的协议检测到它。仅供参考,我认为这实际上不起作用,因为当您将iframe指向某个HTTP URL(iframe位于HTTPS网页内)时,仍然会触发onload事件。javascript控制台中会出现“混合内容”错误,但它仍会触发iframe的onload事件,而不会触发iframe的onerror事件。基本上是无法检测到的。这是Chromium项目中标记为WONTFIX的bug记录:@jangosteve谢谢你提供的信息,那是很久以前的事了,我不记得细节了。。。但是有一个例子,它不叫“加载”。时间过后调用错误回调out@jangosteve只需在https JSFIDLE:上运行他们的示例。他们在http上提供了它。该票证通常是关于“无效URL”的。如果我们在“https”中有body,在“http”中有iframe,它就不会调用“onload”。
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);
    }

}