a标记跳转问题

时间:2022-06-01 20:20:51

今天解决discuz弹窗不弹出直接跳转问题。dz中的代码是这样的<a href="{$url}"onclick="showWindow(this.id, this.href, 'get', 0);">我下意识的认为知啊要在showwindow函数中写return false,就会截断跳转,方便自己调试,然而添加之后仍然跳转想不明白是那里错了。随后onclick="showWindow(this.id, this.href, 'get', 0);return false;" 这样写就不会跳转,一时没反应过来 它函数里边加return false的区别,仔细想过之后才明白。在函数里写return false;结果是onclick="false"而正确的写法是onclick="return false" 差之千里。隐约记得以前也犯过这样的错误,为什么再遇到就印象很少呢,总结下是因为之前解决只是单纯的解决,并没有仔细理顺,这次犯这个错误也是没有仔细理顺

另外discuz中为什么 就onclick="showWindow(this.id, this.href, 'get', 0);" 这样就可以呢

加了断点调试过之后发现在showWindow函数结尾调用了 doane。由doane函数 阻止a标记跳转。


function doane(event, preventDefault, stopPropagation) {
    var preventDefault = isUndefined(preventDefault) ? 1 : preventDefault;
    var stopPropagation = isUndefined(stopPropagation) ? 1 : stopPropagation;
    e = event ? event : window.event;
    if(!e) {
        e = getEvent();
    }
    if(!e) {
        return null;
    }
    if(preventDefault) {
        if(e.preventDefault) {
            e.preventDefault();
        } else {
            e.returnValue = false;
        }
    }
    if(stopPropagation) {
        if(e.stopPropagation) {
            e.stopPropagation();
        } else {
            e.cancelBubble = true;
        }
    }
    return e;
}

stopPropagation的作用跟cancelBubble是一样的.都是用来阻止浏览器默认的事件冒泡行为.
他们的不同之处是:stopPropagation符合W3C标准.适用于FireFox等浏览器,不支持IE.而cancelBubble方法不符合W3C的标准.且只支持IE浏览器