lin*_*3rd 9 css internet-explorer svg internet-explorer-10 internet-explorer-11
我目前正在IE 10和11中遇到一个问题,其中浏览器选项卡不时地悬挂在UI响应工具中的布局上.我是一个团队写一个相当大的knockout.js网络应用程序的一部分,因此确定创建此问题的确切条件非常困难.据我所知,当从页面中删除加载指示符HTML时,浏览器选项卡会在执行布局时挂起,并且某些div和一个空的SVG标记将附加到DOM的位置.
我已经能够确定空的SVG标签是罪魁祸首,但我不知道为什么我无法从页面中删除该标签它是我正在尝试创建的D#数据可视化的重要元素.
以下是IE 11为我提供的美国响应报告.我已经放大了有问题的区域,正如您在图片中看到的那样,布局线程使CPU达到100%.

在进入代码示例之前,我的问题是:
为什么浏览器选项卡会间歇性地冻结/挂起向页面添加空的SVG元素?
HTML通过javascript以尽可能少的方式附加到DOM中,以减少浏览器中的重排:
var contentHTML = "";
contentHTML += '<div class="axis-title y-axis-title">' + renderString(bindingData.yAxis.title) + "</div>";
contentHTML += '<div class="' + CANVAS_CLASS + '"></div>';
contentHTML += '<svg class="x-axis"></svg>'; // The problematic element
element.innerHTML = contentHTML;
Run Code Online (Sandbox Code Playgroud)
这导致以下HTML(注意:所有数据绑定的东西都是针对knockout.js绑定处理程序,它触发上面的JS):
<div class="chart" data-bind="
barChart: {
data: rowData,
categoryTextKey: 'label',
valueKey: 'keyOnObject',
xAxis: {
title: 'xAxisTitle',
domain: [-1, 1]
},
yAxis: {
title: 'yAxisTitle'
},
onClick: onLabelClick,
formatValueText: formatPercentage
}
"></div>
<div class="axis-title y-axis-title">Y Title</div>
<div class="chart-canvas"></div>
<svg xmlns="http://www.w3.org/2000/svg" class="x-axis" />
<div class="axis-title x-axis-title">X Title</div>
</div>
Run Code Online (Sandbox Code Playgroud)
最后,我还使用flexbox CSS规则来布局我的HTML.我不确定这是否会影响这个问题,但这里有CSS,以防它有所帮助:
.chart {
.flexbox();
.flex-direction(column);
height: 100%;
width: 100%;
.chart-label-click {
cursor: pointer;
}
.chart-header,
.axis-title,
.x-axis {
.flex-grow(0);
.flex-shrink(0);
}
.chart-canvas {
.flex-grow(1);
.flex-shrink(1);
overflow-x: hidden;
overflow-y: auto;
width: 100%;
}
.chart-canvas svg {
display: block;
width: 100%;
}
.axis-title {
font-weight: bold;
}
.x-axis {
.flexbox();
.flex-grow(0);
.flex-basis(20px);
margin-bottom: 5px;
overflow: visible;
width: 100%;
}
.x-axis line,
.x-axis path {
fill: none;
stroke: #d1d1d1;
stroke-width: 1px;
shape-rendering: crispEdges;
}
}
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助.我不知道如何解决这个问题,因为它在我们的应用程序的一个部分是间歇性的,我们的代码库非常大,可以找出其他文件中可能导致此问题的代码的确切组合.
评论中描述了至少对我们有用的解决方法:您必须设置style="pointer-events: none;"use 元素。或者简单地将其添加到您的 css 中:
svg use { pointer-events:none; }
Run Code Online (Sandbox Code Playgroud)
但请注意,这也会禁用在 use 元素上触发的任何鼠标事件。
| 归档时间: |
|
| 查看次数: |
1301 次 |
| 最近记录: |