无法阅读' selectionStart'来自' HTMLInputElement'的财产:

时间:2015-12-02 00:58:48

标签: javascript jquery knockout.js

我使用绑定处理程序。如果我删除此代码,我的代码将保存。但如果我使用 这段代码会引发错误。

未捕获的InvalidStateError:无法读取' selectionStart'属性来自' HTMLInputElement':输入元素的类型('复选框')不支持选择。

 ko.bindingHandlers.wysiwyg = {
        init: function (element, valueAccessor, allBindingsAccessor) {
            debugger;
            var options = allBindingsAccessor().wysiwygOptions || {};
            var value = ko.utils.unwrapObservable(valueAccessor());

                    //value = value.text();
            //var v = value[0].childNodes[0].data;
            var $e = $(element);

            $.extend(true, {
                initialContent: value
            }, options);

            $e.wysiwyg(options);

            //handle the field changing
            function detectFn() {
                var observable = valueAccessor();
                var newvalue = $e.wysiwyg("getContent");
                observable(newvalue);
            }

            var current = $e.wysiwyg('document');
            var timer;
            current.bind({
                keyup: function () {
                    clearTimeout(timer);
                    timer = setTimeout(detectFn, 1000);
                }
            });

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


        },
        update: function (element, valueAccessor) {
            var value = ko.utils.unwrapObservable(valueAccessor());

            $(element).wysiwyg("setContent", value);
            ko.bindingHandlers.value.update(element, valueAccessor);
        }
    };

3 个答案:

答案 0 :(得分:3)

您的HTML中有inputtype="checkbox"元素,其中Javascript代码需要type="text"

checkbox没有文字,因此无法进行任何选择。但是您的代码尝试访问不存在的属性selectionStart

请查看https://jsfiddle.net/u99f0q1j/以查看问题。

由于您没有发布HTML,因此很难看出导致错误的原因。

但是在您的浏览器开发工具中,您应该能够单击“未捕获的InvalidStateError”消息旁边的行号,以便查看试图访问复选框上selectionStart属性的Javascript行。

答案 1 :(得分:1)

有一些DOM元素的值无法通过使用jQuery的.val()或DOM .value获得。一个例子是HTML5 number字段;另一个是复选框。

我不确定发生此异常的 - 您可以通过在绑定处理程序中注释掉行并使用反复试验来轻松找到。我可以将您的绑定处理程序复制到测试页面中,但我不知道您将它绑定到哪个HTML。但是,我怀疑你会发现你必须做一些元素类型检查,并为不同类型的DOM元素实现不同的逻辑。

我的建议是将您的init功能更改为

init: function(element, valueAccessor, allBindingsAccessor) {
    var options = allBindingsAccessor().wysiwygOptions || {},
        value = ko.utils.unwrapObservable(valueAccessor());

    /*
        the rest of your init function, commented-out
    */
}

验证此没有抛出异常,然后逐块取消注释剩余的脚本,在每次修改后重新加载页面,直到找到异常原因。

答案 2 :(得分:0)

$.ajax({
        processData: false,
        contentType: false,
        type:"POST",

添加processData =falsecontentType = false。这对我有用。