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

时间:2014-12-26 16:08:15

标签: javascript jquery html model-view-controller yii

我收到了以下错误消息:

  

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

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

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();
    }
}

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

1 个答案:

答案 0 :(得分:14)

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

        cmd: window.cmd,
        id: window.id_hasilsurvey,
        id_daftar: window.id_daftar,
        id_jadwal: window.id_jadwal,

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


编辑和扩展

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

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

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

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

使用此HTML:

<input type="hidden" id="test1" value="test1_val" />

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

$(document).ready(function() {
    var data = {
        test1: $("#test1")
    }
    JSON.stringify(data)
});

然而这样就可以了:

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

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


<强>更新

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

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

来修复

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