在IE浏览器中,点击Angular Bootstrap日期选择器之外会出现“contains”错误。
在IE浏览器中,点击Angular Bootstrap日期选择器之外会出现“contains”错误。
当我在IE中点击打开的日期选择框之外时,会出现以下错误:
'对象不支持属性或方法'contains' Bootstrap日期选择器'
日期选择器不会关闭。我遇到了许多修复方法,其中涉及修改Bootstrap源代码,但我更愿意不这样做(IE没有包含方法)
我通过在顶级父div上调用此函数来解决问题:
而函数看起来像这样:
$scope.formClicked = function($event){ $log.debug('表单被点击'); $event.preventDefault(); $event.stopPropagation(); $scope.model.shipDateOpened = false; $scope.model.cancelDateOpened = false; };
问题是,现在在我的移动视图中,当我尝试点击选择下拉框时,会触发formClicked($event)函数,并且不会打开。这个问题有更好的解决方案,或者我是否可以在我的桌面视图中有条件地渲染一个ng-click?
在IE浏览器中,点击Angular Bootstrap日期选择器之外的区域会引发“contains”错误。这个问题的原因是IE浏览器和Edge浏览器都没有实现Node.contains()方法。为了解决这个问题,可以使用一个polyfill来兼容这两个浏览器。
具体原因可以从以下代码中找到:
var documentClickBind = function(event) { var popup = $popup[0]; var dpContainsTarget = element[0].contains(event.target); var popupContainsTarget = popup.contains !== undefined && popup.contains(event.target); if (scope.isOpen && !(dpContainsTarget || popupContainsTarget)) { scope.$apply(function() { scope.isOpen = false; }); } };
如代码中的注释所说,IE和Edge浏览器都不支持Node.contains()方法,这就导致了问题的发生。
解决方法是使用一个polyfill来实现Node.contains()方法。可以使用以下代码来实现这个polyfill:
if (!Node.prototype.contains) { Node.prototype.contains = function contains(node) { if (!(0 in arguments)) { throw new TypeError('1 argument is required'); } do { if (this === node) { return true; } } while (node = node && node.parentNode); return false; } }
这是一个稍微修改过的polyfill版本,最初是基于一个建议进行修改的。
非常感谢你提供了contains函数的实现!