2016-06-10 89 views
0

取代的getElementById我想国防部的的JavaScript下面通过class name选择,而不是element id与getElementsByClassName方法

https://github.com/sarathsaleem/grained/blob/master/grained.js

然后理想初始化,就像这样:

grained(".classname", options); 
+0

您是否尝试过调整链接上的'js'以实现要求? – guest271314

+0

看了看,但似乎在我的头上,因为我试图做出改变和取代,唉,没有运气。 – vulgarbulgar

+0

_“正如我试图进行更改并替换”_您能否包括尝试在问题中更改'js'? – guest271314

回答

1

Sarath Saleem的grained.js的这个修改版本获得了具有给定类名称选择器(即'.foo')的所有元素,并为它们指定了noi se背景。我还没有很好地测试过这个代码,所以在效率方面绝对不是生产质量。关键是将element变量更改为elements,并使用document.getElementsByClassName其中最新命名的elements变量已定义。这将返回所有HTML元素与给定类的HTMLCollection(即'foo')。然后,在设置元素的positionoverflow属性的部分中,使用for循环并遍历HTMLCollection,以便为给定类中找到的每个元素设置positionoverflow属性。
注意:在grained.js文件的底部是我称之为粒度函数的地方。

此外,我调整了以前命名为elementId变量的位置,以使用基于给定类名的新变量elementClass

您可以在grained.js iife之后的任何位置执行此操作,因为它在之后的全局命名空间中。

/*! Grained.js 
 
* Author : Sarath Saleem - https://github.com/sarathsaleem 
 
* MIT license: http://opensource.org/licenses/MIT 
 
* GitHub : https://github.com/sarathsaleem/grained 
 
* v0.0.1 
 
*/ 
 
