【发布时间】:2015-08-19 15:17:06
【问题描述】:
我最近为我公司的新 html 应用程序实现了一个自定义 SVG 图标控件。实施后不久,我们的质量部门开始报告 IE 11 在使用该应用程序时随机“崩溃”。
我不确定崩溃一词是否准确描述了正在发生的事情。应用程序进入一个状态,元素将不再接受鼠标或键盘输入,也不会改变显示以显示悬停样式。但是,当您将鼠标悬停在按钮和输入元素上时,光标图像会相应地发生变化,并且可以使用鼠标滚轮(但只能使用鼠标滚轮)滚动可滚动部分。
当应用程序处于这种状态时,我运行了 UI Responsiveness Profiler,发现没有运行客户端脚本,只有 IE 的垃圾收集器。经过一周的测试,我终于确定,当用户单击使用 svg 元素生成的图标时触发状态,但仅当单击触发从 DOM 中删除单击的 svg 元素的函数时。
这是一个有助于解释/重现问题的代码笔: http://codepen.io/GooeyIdeas/pen/WvpPzP
以及娱乐的最低标准:
// This is a simple *viewmodel* - JavaScript that defines the data and behavior of your UI
function AppViewModel() {
var self = this;
this.isLocked = ko.observable(false);
this.toggleLock = function(){
self.isLocked(!self.isLocked.peek())
}
}
ko.applyBindings(new AppViewModel());
svg use{
cursor: crosshair;
}
svg{
border: 1px solid #eeeeee;
cursor: default;
}
svg:hover{
border-color: #dedede;
background: #cecece;
}
#svg-icons{
display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>The cursor will change into a crosshair if you are hovering over the correct element.</div>
<div>
<!-- ko if: isLocked -->
<svg class="ux-icon-svg" width="24" height="24"><use data-bind="click: toggleLock" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#locked"></use></svg>
<!-- /ko -->
<!-- ko ifnot: isLocked -->
<svg class="ux-icon-svg" width="24" height="24"><use data-bind="click: toggleLock" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#unlocked"></use></svg>
<!--/ko-->
</div>
<svg xmlns="http://www.w3.org/2000/svg" id="svg-icons">
<symbol viewBox="0 0 24 24" id="unlocked">
<path d="M18,9h-1V7c0-2.8-2.2-5-5-5S7,4.2,7,7h1.9c0-1.7,1.4-3.1,3.1-3.1s3.1,1.4,3.1,3.1v2H6c-1.1,0-2,0.9-2,2v9c0,1.1,0.9,2,2,2
h12c1.1,0,2-0.9,2-2v-9C20,9.9,19.1,9,18,9z"></path>
</symbol>
<symbol viewBox="0 0 24 24" id="locked">
<path d="M18,9h-1V7c0-2.8-2.2-5-5-5S7,4.2,7,7v2H6c-1.1,0-2,0.9-2,2v9c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-9C20,9.9,19.1,9,18,9z
M15.1,9H8.9V7c0-1.7,1.4-3.1,3.1-3.1s3.1,1.4,3.1,3.1V9z"></path>
</symbol>
</svg>
有没有人遇到过这种情况?有谁知道仍然可以让我使用 SVG 'use' 元素的解决方法?我需要澄清什么吗?
*编辑 似乎有些人无法重现此错误。我想知道是否有其他人可以重现此错误,如果不能,您运行的是哪个版本的 Windows?
**编辑 看起来这个错误在 Windows 8 PC 上不存在。为了确保我在示例中添加了 CSS,当您将鼠标悬停在 svg use 元素上时,它会将光标变为十字准线,因为您必须单击该元素才能触发崩溃。
【问题讨论】:
-
似乎有些人无法重现此错误。我想知道是否有其他人可以重现此错误,如果不能,您运行的是哪个版本的 Windows?
-
我无法从小提琴中重现该问题,在 win server 8.1 IE11 中运行
-
Windows 8 PC 上似乎不存在此错误。我在示例中添加了 CSS,当您将鼠标悬停在 svg use 元素上时,它会将光标变为十字准线,因为您必须单击该元素才能触发崩溃。只是为了确保我们不会错过点击
-
你用的是什么win机器?
-
我现在可以在我的 win 7 机器上确认该错误,以为我最初没有 IE 11。但就解决方法而言,我不知道。假设您必须使用
标签: javascript html svg knockout.js internet-explorer-11