您的位置:1010cc时时彩经典版 > 服务器&运维 > 1010cc时时彩经典版在JavaScript中央银行使适配器情

1010cc时时彩经典版在JavaScript中央银行使适配器情

发布时间:2019-11-25 01:42编辑:服务器&运维浏览(63)

    先绕开头部很多的if...else(其实就是定义toCamel与getStyle两个函数)-由于浏览器的实现不统一,才造成如此麻烦的情况,回头可以聊聊这些代码。 下面我们在YAHOO.util.Dom类中看看有哪些宝藏。目前思想已经逐步的分裂,我看见个函数说个函数。 //基本上可以认为是document.getElementById的翻版 get:function{ //如果已经是HTMLElement,那么就直接返回 if(el&&){ returnel; } //如果是字符串,那么就返回有这个ID的Element if(YAHOO.lang.isString{ returndocument.getElementById; } //看起来是个数组,循环调用自身,获取Eelement if(el.length!==undefined){ varc=[]; for(vari=0,len=el.length;i

     

    batch: function(el, method, o, override) {
        // 让 el 始终为 HTMLElement
        el = (el && (el.tagName || el.item)) ? el : Y.Dom.get(el); 

    然而,你需要知道 innerHTML 有一些自身的问题: 

      看一年前在当当网所买,却还崭新的那本《JavaScript设计模式》(Rose Harmes、Dustin Diaz 著,谢廷晟 译,人民邮电出版社出版),作者将GoF合著的《Design Patterns》一书中若干设计模式在JavaScript中的应用给了详尽的解说,不失为一本好书。

        if (!el || !method) {
            return false;
        }

    1、当 HTML 字符串包含一个标记为 defer 的 script 标签(<script defer>…</script>)时,如 innerHTML 属性处理不当,在 Internet Explorer 上会引起脚本注入攻击。 
    2、设置 innerHTML 将会破坏现有的已注册了事件处理函数的 HTML 元素,会在某些浏览器上引起内存泄露的潜在危险。 

     

        //  确定返回的对象
        var scope = (override) ? o : window;

    还有几个其他次要的缺点,也值得一提的: 

             我比较喜欢的设计模式有工厂模式、适配器模式、组合模式和观察者模式等,本文总结书中关于适配器模式的讲解,希望该模式能为读者在JavaScript开发中所用。

        // 看起来是个 HTMLElement 或者不是 Array
        if (el.tagName || el.length === undefined) {
            return method.call(scope, el, o);
        } 

    1、你不能得到刚刚创建的元素的引用,需要你手动添加代码才能取得那些引用(使用 DOM APIs)。 
    2、你不能在所有浏览器的所有 HTML 元素上设置 innerHTML 属性(比如,Internet Explorer 不允许你在表格的行元素上设置innerHTML 属性)。 
    我更关注与使用 innerHTML 属性相关的安全和内存问题。很显然,这不是新问题,已经有能人围绕这些中的某些问题想出了方法。 

     

        var collection = []; 
        for (var i = 0, len = el.length; i < len;  i) {
            collection[collection.length] = method.call(scope, el[i], o);
        }

           Douglas Crockford 写了一个 清除函数 ,该函数负责中止由于 HTML 元素注册事件处理函数引起的一些循环引用,并允许垃圾回收器(garbage collector)释放与这些 HTML 元素关联的内存。 

    1、   什么是适配器模式?

        return collection;
    },小马补充

           从 HTML 字符串中移除 script 标签并不像看上去那么容易。一个正则表达式可以达到预期效果,虽然很难知道是否覆盖了所有的可能性。这里是我的解决方案: 
    /<script[^>]*>[Ss]*?</script[^>]*>/ig
    现在,让我们将这两种技术结合在到一个单独的 setInnerHTML 函数中,并将 setInnerHTML 函数绑定到 YUI 的 YAHOO.util.Dom 上:
    YAHOO.util.Dom.setInnerHTML = function (el, html) {
        el = YAHOO.util.Dom.get(el);
        if (!el || typeof html !== 'string') {
            return null;
        } 
        // 中止循环引用
        (function (o) {

    在计算机编程中,适配器模式将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。如果现有的接口能很好地满足需要,那就可能没有必要使用适配器。

    batch 是 YUI Dom 库的核心之一。它最大的意义在于,它让 Dom 库的其他大多方法
    的第一个参数可以是一个 id / 元素对象 或 一组 id/元素对象,减少了循环的使用。在这里可以找到 call 与 apply 的用法。在了解了 batch 以后,下来看 YUI.util.Dom 是怎么使用这一方法的,一口气看两个函数

            var a = o.attributes, i, l, n, c;
            if (a) {
                l = a.length;
                for (i = 0; i < l; i  = 1) {
                    n = a[i].name;
                    if (typeof o[n] === 'function') {
                        o[n] = null;
                    }
                }
            }

     

    getStyle: function(el, property) {
        // toCamel 函数后面介绍
        property = toCamel(property);

            a = o.childNodes;

    从表面上看,适配器模式很像门面模式。它们都要对别的对象进行包装并改变其呈现的接口。两者的区别在于它们如何改变接口。门面元素展现的是一个简化的接口,它并不提供额外的选择,而且有时为了方便完成任务它还要做出某些假定。而适配器则要把一个叫接口转换成另外一个接口,它并不会滤除某些能力,也不会简化接口。

        // 获取节点的样式
        var f = function(element) {
            return getStyle(element, property);
        };

            if (a) {
                l = a.length;
                for (i = 0; i < l; i  = 1) {
                    c = o.childNodes[i];

     

        return Y.Dom.batch(el, f, Y.Dom, true);
    },setStyle: function(el, property, val) {
        property = toCamel(property);

                    // 清除子节点
                    arguments.callee(c);

    2、   适配器模式的应用场合

        // 设置节点的样式
        var f = function(element) {
            setStyle(element, property, val);        
        };

                    // 移除所有通过YUI的addListener注册到元素上所有监听程序
                    YAHOO.util.Event.purgeElement(c);
                }
            }

    下面举几个适合使用适配器模式的实例:

        Y.Dom.batch(el, f, Y.Dom, true);
    },有关这两个函数的具体用法,可以看下相关的文档。其实从参数上就很容易理解怎么使用。看上面的两个函数有利于理解 YAHOO.util.Dom.batch 的调用方式。

        })(el);

     

    接下来,粗略看下 getXY

        // 从HTML字符串中移除script,并设置innerHTML属性
        el.innerHTML = html.replace(/<script[^>]*>[Ss]*?</script[^>]*>/ig, "");

    (1)      参数类型不一致: 假设有这样一个对象,定义如下:

    getXY: function(el) {
        var f = function(el) {
            // 确定元素是否“肉眼可见”
            if ( (el.parentNode === null || el.offsetParent === null ||
                    this.getStyle(el, 'display') == 'none') && 
                                el != el.ownerDocument.body) {
                return false;
            }

        // 返回第一个子节点的引用
        return el.firstChild;
    };

     

            return getXY(el);
        };

    如果此函数还应有其他任何内容或者在正则表达式中遗漏了什么,请让我知道。 

    var clientObject = {

        return Y.Dom.batch(el, f, Y.Dom, true);
    },getX 与 getY 方法也是调用此函数,只是获取返回值的数组元素不一样。由于浏览器的兼容问题,提供给用户的 YAHOO.util.Dom.getXY 也仅仅是判断变量以后,再扔给最为复杂的内部 getXY 函数。

           很明显,在网页上还有很多其他注入恶意代码的方法。setInnerHTML 函数仅能在所有 A-grade 浏览器上规格化 <script> 标签的执行行为。如果你准备注入不能信任的 HTML 代码,务必首先在服务器端过滤,已有许多库可以做到这点。

        string1: 'foo',

    OK,留下太多的“悬念”了,下一期着重将它们解决。

    1、当HTML字符串包含一个标记为defer的script标签(scriptdefer…/script)时,如innerHTML属性处理不当...

        string2: 'bar',

    //让el始终为HTMLElement el=(el(el.tagName||el.item))?el:Y.Dom.get(el); if(!el||!method){ returnfalse; } //确定返回的对象 varscope=(o...

        string3: 'baz'

    };

    另外有一个以三个字符串为参数的函数:

     

    function interfaceMethod(str1, str2, str3) {

       

    }

    为了将cientObject作为参数传递给interfaceMethod方法,可使用适配器模式解决:

     

    function clientToInterfaceAdapter(o) {

        interfaceMethod(o.string1, o.string2, o.string3);

    本文由1010cc时时彩经典版发布于服务器&运维,转载请注明出处:1010cc时时彩经典版在JavaScript中央银行使适配器情

    关键词: