IE中的Jquery错误

时间:2012-03-12 16:17:54

标签: javascript jquery json

我一直试图在过去的几个小时内解决这个问题,并希望有人可以提供帮助。我在使用JQuery 1.6.4在单击按钮时进行ajax调用,并使用结果填充表的内容。代码在IE以外的所有浏览器中都能正常工作。当我在IE中运行它时,会填充一些值,其余的不是,非常奇怪!

当我运行脚本并使用IE的调试工具时,我收到以下错误;

  

对方法或属性访问的意外调用(第3行)

有谁知道我做错了什么?这是我运行ajax的代码;

$(document).ready(function(){

$("#find").click(function ()    {

    //Set kinase
    var kinaseEntry = $("#kinaseEntry").val();
    var dataString = "kinaseEntry=" + kinaseEntry;

    //Fetch list from database
    $.ajax({
        type : "GET",
        url : "http://www.webaddress/php/post.php",
        datatype: "json",
        data:   dataString,
        success : function(datas)   {

            //SET VARIABLES TO BE USED THROUGHOUT PAGE
            var kinaseName = (datas.skuName);
            var molecularWeight = (datas.molecularWeight);
            var kinaseConc = (datas.kinaseConc);
            var anti1Name = (datas.antiName);
            var anti2Name = (datas.antiName2);
            var antiConc = (datas.antiConc);
            var antiConc2 = (datas.antiConc2);
            var tracerName = (datas.tracerName);
            var tracerConc = (datas.tracerConc);
            var tracerStockConc = (datas.tracerStockConc);
            var tracerSku = (datas.tracerSku);
            var kinaseSku = (datas.kinaseSku);
            var antiSku = (datas.antiSku);
            var antiSku2 = (datas.antiSku2);
            var bufferName = (datas.bufferName);
            var bufferSku = (datas.bufferSku);

            //REAGENT NAMES
            $(".kinaseName").html(kinaseName + " (" + molecularWeight + " kDa)");
            $(".anti1Name").html(anti1Name);
            $(".anti2Name").html(anti2Name);
            $(".tracerName").html(tracerName);
            $(".bufferName").html(bufferName);

            //DEFAULT VALUES
            $(".defaultKinaseConc").html(kinaseConc);
            $(".defaultAntiConc").html(antiConc);
            $(".defaultAnti2Conc").html(antiConc2);
            $(".defaultTracerConc").html(tracerConc);
            $("#molecularWeight").val(molecularWeight);
            $("#tracerStockConc").val(tracerStockConc);

            //INSERT DEFAULTS INTO INPUT
            $("#userKinaseConc").val(kinaseConc);
            $("#userAntibodyConc1").val(antiConc);
            $("#userAntibodyConc2").val(antiConc2);
            $("#userTracerConc").val(tracerConc);
        },
        error : function (XMLHttpRequest, textStatus, errorThrown) {
            console.log("error :"+XMLHttpRequest.responseText);
        }
    });
    return false;
}); });

名称填充正常,第一个默认值会被填充,但其余的则会中断。任何帮助将不胜感激。

以下是我的console.log();

的结果
antiConc
    "2"

antiConc2
    "2"

antiName
    "Biotin-anti-His"

antiName2
    "Eu-Streptavidin"

antiSku
    "PV6089"

antiSku2
    "PV5899"

bufferName
    "Kinase Buffer A"

bufferSku
    "PV3189"

cleanSKU
    null

kinaseConc
    "5"

kinaseSku
    "P3049"

molecularWeight
    "125.4"

skuName
    "ABL1"

tracerConc
    "100"

tracerName
    "Kinase Tracer 1710"

tracerSku
    "PV6088"

tracerStockConc
    "25"

2 个答案:

答案 0 :(得分:0)

你确定它在其他浏览器中正常 ,或者它们只是没有明显破坏。

我猜你在这里发生了混合更新(从val()和html()使用的推断)。我注意到一种模式,其中由id(例如,#userKinaseConc)检索的元素和由类检索的元素(例如,.kinaseName)分别使用val()和html()。但是,#defineAntiCon打破了这种模式。你正在为这个元素使用html()。此元素是输入还是其他表单字段?这应该是val()?

通过html()setter而不是val()尝试将值应用于输入字段,您描述的体验可以是re-created,但它仍然不适用于该特定字段所有的值... IE以外的浏览器只是失败了,错误变得不破。在IE中,它将破坏执行。 #defAntiCon是否实际上是根据其他浏览器返回的数据填充的?

答案 1 :(得分:0)

IE8严格关于HTML插入。如果您的标记无效,或者具有HTML5特定标记,则会引发错误。

我没有真正的解决方案,但我会按照这些步骤使其有效。

  1. 确保您的datas包含有效的HTML,确保没有额外的结束标记或语法错误(如果需要,您可以使用validator
  2. 如果您使用的是HTML5代码,则可以尝试使用html5shiv来确保浏览器能够理解所有代码
  3. 在某些情况下,您不要使用.val()代替.html()
  4. 您应该将.html(datas.foo)替换为.text(datas.foo),因为您要将字符串传递给方法。
  5. 如果您没有找到任何解决方案,可以通过执行以下更改在jQuery catch方法中添加resolveWith块(参考您的评论):
  6. 替换这个:

    resolveWith: function ( context, args ) { 
        if ( !cancelled && !fired && !firing ) { 
            // make sure args are available (#8421) 
            args = args || []; firing = 1;
            try {
                while ( callbacks[ 0 ] ) { callbacks.shift().apply( context, args ); } 
            } finally { 
                fired = [ context, args ]; 
                firing = 0; 
            }
        }
        return this ;
    },
    

    用这个:

    resolveWith: function ( context, args ) { 
        if ( !cancelled && !fired && !firing ) { 
            // make sure args are available (#8421) 
            args = args || []; firing = 1;
            try {
                while ( callbacks[ 0 ] ) { callbacks.shift().apply( context, args ); } 
            } catch (err) {
    
            } finally { 
                fired = [ context, args ]; 
                firing = 0; 
            }
        }
        return this ;
    },
    

    IE is reported here

    中的try-finally上的错误

    希望这有帮助。

    修改正如@Josh在评论中提到的那样,has been reported错误并在this commit中解决了 jQuery 1.7.x 。您的jQuery的简单更新应该有效。