(function (window, doc) { 
 

 
    "use strict"; 
 

 
    function grained(ele, opt) { 
 

 
     var elements = null, 
 
      elementClass = null, 
 
      selectorElement = null; 
 

 
     //1 
 
     if (typeof ele === 'string') { 
 
      elements = doc.getElementsByClassName(ele.split('.')[1]); 
 
     } 
 
     //1 
 
     if (!elements) { 
 
      console.error('Grained: cannot find any elements with class ' + ele); 
 
      return; 
 
     } else { 
 
      elementClass = elements[0].className; 
 
     } 
 

 
     var elementsLength = elements.length 
 
     for(var i = 0; i < elementsLength; i++) { 
 
     //set style for parent 
 
     if (elements[i].style.position !== 'absolute') { 
 
      elements[i].style.position = 'relative'; 
 
     } 
 
     elements[i].style.overflow = 'hidden'; 
 
     }; 
 

 
     var prefixes = ["", "-moz-", "-o-animation-", "-webkit-", "-ms-"]; 
 

 
     //default option values 
 
     var options = { 
 
      animate: true, 
 
      patternWidth: 100, 
 
      patternHeight: 100, 
 
      grainOpacity: 0.1, 
 
      grainDensity: 1, 
 
      grainWidth: 1, 
 
      grainHeight: 1, 
 
      grainChaos: 0.5, 
 
      grainSpeed: 20 
 

 
     }; 
 

 
     Object.keys(opt).forEach(function (key) { 
 
      options[key] = opt[key]; 
 
     }); 
 

 

 
     var generateNoise = function() { 
 
      var canvas = doc.createElement('canvas'); 
 
      var ctx = canvas.getContext('2d'); 
 
      canvas.width = options.patternWidth; 
 
      canvas.height = options.patternHeight; 
 
      for (var w = 0; w < options.patternWidth; w += options.grainDensity) { 
 
       for (var h = 0; h < options.patternHeight; h += options.grainDensity) { 
 
        var rgb = Math.random() * 256 | 0; 
 
        ctx.fillStyle = 'rgba(' + [rgb, rgb, rgb, options.grainOpacity].join() + ')'; 
 
        ctx.fillRect(w, h, options.grainWidth, options.grainHeight); 
 
       } 
 
      } 
 
      return canvas.toDataURL('image/png'); 
 
     }; 
 

 
     function addCSSRule(sheet, selector, rules, index) { 
 
      var ins = ''; 
 
      if (selector.length) { 
 
       ins = selector + "{" + rules + "}"; 
 
      } else { 
 
       ins = rules; 
 
      } 
 

 
      if ("insertRule" in sheet) { 
 
       sheet.insertRule(ins, index); 
 
      } else if ("addRule" in sheet) { 
 
       sheet.addRule(selector, rules, index); 
 
      } 
 
     } 
 

 

 
     var noise = generateNoise(); 
 

 
     var animation = '', 
 
      keyFrames = ['0%:-10%,10%', '10%:-25%,0%', '20%:-30%,10%', '30%:-30%,30%', '40%::-20%,20%', '50%:-15%,10%', '60%:-20%,20%', '70%:-5%,20%', '80%:-25%,5%', '90%:-30%,25%', '100%:-10%,10%']; 
 

 
     var pre = prefixes.length; 
 
     while (pre--) { 
 
      animation += '@' + prefixes[pre] + 'keyframes grained{'; 
 
      for (var key = 0; key < keyFrames.length; key++) { 
 
       var keyVal = keyFrames[key].split(':'); 
 
       animation += keyVal[0] + '{'; 
 
       animation += prefixes[pre] + 'transform:translate(' + keyVal[1] + ');'; 
 
       animation += '}'; 
 
      } 
 
      animation += '}'; 
 
     } 
 

 
     //add animation keyframe 
 
     var animationAdded = doc.getElementById('grained-animation'); 
 
     if (animationAdded) { 
 
      animationAdded.parentElement.removeChild(animationAdded); 
 
     } 
 
     var style = doc.createElement("style"); 
 
     style.type = "text/css"; 
 
     style.id = 'grained-animation'; 
 
     style.innerHTML = animation; 
 
     doc.body.appendChild(style); 
 

 
     //add custimozed style 
 
     var styleAdded = doc.getElementById('grained-animation-' + elementClass); 
 
     if (styleAdded) { 
 
      styleAdded.parentElement.removeChild(styleAdded); 
 
     } 
 

 
     style = doc.createElement("style"); 
 
     style.type = "text/css"; 
 
     style.id = 'grained-animation-' + elementClass; 
 
     doc.body.appendChild(style); 
 

 
     var rule = 'background-image: url(' + noise + ');'; 
 
     rule += 'position: absolute;content: "";height: 300%;width: 300%;left: -100%;top: -100%;'; 
 
     pre = prefixes.length; 
 
     if (options.animate) { 
 
      while (pre--) { 
 
       rule += prefixes[pre] + 'animation-name:grained;'; 
 
       rule += prefixes[pre] + 'animation-iteration-count: infinite;'; 
 
       rule += prefixes[pre] + 'animation-duration: ' + options.grainChaos + 's;'; 
 
       rule += prefixes[pre] + 'animation-timing-function: steps(' +options.grainSpeed + ', end);'; 
 
      } 
 
     } 
 

 
     //selecter element to add grains 
 
     selectorElement = '.' + elementClass + '::before'; 
 

 

 
     addCSSRule(style.sheet, selectorElement, rule, 0); 
 

 

 
    } 
 

 
    window.grained = grained; 
 
    //END 
 
})(window, document); 
 

 
grained('.foo', {});
<!doctype html> 
 
<html> 
 
    <head> 
 
     <title>Example</title> 
 
     <style> 
 
     .foo { 
 
      height: 100px; 
 
      width: 100px; 
 
     } 
 
     </style> 
 
    </head> 
 
    <body> 
 
     <div class="foo"> 
 
     <div class="contents"> 
 
      <p>Hello World</p> 
 
     </div> 
 
     </div> 
 
     <p>No Noise For Me!</p> 
 
     <div class="foo"> 
 
     <div class="contents"> 
 
      <p>Hello World</p> 
 
     </div> 
 
     </div> 
 

 
    <script type="text/javascript" src="grained.js"></script> 
 
    <script type="text/javascript" src="index.js"></script> 
 
    </body> 
 
</html>

希望这有助于!如果您有任何疑问,请询问!我喜欢帮助:D。

+0

有帮助!很多。另外,真的很感谢仔细的解释 - 就像其他一些人一样。谢谢! – vulgarbulgar

相关问题