Javascript:未捕获的 InvalidStateError:无法读取“selectionDirection”

Posted

技术标签:

【中文标题】Javascript:未捕获的 InvalidStateError:无法读取“selectionDirection”【英文标题】:Javascript : Uncaught InvalidStateError: Failed to read the 'selectionDirection' 【发布时间】:2015-02-23 21:27:43 【问题描述】:

我收到此错误消息:

未捕获的 InvalidStateError:无法从“htmlInputElement”读取“selectionDirection”属性:输入元素的类型(“隐藏”)不支持选择。

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

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

谁能解释一下这里发生了什么?

【问题讨论】:

具体哪一行有错误?有堆栈跟踪吗?该错误似乎不言自明;某些东西(可能不在此代码中,但在它调用的东西中,例如 notifikasiinitialize)可能正在尝试读取隐藏元素上的 selectionDirection 【参考方案1】:

在您的 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,

尝试将这些注释掉,看看您的错误是否消失。如果是这样,那么问题可能可以通过在有问题的行末尾添加.val() 来解决。


编辑和扩展

(2015 年 4 月 9 日)自从我写下这个答案以来,已经有 3 个赞,而且都及时展开,所以我猜其他人遇到了这个错误并找到了这个答案,所以这里有一个更一般的解释来帮助人们出去。

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

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

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

使用此 HTML:

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

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

$(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 对象。

火狐也可以。不过,Safari 9.1.1 仍然会引发错误 - JSON.stringify 上的 TypeError 可以通过添加 .val()

来修复

于是出现了一个小项目,用于查找 Chrome 错误报告及其修复,并将其报告给 Safari。

【讨论】:

这是一个对用户非常不友好的错误信息!这确实有助于澄清我的问题。 显然有些事情发生了变化,因为当我尝试提供的小提琴时,无论我是否将 .val() 附加到 jQuery 调用,它都不会触发错误。 这真的很有趣,感谢您提及。我创建了一个小提琴,它将序列化 jquery 对象的结果打印到控制台。你是对的,它确实工作正常并且产生了相当理智的输出:jsfiddle.net/ptugva6t/16我会看看我是否能弄清楚发生了什么变化。 我尝试了一些旧版本的 jquery,看看是否可以重现问题;即,是 jquery 对象本身的故障吗?但是不,它仍然可以正常工作。所以我认为这必须在最新版本的 Chrome 中得到修复,并改进了 JSON.stringify。如果您在 Safari 中运行小提琴,您仍然会遇到“TypeError”问题,可以使用 .val() 修复...我会更新答案。

以上是关于Javascript:未捕获的 InvalidStateError:无法读取“selectionDirection”的主要内容,如果未能解决你的问题,请参考以下文章

简单代码:JavaScript,未捕获的 ReferenceError:(x) 未定义

未捕获的 ReferenceError:$ 未定义(PHP 中的 JavaScript/HTML)[重复]

jQuery.browser:Javascript 未捕获的类型错误

未捕获的类型错误:无法读取未定义 javascript 的属性“选项”

Javascript 使用严格错误未捕获

在javascript中获取未捕获的异常