Javascript:Uncaught InvalidStateError:无法读取'selectionDirection'

Chr*_*ist 8 html javascript model-view-controller jquery yii

我有这个错误信息:

Uncaught InvalidStateError:无法从'HTMLInputElement'读取'selectionDirection'属性:input元素的类型('hidden')不支持选择.

当我检查控制台时,它在此代码中显示错误:

function simpan() {
    $.ajax({
        url: 'app/tblhasilsurvey/simpan',
        type: 'post',
        async: false,
        data: {
            cmd: window.cmd,
            id: window.id_hasilsurvey,
            id_daftar: window.id_daftar,
            id_jadwal: window.id_jadwal,
            //tblhasilsurvey_nobasurvey : $("#nomor_ba_survey").val(),
            nomor_izin : $("#nomor_izin").val(),
            tgl_izin : $("#tgl_izin").val(),
            pemilik_izin : $("#pemilik_izin").val(),
            lokasi : $("#lokasi").val(),
            kodekel : $("#kelurahan").val(),
            kodekec : $("#kecamatan").val(),
            tblhasilsurvey_tglbasurvey : $("#tgl_ba_survey").val(),
            tbldaftarrencanasurvey_koordinat : $("#lattitude_").val()+';'+$("#longitude_").val(), // (lattitude;longitude)
            tblhasilsurvey_fungsibangunan : $("#fungsi_bangunan").val(),
            tblhasilsurvey_uraianpermasalahan : $("#uraian_permasalahan").val(),
            tblizin_id : $("#tblizin_id").val()
        },
        success: function (data) {
            if(data=='success') {
                notifikasi('Sukses','Data Berhasil Disimpan', 'success');
                //window.location.reload();
            } else {
                notifikasi('Gagal','Data Gagal Disimpan', 'fail');
            }
        }
    });
    if( $("#lattitude_").val() !='' ) window.pos_lat = $("#lattitude_").val(); // jika koordinat terisi maka update posisi lattitude
    if( $("#longitude_").val() !='' ) window.pos_long = $("#longitude_").val(); // jika koordinat terisi maka update posisi longitude

    $("#peta-lokasi").slideDown(1000);
    initialize();
    $("html, body").animate({ scrollTop: $(document).height() }, 2500);
    return false;

    function refresh () {
        window.location.reload();
    }
}
Run Code Online (Sandbox Code Playgroud)

有人能解释一下这里发生了什么吗?

sif*_*day 14

在HTML的某个地方,你有一个<input type='hidden' />你想要添加到数据obj中的东西,但是你可能正在添加jQuery对象,当jQuery对象在某个地方被字符串化时,这个消息可能会被抛出.鉴于您的大多数数据对象是通过显式调用构建的,.val()我猜测问题在于以下其中一个:

        cmd: window.cmd,
        id: window.id_hasilsurvey,
        id_daftar: window.id_daftar,
        id_jadwal: window.id_jadwal,
Run Code Online (Sandbox Code Playgroud)

尝试评论那些,看看你的错误是否消失.如果确实如此,则可以通过添加.val()到有问题的行的末尾来解决问题.


编辑和扩展

(2015年4月9日)自从我写这篇文章以来,这个答案已经有3个赞成,所有这些都是及时传播的,所以我猜其他人都会遇到这个错误并找到答案,所以这里有一个更为一般性的解释来帮助人们.

如果将表示隐藏输入的jQuery对象添加到JS对象,然后尝试将该JS对象序列化为JSON,则会引发此错误.

演示以最简单的形式再现错误:

http://jsfiddle.net/ptugva6t/2/

使用此HTML:

<input type="hidden" id="test1" value="test1_val" />
Run Code Online (Sandbox Code Playgroud)

#test1如果我们使用这个JS,那么会触发错误:

$(document).ready(function() {
    var data = {
        test1: $("#test1")
    }
    JSON.stringify(data)
});
Run Code Online (Sandbox Code Playgroud)

这样就可以了:

$(document).ready(function() {
    var data = {
        test1: $("#test1").val()
    }
    JSON.stringify(data)
});
Run Code Online (Sandbox Code Playgroud)

然而,如果您使用文本输入,则不会遇到此错误,但由于您尝试序列化的对象的复杂性,您可能会遇到其他序列化错误!


UPDATE

(2016年9月7日)看起来这只是一个Chrome错误,并且已在最近的Chrome更新中得到修复.Chrome 52中现在没有任何错误,你可以JSON.stringify一个jquery对象没有问题.

Firefox也行.Safari 9.1.1仍然会抛出错误 - JSON.stringify上的TypeError可以通过添加.val()来修复

因此,有一个迷你项目,找到Chrome错误报告及其修复程序,并将其报告给Safari.