zoukankan      html  css  js  c++  java
  • JavaScript之Unspecified error或无法设置selected属性。未指明的错误。解决方案

      今天郁闷了大半天,从下午1点多开始到4点多,一直被一个JS的问题困扰,后来终于解决,写下作为笔记供自己以后查看吧。

      问题背景:自己写了一个多级联动的控件,其实加载数据均采用jQuery的ajax+json方式来调取和填充,方法如下:

    $.getJSON("/Ajax/xxx.ashx", { "action": "xx", "parentid": parentId, "r": Math.random() }, function (data) {
        $.each(data.codelist, function () {
            $("#sel_xx").append(sp.format("<option value=\"{0}\">{1}</option>", this.Id, this.Title));
        });
        if (_val != "")
            $("#sel_xx").val(_val); //设置默认值--就是这在出的问题
        $("#sel_xx").change();
    });

      以上方法在IE7、IE8、火狐、Google等浏览器中测试均正常,默认值可以正常加载。可以在IE6中测试时出现了如下错误:
      IETester中:
    JavaScript之Unspecified error或无法设置selected属性。未指明的错误。解决方案 - Greatwang - 追求属于自己的一切
      纯IE6中:

    JavaScript之Unspecified error或无法设置selected属性。未指明的错误。解决方案 - Greatwang - 追求属于自己的一切
     
      想必上面的错误大家也碰到过,网上也有很多“解决”办法,但是都不能最终性的解决问题,这里简单的列出作为对比吧(这样映像会更深刻):

    方法1,使用这种赋值方法:(不能解决

    $("#sel_xx option[value='" + _val + "']").attr("selected", true);

    方法2,使用setTimeout延时一下,这种时好时坏,(也不能解决

    setTimeout(function () {
        if (_val != "")
            $("#sel_xx").val(_val);
        $("#sel_xx").change();
    }, 100);

    ……还有好多,我一一都试了,无法解决。

      
      问题分析与解决方案:在IE6中出现这种错误的根本原因是,其DOM加载的原理与其它浏览器有些不一样,的确存在延时的问题,上面我们是先向select表单填写了option选项,然后即刻对其设置了selected属性值,在IE6中不能这样做,那么我们如何解决呢?就是在向select表单填写option选项的同时,将selected属性一并赋上。方法如下:

    $.getJSON("/Ajax/xxx.ashx", { "action": "xx", "parentid": parentId, "r": Math.random() }, function (data) {
        $.each(data.codelist, function () {
            $("#sel_xx").append(sp.format("<option value=\"{0}\"{2}>{1}</option>", this.Id, this.Title, this.Id == _val ? " selected=\"selected\"" :""));
        });
        if (_val != "")
            $("#sel_xx").val(_val);
        $("#sel_xx").change();
    });

      问题完美解决。
     
      上面代码中sp.format是自定义的方法,其功能类似于.net中的format,在此将方法分享给大家:

    //格式化字符串,与.net类似
    function format() {
        if (arguments.length == 0) return null;
        var str = arguments[0];
        for (var i = 1; i < arguments.length; i++) {
            var re = new RegExp('\\{' + (i - 1) + '\\}', 'gm');
            str = str.replace(re, arguments[i]);
        }
        return str;
    }




     

  • 相关阅读:
    正向代理和反向代理的区别
    response对象和request对象详解
    非controller层获取response和request对象
    Java中的Lock与synchronized
    如何解决jeecgBoot前端运行项目之后无法获取验证码的问题
    怎么定义一个自己的vue组件
    前端集成方案——理论(二)
    javascript基础-ajax
    网页中文乱码
    javascript基础-事件2
  • 原文地址:https://www.cnblogs.com/greatwang/p/2711807.html
Copyright © 2011-2022 走看看