`
yiminghe
  • 浏览: 1460228 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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').

 

 

 

0
0
分享到:
评论

相关推荐

    yui3-master.zip

    《深入理解YUI3:基于yui3-master.zip的探讨》 YUI(Yahoo! User Interface Library)是由雅虎公司开发的一套开源JavaScript库,它为Web开发者提供了丰富的功能和工具,以创建交互性强、性能优秀的网页应用。YUI3是...

    YUI3 中tree的两种实现

    这篇博文“YUI3 中tree的两种实现”探讨了如何在YUI3中创建和管理树形结构。 1. **YUI3 TreeView组件** YUI3 TreeView组件是YUI3核心库的一部分,它允许开发者创建交互式的树结构。这个组件支持节点的添加、删除、...

    YUI3 dialog组件

    **YUI3 Dialog组件详解** YUI3是Yahoo!推出的一款强大的JavaScript库,它提供了丰富的UI组件和工具,用于构建高性能、跨平台的Web应用程序。Dialog组件是YUI3中的一个重要部分,它允许开发者创建可交互的弹出窗口,...

    yui3-3.17.2最新版

    在实际使用YUI 3.17.2时,开发者可以通过`yui3-3.17.2`这个压缩包文件获取所有必要的资源。这个压缩包中包含了库的源码、示例、文档和其他辅助工具。开发者可以按照项目需求,选择合适的模块和组件进行集成。 在...

    从YUI2到YUI3看前端的演变

    从YUI2到YUI3看前端的演变

    从YUI2到YUI3看前端的演变 pdf

    YUI3 引入了粒度更细的模块管理方式,通过异步 HTTP 请求加载模块、然后执行回调来加载和使用模块。现场有很多人提出疑问,大家无非关心的是“效率”二字。个人以为在现阶段,这种方式有一点激进,否能为广大用户所...

    YUI3 完整包

    Yahoo! UI Library (YUI) 是一个开放源代码的 JavaScript 函数库,为了能建立一个高互动的网页,它采用了AJAX, DHTML 和 DOM 等程式码技术。它也包含了许多 CSS 资源。

    YUI3.6文档及示例

    1. **模块系统**:YUI3引入了模块化设计,允许开发者按需加载组件,降低页面的初始化时间。模块可以通过`YUI.use()`方法来加载,实现了代码的异步加载和依赖管理。 2. **事件系统**:YUI的事件处理机制强大且灵活,...

    YAHOO YUI3简单入门

    **YUI3简介** YUI(Yahoo! User Interface Library)是雅虎公司开发的一个开源JavaScript库,主要用于构建富互联网应用程序(RIA)。YUI3是YUI的第三个主要版本,它在设计时注重模块化、可扩展性和性能优化,提供了...

    针对YUI框架API

    YUI的StyleSheet模块允许开发者动态修改CSS样式,实现页面样式的实时更新。 5. **数据管理与数据绑定** YUI的DataSource和Model组件支持异步数据获取和数据模型的建立,可以方便地与服务器进行数据交互,并通过...

    YUI3.7.3 最新版本 带API

    1. **模块系统**:YUI3引入了CommonJS风格的模块系统,允许开发者通过`YUI.use()`方法加载所需模块,实现按需加载,减少页面初始化时的加载量。 2. **事件处理**:YUI3提供了强大的事件系统,支持DOM事件、自定义...

    YUI3 Cookbook

    ### YUI3 Cookbook知识点概述 #### 一、YUI3简介 YUI3(Yahoo User Interface Library Version 3)是雅虎开发的一款免费开源的JavaScript库,它为开发者提供了丰富的前端开发工具,包括动画效果、事件处理、DOM操作...

    yui 资源包

    3. **事件处理**:YUI的事件系统强大,支持事件绑定、解绑、事件冒泡等,使得用户交互编程简单易行。 4. **动画效果**:通过Transition和Anim模块,可以轻松实现平滑的CSS3动画和JavaScript动画效果。 5. **数据绑定...

    yahoo3.0 YUI Examples

    1. **YUI 3.0架构**:YUI 3采用了模块化设计,允许开发者按需加载组件,降低了页面加载时间。每个模块都有独立的命名空间,避免了全局变量污染。 2. **核心组件**:YUI 3的核心组件包括事件处理、DOM操作、动画效果...

    YUi文档(中文的哦)

    ### YUI3中文文档知识点详解 #### YUI3概述及YUIGlobal对象介绍 **YUI3** 是一个开源的JavaScript库,旨在提供一系列工具和API,帮助开发者构建高性能、高质量的Web应用。YUI3的核心优势在于其模块化的设计、强大...

    yui_2.5.2 类库

    - **样式(StyleSheet)**:提供了操作CSS样式的工具,可以动态修改页面样式,实现动态布局。 - **Ajax(Asynchronous JavaScript and XML)**:支持异步数据交换,与服务器进行无刷新通信。 - **IO(Input/...

    yui.rar 例子

    《深入理解YUI:基于“yui.rar 例子”的解析》 YUI,全称Yahoo! User Interface Library,是雅虎公司推出的一款开源JavaScript库,旨在帮助开发者构建高性能、易于维护的网页应用。本篇文章将结合“yui.rar 例子”...

    YUI 入门教程YUI 入门教程YUI 入门教程

    YUI,全称为Yahoo! User Interface Library,是一个开源的JavaScript库,主要用于构建富互联网应用程序(RIA)。本教程将深入介绍YUI的基础知识和关键特性,帮助开发者快速入门。 首先,YUI提供了一系列强大的DOM...

    yuicompressor-yui compressor

    yuicompressor-2.4.2.jar yuicompressor-2.4.7.jar jsZip.exe yuicompressor yui compressor js压缩工具 javascript压缩工具 css压缩工具 ------------------------------------ //压缩JS java -jar yui...

Global site tag (gtag.js) - Google Analytics