YUI3 StyleSheet bug

演示地址:

 

yui3-stylesheet-bug

 

被 YUI3 接受了,汗我的英语表达能力:


ticket 2528762

 

出错代码:

<!doctype html>
<html>
	<head>
		<title>yui3 stylesheet bug</title>
		<style type="text/css" id="test">
		div {
			color:red;
		}
		
		div{
			color:green;
		}
		
		a{
			color:black;
			text-decoration:none;
		}
		
		a[href='#'][title='note'] {
			color:green;
		}
		</style>
	</head>
	<body>	
		<div>
			color should be green
		</div>
		<a href="#" title="note" >color should be red</a>
		<script type="text/javascript" src="http://yui.yahooapis.com/3.1.0/build/yui/yui-min.js"></script>
		<script type="text/javascript">
	
		YUI().use("node","stylesheet",function(Y){
			
			var skinCss=Y.StyleSheet("#test");
			
			skinCss.set("a[href='#'][title='note']",{color:"red"});
		
		});
		</script>
	</body>
</html>

 

bug1:

 

由于简单的优先级顺序: 后面的 css 规则覆盖前面的 css 规则。则例子中的 div文字应该显示 绿色,而测试代码页面显示红色(前面的css规则占优了)。


分析代码可知:


YUI3 手动合并具有 相同的选择符的css规则,并删除重复选择符的css规则,但是为了方便删除后的下标处理,采用了从后往前的循环:

 

for (i = sheet[_rules].length - 1; i >= 0; --i) {
        r   = sheet[_rules][i];
        sel = r.selectorText;

        if (cssRules[sel]) {
            cssRules[sel].style.cssText += ';' + r.style.cssText;
            _deleteRule(i);
        } else {
            cssRules[sel] = r;
        }
    }
 

则可见:循环到第一条会出现:

cssRules["div"].style.cssText="div {color:green;}";

cssRules["div"].style.cssText+=";"+"div {color:red}";

delete(0);

则虽然第一条规则被删,但是第二条规则已经被改为 div {color:red}

解决之道:

 

需要从前往后循环

或者:

 

 cssRules[sel].style.cssText += ';' + r.style.cssText;

 

改做:

 

 cssRules[sel].style.cssText = r.style.cssText+";"+cssRules[sel].style.cssText;

 

 

 

 

bug2:

 

由于采用了属性选择符 则该bug只对应于 no-ie6,由测试代码发现动态添加的"a[href='#'][title='note']",{color:"red"}根本没起作用。


分析代码:

 

实际上yui3认为 a[href='#'][title='note'](Multiple attribute selectors ) 为无效:

 

isValidSelector : function (sel) {
        var valid = false;

        if (sel && isString(sel)) {

            if (!selectors.hasOwnProperty(sel)) {
                // TEST: there should be nothing but white-space left after
                // these destructive regexs
                selectors[sel] = !/\S/.test(
                    // combinators
                    sel.replace(/\s+|\s*[+~>]\s*/g,' ').
                    // attribute selectors (contents not validated)
                    replace(/([^ ])\[.*?\]/g,'$1').
                    // pseudo-class|element selectors (contents of parens
                    // such as :nth-of-type(2) or :not(...) not validated)
                    replace(/([^ ])::?[a-z][a-z\-]+[a-z](?:\(.*?\))?/ig,'$1').
                    // element tags
                    replace(/(?:^| )[a-z0-6]+/ig,' ').
                    // escaped characters
                    replace(/\\./g,EMPTY).
                    // class and id identifiers
                    replace(/[.#]\w[\w\-]*/g,EMPTY));
            }

            valid = selectors[sel];
        }

        return valid;
    }

 

可以简单实验:

 

YUI().use("node","stylesheet",function(Y){
			
     alert(Y.StyleSheet.isValidSelector("a[href='#'][title='note']"));
		
});

 

解决之道:

 

// attribute selectors (contents not validated)
//需要修正!加上 + 允许重复  
replace(/([^ ])(\[.*?\])+/g,'$1').

 

 

 

### 关于西门子杯数字孪生的相关信息 #### 西门子杯竞赛简介 西门子杯竞赛是一项专注于工业自动化信息化领域的赛事,旨在通过实际项目和创新思维培养学生的工程能力。其中,“数字孪生”作为近年来的重要主题之一,在比赛中占据核心地位。比赛通常围绕基于模型的设计、仿真优化以及智能制造展开。 #### 数字孪生技术文档案例教程 以下是关于西门子杯中涉及的数字孪生相关内容: 1. **技术文档** - 参赛者可以参考《数字孪生实战:基于模型的数字化企业》这本书籍[^2]。书中详细介绍了如何利用数字孪生技术推动装备制造业转型升级,并提供了多个具体方案,例如基于模型的三维设计仿真实现方法。 - 同时,《愚公系列——工业数字孪生企业应用实践》也是一份重要的参考资料[^1]。此书深入探讨了正向和逆向数字线程技术及其在工业场景下的实现路径。 2. **案例教程** - 实践篇部分展示了大量真实的工业案例,其中包括西门子自身的样板工厂经验分享。这些实例说明了如何借助数字孪生完成从产品开发到生产的全流程管理。 - 针对具体的参赛环节,建议关注以下几个方面: - 基于模型的企业 (Model-Based Enterprise, MBE) 的构建流程; - 工艺规划虚拟验证解决方案的实际操作指南; - 利用 Siemens NX 或 Teamcenter 等工具创建产品的数字孪生体[^4]。 3. **关键技术点** - 构建完整的数字线程贯穿整个生命周期是非常必要的。这不仅有助于提升产品质量,还能显著降低研发周期成本[^1]。 - 数据驱动型决策支持系统也是不可或缺的一部分。通过对实时采集的数据进行分析处理,从而指导物理实体运行状态调整[^3]。 ```python # 示例代码片段展示如何加载Siemens PLM Software中的数据接口 from siemens_plm import load_data_interface def initialize_digital_twin(): data = load_data_interface('product_model') twin_instance = create_digital_representation(data) return twin_instance twin = initialize_digital_twin() print(f"Digital Twin Initialized: {twin}") ``` 以上内容涵盖了理论知识框架搭建及动手实践两大部分,希望对你参加西门子杯有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值