代码之家  ›  专栏  ›  技术社区  ›  Gary Green

轻量级Javascript框架

  •  2
  • Gary Green  · 技术社区  · 17 年前

    我正在尝试创建一个可以在greasemonkey脚本中使用的小型Javascript“框架”。我只需要 非常 基本功能,所以这就是我选择不使用mooTools或DOMAssistant的原因。此外,我不会愚蠢地把DOMAssistant放在20KB的Greasemonkey脚本中!我只想要一小段整洁的代码。

    我对下面的代码有一个小问题。我认为这是因为我在$()中返回了一个数组,所以我得到的setStyle不是函数错误消息。

    
    var fmini = {  
      $ : function(a) {
        var i=0,obj,d;
        var e = [];
    
        while (obj = arguments[i++]) {
          d = document.getElementById(obj);
          d.setStyle = fmini.setStyle;
          d.each = fmini.each;
          e.push(d);
        }
    
        return e;
      },
      setStyle : function(style, value) {
        if (typeof this.style.cssText !== 'undefined') {
          var styleToSet = this.style.cssText;
          if (typeof style === 'object') {
            for (var i in style) 
              if (typeof i === 'string') styleToSet += ';' + i + ':' + style[i];
          }
          else styleToSet += ';' + style + ':' + value;
          this.style.cssText = styleToSet;
        }
        return this;
      },
      each : function (functionCall) {
                    for (var i=0, il=this.length; i < il; i++) 
                        functionCall.call(this[i]);
                    return this;
        },
    }
    window.$ = fmini.$;
    

    我希望这样做的时候能奏效

    
      $('bob','amy').setStyle({
        'border' : '5px solid #ff0000',
        'background-color' : '#ccc'
        });
    
    4 回复  |  直到 17 年前
        1
  •  6
  •   Crescent Fresh    17 年前

    写下你的操作方法 设置 返回的节点数量 $ 那样的话 $('bob').setStyle() $('bob', 'amy').setStyle() 会起作用的。我看你有一个通用的 forEach each 这是一个良好的开端。

    var fmini = {
        $: function() {
            var i=0, obj;
            var e = [];
            e.setStyle = fmini.setStyle;
            e.each = fmini.each;
    
            while (obj = arguments[i++]) {
                e.push(document.getElementById(obj));
            }
    
            return e;
        },
    
        setStyle : function(style, value) {
            return this.each(function() {
                if (typeof this.style.cssText !== 'undefined') {
                    var styleToSet = this.style.cssText;
                    if (typeof style === 'object') {
                        for (var i in style) 
                            if (typeof i === 'string') styleToSet += ';' + i + ':' + style[i];
                    }
                    else styleToSet += ';' + style + ':' + value;
                    this.style.cssText = styleToSet;
                }
            })
        }
    }
    

    顺便说一句,这是 jQuery 是第一个做/流行的。

        2
  •  1
  •   Quintin Robinson    17 年前

    就像您怀疑在这种情况下返回的$是一个元素数组一样,您必须使用setStyle扩展数组,或者在返回数组之前在填充数组时添加扩展名。那么你不应该得到一个错误,说.setStyle不是一个函数。但是,当您像这样链接时,您还必须确保处理对象上下文绑定,否则 this 指的是当前作用域,而不是数组中的元素。

        3
  •  1
  •   Luca Matteis    17 年前

    $函数返回一个数组;它应该返回元素对象本身(d),在该对象上增强setStyle方法,或者只返回另一个对象。

        4
  •  0
  •   McKayla    15 年前

    如果你愿意,你可以用我的图书馆。

    它叫做Ally,你可以在这里下载: http://github.com/AllyToolkit/Ally

    我注意到你说你想要一些轻量级的东西,而Ally的库存版本目前只有1300多行,25KB未压缩,你可以很容易地删除你不想要的部分。

    我写它的目的是很容易修改,但仍然非常强大,并且充满有用的功能。

    我今晚很快就会发布第二个测试版。它应该在发布分支上( http://github.com/AllyToolkit/Ally/tree/release )在接下来的一个小时内。

    如果你决定试试,我希望你喜欢。 :)