since.2006  

在修改这个日志编辑器时碰到的问题,IE中innerHTML插入html代码如果混杂有css样式表,当css样式插入在元素最前面时,IE会忽略这个样式。

演示(下面代码在IE中字体将是黑色,而firefox中会正确的显示为红色):

<HTML>   
   
<DIV id=test></DIV>   
<SCRIPT>   
document.getElementById("test").innerHTML += "<style>b{color:red}</style><b>hello!World!!!</b>";    
</SCRIPT>   
   
<HTML>

其它参考:PJHome的使用innerHTML插入样式。不过感觉这篇文章中说的不是很正确。

文中提到“IE对这里的顺序要严格要求。必须先插入html内容然后再插入<style>样式才生效。这样test这个div 里就会出现一个红色的 hello!World! 但是如果把<style>放到<b>前头,就被IE无视了。”

感觉上说的是CSS样式表需要放在使用这个样式表的元素前面。而实际上,插入内容时,只要有任意一个其它html元素就行了,比如br,pre,div等。:)

 

Posted by hee at 21:04 PM | Permalink | 评论(0)

IE6的使命终于快结束了,MS再过几天(2月12日)起将强制推送IE7浏览器。如果不想更新到IE7,可以使用MS官方提供的IE7BlockerToolkit

安装后,打开CMD进入安装目录,敲入IE70Blocker.cmd /B即可屏蔽自动更新IE7,换成/U参数则允许自动更新IE7。

对于IE6的结束,我更希望Firefox3的到来。Firefox3中终于支持模态对话框了,在2中虽然支持模态对话框,但需要特殊设置一些权限。

mozilla developer center上,已经可以看到FF3中支持window.showModalDialog(),window.dialogArguments。

最要命的是在FF2中模拟模态对话框会产生某些RP问题,比如FCKEditor(2.5.1)工具栏的帮助按钮在FF中模拟了模态对话框,但在我机器上运行时,多点几次父窗口,再关闭子窗口,CPU占用率就90%以上。

自己写个window.open,以dialog方式弹出再关闭,CPU占用率也有90%以上。简单页面没有测试,但就算弹出的页面复杂一点,CPU也不要一直飙到90%以上。

Firefox3快来吧!

Posted by hee at 21:02 PM | Permalink | 评论(0)

前些天参照extjs做了一个类似的下拉列表组件,做完后发现在IE6下切换背景图片时有明显的延迟,而extjs没有类似情况。

原因是因为IE6中默认没有缓存背景图片,虽然切换时是使用同一样图片,不同位置。但是每次都会发起一次HTTP请求(虽然会返回HTTP状态304)

可以使用如下方法解决:

// 先判断一下是否是ie6    
if (isIE6) {    
    try {    
        document.execCommand("BackgroundImageCache", false, true);    
    } catch (e) {    
    }    
} 
Posted by hee at 13:01 PM | Permalink | 评论(0)
上一篇日志中介绍了tomcat+openssl实现双向认证,但第6步需要用户手工将个人证书及根证书手工导入到IE中去。这里介绍一种自动导入根证书到IE中去的方法。
  • 只自动导入根证书,在原有那篇文章的基础上不需要做什么改动,直接读出根证书内容即可实现。
  • 即自动导入根证书,又要自动导入个人证书,这种情况下,创建证书请求的工作要交给IE控件完成。
微软的ICEnroll接口中提供了createPKCS10acceptPKCS7方法来创建证书,安装证书功能。在ICEnroll3接口中提供了InstallPKCS7,可以使用它来安装根证书。

只自动导入根证书。

<%    
    StringTokenizer st = null;    
    String line = null;    
   
    // ------------------------------------------------------------- 返回CA证书内容 >>>    
    String server_cert = "开始用openssl生成的根证书内容";    
    if (StringUtils.isBlank(server_cert)) {    
        throw new BusinessException("读取CA证书失败");    
    }    
   
    // 这里的这些操作,是为了生成vbscript中证书内容的变量定义    
    String pkcs7ca = "sPKCS7ca=\"\" & vbcrlf\r\n";    
    st = new StringTokenizer(server_cert, "\r\n");    
   
    while (st.hasMoreTokens()) {    
        line = st.nextToken();    
        if (line.equals("\r\n"))    
            continue;    
        pkcs7ca += "sPKCS7ca=sPKCS7ca & \"" + line + "\" & vbcrlf\r\n";    
    }    
%>    
   
<OBJECT id=XEnroll codeBase=xenroll.dll classid=clsid:127698e4-e730-4e5c-a2b1-21490a70c8a1></OBJECT>    
   
<SCRIPT type=text/vbscript>    
    ON ERROR resume next    
    <%=pkcs7ca%>    
    XEnroll.InstallPKCS7 sPKCS7ca    
    If err.number = 438 then    
        msgbox err.description & err.number    
    Elseif err.number <> 0 then    
        msgbox err.description & err.number    
    Else    
        msgbox "根证书安装成功"   
    End If    
</SCRIPT>  
Posted by hee at 07:09 AM | Permalink | 评论(0)

之前的留言回复使用tiny_mec做所见即所得编辑器,速度感觉太慢了,于是自己想写个简单的UBB编辑器玩玩,碰到一些问题记这里:

IE和Firefox下取消事件冒泡

function showEmot() {    
    var evt =  || event;    
    if(evt.preventDefault) {    
        // Firefox    
        evt.preventDefault();    
        evt.stopPropagation();    
    } else {    
        // IE    
        evt.cancelBubble=true;    
        evt.returnValue = false;    
    }    
}

textarea下将一段内容替换鼠标所选文字或插入到当前光标位置

function append($val) {    
    // sEditorId textarea的ID    
    var eObj = document.getElementById(sEditorId);    
    // ie    
    if (eObj.createTextRange) {    
        eObj.focus();    
        document.selection.createRange().duplicate().text = $val;    
    } else {    
        // firefox    
        var iStart = eObj.selectionStart;    
        var iEnd = eObj.selectionEnd;    
        eObj.value = eObj.value.substr(0, iStart) + $val + eObj.value.substr(iEnd, eObj.value.length);    
        eObj.focus();    
    }    
}  
Posted by hee at 23:03 PM | Permalink | 评论(0)

IE下有onselectstart这个方法,通过设置这个方法可以禁止元素文本被选取。而firefox下没有这个方法,但可以通过css或一种变通的办法解决:

if (typeof(element.onselectstart) != "undefined") {        
    // IE下禁止元素被选取        
    element.onselectstart = new Function("return false");        
} else {        
    // firefox下禁止元素被选取的变通办法        
    element.onmousedown = new Function("return false");        
    element.onmouseup = new Function("return true");        
}

或使用CSS:

div {        
    -moz-user-select: none;        
}
Posted by hee at 17:01 PM | Permalink | 评论(0)