Javascript 这怎么会是错误的?

Javascript 这怎么会是错误的?,javascript,if-statement,Javascript,If Statement,当我单步执行此代码时,图中的值会导致cssLoaded=0;从我所看到的,长度大于0,并且cssStylesheet.sheet具有属性,因此应该为true,因此cssLoaded应该设置为1,但是它没有发生。我一定是错过了什么 function _cssIsLoaded(cssStylesheet, stylePath) { var cssLoaded = 0; if (tryCount == 3){ console.log('oops'); } if (cssStylesheet.h

当我单步执行此代码时,图中的值会导致cssLoaded=0;从我所看到的,长度大于0,并且cssStylesheet.sheet具有属性,因此应该为true,因此cssLoaded应该设置为1,但是它没有发生。我一定是错过了什么

function _cssIsLoaded(cssStylesheet, stylePath) {
var cssLoaded = 0;
if (tryCount == 3){
    console.log('oops');
}
if (cssStylesheet.href == stylePath){
    try {
        if ( cssStylesheet.sheet && cssStylesheet.sheet.cssRules.length > 0 ){
            cssLoaded = 1;}
        else if ( cssStylesheet.styleSheet && cssStylesheet.styleSheet.cssText.length > 0 ){
            cssLoaded = 1;}
        else if ( cssStylesheet.innerHTML && cssStylesheet.innerHTML.length > 0 ){
            cssLoaded = 1;}
        }
        catch(ex){ }
}
    if(cssLoaded) {
        //alert('cssloadedcomplete');
        resetPops();
        $('#video-overlay').show();
        positionElements();
        saveBizzmail();
        console.log('try:' + tryCount)
    } else {
        tryCount+=1;
        console.log('try:' + tryCount);
        setTimeout(function() { this._cssIsLoaded(cssStylesheet); }, 2000);
    }
}

您必须检查元素是否存在,否则可能会发生错误(
cssStylesheet.sheet
is
undefined
)。在以下情况下,表达式的计算结果将为false:

  • 变量不存在(
    undefined
    null
    void 0
  • 等于
    0
    (零)
  • 等于
    false
  • 等于空字符串(
    “”
    “”
  • 非数字值(
    0/0
    NaN
请注意,空对象
{}
的计算结果为true,因为它是一个对象

另一个例子:

if(window.addEventListener) window.addEventListener("load", function(){}, true);
else if(window.attachEvent) window.attachEvent("onload", function(){});
else window.onload = function();

如果If条件不存在,代码将在IE的旧版本中抛出一个错误,该版本没有名为
窗口的方法。addEventListener

前一个检查确保您避免出现类似NPE的情况(通过检查
cssStylesheet.sheet
不为空).

您的代码有三种可能的方式获得cssladed==0

  • if(cssStylesheet.href==stylePath)
    的计算结果为
    false
  • 所有三条
    if/else
    语句的计算结果均为
    false
  • 其中一个
    if/else
    语句引发异常,因此另一个
    if/else
    语句不会执行
  • 在故障排除过程中,您应该确认前两个不是问题所在,因为它们可能只是比较中的逻辑错误,或者进入函数的数据不是您期望的数据

    对于第三个问题,您可以实施防御性编码,通过将代码更改为该值来确保检查所有三个
    if/else
    语句(您甚至不再需要try/catch,因为它允许您的代码绕过某些测试):


    是否满足以下条件:
    if(cssStylesheet.href==stylePath){
    pass?cssStylesheet.sheet的计算结果是什么?@jasonbar哇..是的。就像一匹戴着眼罩的马!p那样做了!很有意义..不过,我的主要问题是,为什么在上述情况下两者或其中一个都是“假”的。另一个问题没有真正的关联..只是意识流..我把它删掉了。如果,其中一个:“是否存在
    cssStylesheet.sheet
    ?”如果,两个:“是
    cssStylesheet.sheet.cssRules
    的长度属性大于0”?如果一个和两个为真,则计算表达式。第一个表达式用于防止JavaScript错误,第二个表达式是特定的函数逻辑。
    function _cssIsLoaded(cssStylesheet, stylePath) {
        var cssLoaded = 0;
        if (tryCount == 3){
            console.log('oops');
        }
        if (cssStylesheet && cssStylesheet.href == stylePath) {
            if ( cssStylesheet.sheet && cssStylesheet.sheet.cssRules && cssStylesheet.sheet.cssRules.length > 0 ) {
                cssLoaded = 1;
            }
            else if ( cssStylesheet.styleSheet && cssStylesheet.styleSheet.cssText && cssStylesheet.styleSheet.cssText.length > 0 ) {
                cssLoaded = 1;
            }
            else if ( cssStylesheet.innerHTML && cssStylesheet.innerHTML.length > 0 ) {
                cssLoaded = 1;
            }
        }
        if(cssLoaded) {
            //alert('cssloadedcomplete');
            resetPops();
            $('#video-overlay').show();
            positionElements();
            saveBizzmail();
            console.log('try:' + tryCount)
        } else {
            tryCount+=1;
            console.log('try:' + tryCount);
            setTimeout(function() { this._cssIsLoaded(cssStylesheet); }, 2000);
        }
    }