Javascript Knockout.js';启用';绑定隐藏IE8中的按钮元素

Javascript Knockout.js';启用';绑定隐藏IE8中的按钮元素,javascript,html,css,knockout.js,internet-explorer-8,Javascript,Html,Css,Knockout.js,Internet Explorer 8,我的网站显示的这种行为真的很奇怪,但下面是描述(我会尽可能地描述它,它是一个更大的基于web的应用程序的一部分): 我有一个页面,允许用户为客户创建、阅读、更新、删除过滤器(即年龄、家庭规模等) 表单是动态填充的(使用ajax),它是使用knockouts-foreach绑定有效生成的(有几种表单是根据ajax请求和过滤器的数量生成的) 当用户更新过滤器时,发生的一件事是发生一些验证(日期、家庭规模、数字等),然后显示一个保存按钮和一个取消按钮 CSS最初会隐藏这两个按钮,然后在编辑过滤器时,这

我的网站显示的这种行为真的很奇怪,但下面是描述(我会尽可能地描述它,它是一个更大的基于web的应用程序的一部分):

我有一个页面,允许用户为客户创建、阅读、更新、删除过滤器(即年龄、家庭规模等)

表单是动态填充的(使用ajax),它是使用knockouts-foreach绑定有效生成的(有几种表单是根据ajax请求和过滤器的数量生成的)

当用户更新过滤器时,发生的一件事是发生一些验证(日期、家庭规模、数字等),然后显示一个保存按钮和一个取消按钮

CSS最初会隐藏这两个按钮,然后在编辑过滤器时,这两个按钮都会变为可见,并且根据验证是否通过/失败,使用knockout启用绑定来启用/禁用save按钮。(我们也有服务器端验证,但这与此问题无关)

除IE8外,所有浏览器都可以正常工作(IE8是我们客户端此web应用必须支持的浏览器)

在IE8中,当验证失败时,保存按钮会像往常一样被禁用,但在用户将鼠标移动几个像素之前,它仍然隐藏在页面中

<div id="filter-editor" class="menu-list" data-bind="foreach: filters">
  <form class="form-inline new-filter-form">
    <select class="input-medium" data-bind="options: $root.fields, optionsText: 'name', value: attribute"></select>
    <select class="input-small" data-bind="options: $root.getFilteredOperators($data), optionsText: 'symbol', optionsValue: 'index', optionsCaption: 'Choose...', value: operator"></select>
    <input type="text" class="input-small editable editing"
data-bind="css: {'invalid': !isValid()}, value: value,  valueUpdate: ['keyup']"/>
    <span data-bind="css: {'hidden': !isDirty()}">
      <button class="btn btn-small btn-success" title="Save changes" data-bind="enable: isValid, click: $root.saveCondition.bind(null, $parent, $data)">Save</button>&nbsp;
      <button class="btn btn-small" title="Cancel changes" data-bind="click: $root.cancelConditionEdit.bind(null, $parent, $data)">Cancel</button>
    </span>
  </form>
</div>

拯救
取消
isValid()方法返回true/false(布尔值),然后启用/禁用按钮。我不明白为什么在鼠标移动之前按钮会被隐藏起来。我们在任何地方都没有鼠标事件。有什么建议吗

编辑: 我已经成功地使按钮在IE8中显示一致。我在save按钮中添加了一个“css”绑定,这将强制按钮始终显示,而不管它是否应用了禁用或启用的属性

<button class="btn btn-small btn-success" title="Save changes" data-bind="css: {'blah': 'blah'}, enable: isValid, click: $root.saveCondition.bind(null, $parent, $data)">Save</button>
保存

然而,CSS绑定似乎只是导致DOM更新,即使我在其中添加了无意义的属性和值。这是一个快速解决方案,但为什么IE8上会出现这种情况,为什么CSS绑定会解决它?

尝试用以下方式将所有绑定括在引号中:

<button class="btn btn-small btn-success" title="Save changes" data-bind="'css': {'blah': 'blah'}, 'enable': isValid, 'click': $root.saveCondition.bind(null, $parent, $data)">Save</button>
保存

IE8不太喜欢淘汰,所以这可能会解决一些问题。

您使用的是引导程序吗?尝试删除这些样式,看看是否有效。敲除绑定仅适用于标准控件。我正在使用引导,但所有代码都可以跨浏览器工作,除了这个仅适用于IE8的小故障。查找我在某处读到的数据绑定标记的顺序,其中一些标记可以按特定顺序进行评估,并可能导致错误的行为良好建议,但问题是,当我离开css数据绑定时,save按钮在禁用时被完全隐藏(即通过敲除启用绑定)。当用户将鼠标移动几个像素时,IE8/knockout似乎会刷新DOM,并显示处于禁用状态的disabled按钮。CSS绑定在某种程度上消除了这个问题,只要它被放入(即使是无意义的值),按钮就会显示在禁用状态,而不是隐藏起来——这就是应该发生的事情。CSS绑定是修复的关键。尝试消除所有的数据包,然后一次一个地放回去,直到你发现哪一个出现了问题。我也有同样的问题,这是ie8不喜欢的淘汰赛。这可能是一个造成问题的完全随机绑定,css停止问题只是因为它以某种方式更改了规则。