【问题标题】:Knockout.js with jquery ui datepicker works everywhere except IE带有 jquery ui datepicker 的 Knockout.js 可以在除 IE 之外的任何地方使用
【发布时间】:2012-11-24 12:29:45
【问题描述】:

我使用了一个 knockout.js 模板脚本来创建一个可以复制和删除的表单。小提琴可以在here找到。

我在 SE 的帮助下编辑了脚本以添加 jquery-ui 日期选择器。可以在 [这里][2] 找到小提琴的简短版本。到目前为止一切都很好,但是在测试时我发现除了 IExplorer(各种版本)之外,一切都可以在任何浏览器中运行。

问题出在这个特定的部分,但我不知道在哪里。

script type='text/javascript'>//<![CDATA[ 
ko.bindingHandlers.datepicker = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        var options = allBindingsAccessor().datepickerOptions || {};

        console.log("datepicker");                        
        $(element).datepicker(options);

        //handle the field changing
        ko.utils.registerEventHandler(element, "change", function () {
            var observable = valueAccessor();
            observable($(element).datepicker("getDate"));
        });

        //handle disposal (if KO removes by the template binding)
        ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
            $(element).datepicker("destroy");
        });

    }
};

现在我们也开始了。当您在框外单击时,日期选择器不会关闭。这发生在任何浏览器中。

其他问题

  1. 我使用这个(和许多其他的)来自动更正一个字段。在这种情况下,输入大写。这在第一种形式上效果很好。但不能在任何重复的表格上。

    $(".hoofdletters").keyup(function(e) { $(".hoofdletters").val(($(".hoofdletters").val()).toUpperCase()); });

  2. 当我使用 uniqueName: true 时,每个字段(也包括重复的表单)都会得到验证。但是我的 $_POST 名称都被重命名了。我想要原始字段名称,例如 year[] 而不是 ko_unique_1。删除 uniqueName 时有效,但重复的表单不再有效。

    [2]:http://jsfiddle.net/QUxyy/5/enter code here

【问题讨论】:

  • 删除“console.log”指令应该可以正常工作。出于某种原因,当控制台打开时(F12),IE 只接受 console.log。
  • 谢谢!如果您将其添加为答案,我可以接受。我现在投了赞成票。您还知道为什么日期选择器保持打开状态吗?以及如何使用 dd-mm-yyyy 而不是 mm-dd-yyyy?
  • 将 console.log 更改为 window.console.log 使代码与所有浏览器兼容,并为支持它的人保留控制台日志
  • 谢谢,会试试的!我投了赞成票。您能否也检查一下我的其他问题?提前谢谢!

标签: jquery jquery-ui internet-explorer knockout.js datepicker


【解决方案1】:
  1. 要使代码在 IE 上运行:删除“console.log”指令
  2. 要更改日期格式,您可以定义如下绑定:

    data-bind='datepicker: beschikkingsdatum, datepickerOptions: {dateFormat: "dd/mm/yy"}, uniqueName: true'

【讨论】:

  • 谢谢!这行得通。我投了赞成票。顺便说一句,我发现了另外两个错误(在 startpost 中)。如果您有时间,请您检查一下吗?
  • @Mat 不更新您的原始帖子,而是提出新问题。原始问题已得到解答,您接受了答案:)
  • whosrdaddy > 我不想让网站充斥着新手问题。
【解决方案2】:

两件事:

就像我在 cmets 中所说,使用 window.console.log(或包装函数)而不是 console.log 来防止不知道控制台对象的旧浏览器出现错误。

我使用这个(和许多其他的)来自动更正一个字段。在这种情况下 大写输入。这在第一种形式上效果很好。但不是 在任何重复的表格上。

替换:

$(".hoofdletters").keyup(function(e) { $(".hoofdletters").val(($(".hoofdletters").val()).toUpperCase()); });

与:

$(".hoofdletters").on('keyup', '#<some root element>', function(e) { $(".hoofdletters").val(($(".hoofdletters").val()).toUpperCase()); });

这样你就可以保证未来的元素接收到 keyup 处理程序 需要根元素来限制 on 函数的 DOM 监控范围。理想情况下,这将是一个 DIV 元素

【讨论】:

  • 感谢您的帮助。我复制了你的代码并替换了我的。我尝试将您的 # 替换为 之类的根元素(带有和不带有标签。我还尝试使用根的 id 或元素本身。一切都不起作用。我的 HTML 看起来像这样:
  • @Mat: 像这样向你的 Span 添加一个 ID 现在你可以使用 $(".hoofdletters").on('keyup', '#Myid', ...
  • 很抱歉给您带来这些问题。但是我按照你说的做了,具体字段填的是:[object HTMLElement]
  • @MAt:然后尝试不使用根元素,这应该可以。更多关于 JQuery 'on' 的信息可以在这里找到:api.jquery.com/on
猜你喜欢
  • 1970-01-01
  • 2015-08-10
  • 2022-07-03
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多