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);
}
}