My HELPER functions

Useful functions that can be used with @require in scripts

目前为 2015-08-04 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/11420/65734/My%20HELPER%20functions.js

  1. // ==UserScript==
  2. // @name My HELPER functions
  3. // @version 0.1
  4. // @date 2015/08/03
  5. // @author https://greasyfork.org/users/12782-fr%C3%A9d%C3%A9ric-sanz
  6. // @contributor
  7. // @namespace freMea
  8. // @description Useful functions that can be used with @require in scripts
  9.  
  10. // @license Creative Commons CC-BY-NC-SA
  11. // ==/UserScript==
  12.  
  13. ///////////////////////////////////////////////////////////////////////////////
  14. // ++++++++++++++++++++ GREASEMONKEY API EMULATION +++++++++++++++++++++++++++
  15. ///////////////////////////////////////////////////////////////////////////////
  16.  
  17. // une fonction log personnalisée dans la console web (section 'journal') pour les scripts GreaseMonkey
  18. function _log(info) {
  19. console.log('\t\t\t\t::: ' + GM_info.script.name + ' ' + GM_info.script.version + ' :::\n' + info + '\n...........................................................................');
  20. }
  21.  
  22.  
  23. ///////////////////////////////////////////////////////////////////////////////
  24. // +++++++++++++++++++++++ WORKING WITH THE URL ++++++++++++++++++++++++++++++
  25. ///////////////////////////////////////////////////////////////////////////////
  26.  
  27. // insérer paramètre à l'url puis la recharger
  28. function insertParam(key, value) {
  29. key = encodeURIComponent(key); value = encodeURIComponent(value);
  30.  
  31. // teste si l'url contient déjà des paramètres et les liste le cas échéant dans la variable kvp (tableau)
  32. var kvp = location.search.substr(1).split('&');
  33.  
  34. //_log('new key = ' + key +'\nnew value = '+ value +'\nparamètres existants = '+kvp);
  35.  
  36. // si l'url est vide de paramètre, alors la fonction ajoute celui donné et recharge la page
  37. if (kvp == '') {
  38. location.search = '?' + key + '=' + value;
  39. }
  40. // autrement véfifier que le paramètre donné n'est pas déjà présent
  41. else {
  42.  
  43. var i = kvp.length;
  44. var x;
  45.  
  46. while (i--) {
  47. x = kvp[i].split('=');
  48. //_log('paramètre existant n°' + i +'\nvaleur = '+ kvp[i]);
  49.  
  50. // si c'est le cas avec la même valeur, on dégage
  51. if ((x[0] == key) && (x[1] == value)) {
  52. //_log('Le paramètre existe déjà, kassos!!!');
  53. return;
  54. }
  55.  
  56. // si c'est le cas et contient une autre valeur, la modifier
  57. else if ((x[0] == key) && (x[1] != value)) {
  58. //_log('La valeur est différente et sera donc modifiée');
  59. x[1] = value;
  60. kvp[i] = x.join('=');
  61. break;
  62. }
  63. }
  64.  
  65. // dans tous les cas l'ajouter aux paramètres existants
  66. if (i < 0) { kvp[kvp.length] = [key, value].join('='); }
  67.  
  68. //this will reload the page, it's likely better to store this until finished
  69. location.search = kvp.join('&');
  70. }
  71. }
  72. ///////////////////////////////////////////////////////////////////////////////
  73. // +++++++++++++++++++++++++++ DOM FUNCTIONS +++++++++++++++++++++++++++++++++
  74. ///////////////////////////////////////////////////////////////////////////////
  75.  
  76. // Retourne un objet HTML à partir de son id (not equal to jquery $('#id')[0])
  77. function $id(id,root_el) {
  78. if (root_el === undefined) root_el = document;
  79. return root_el.getElementById(id);
  80. }
  81. // =============================================================================
  82.  
  83. /* Retourne une liste de nœuds (LIVE NodeList) des éléments trouvés avec la classe spécifiée.
  84. Les classes multiples doivent être séparée par un espace.
  85. [root_el] = option permettant de spécifier l'élément dans lequel rechercher (défaut=document)
  86. ex: $class('rouge test') */
  87. function $class(class_Name,root_el) {
  88. if (root_el === undefined) root_el = document;
  89. return root_el.getElementsByClassName(class_Name);
  90. }
  91. // =============================================================================
  92.  
  93. /* Retourne une liste de nœuds (LIVE NodeList) des éléments trouvés avec la balise spécifiée.
  94. La chaine générique globale '*' est possible, elle représente tous les élements.
  95. [root_el] = option permettant de spécifier l'élément dans lequel rechercher (défaut=document)
  96. ex: $tag('div') */
  97. function $tag(tagName,root_el) {
  98. if (root_el === undefined) root_el = document;
  99. return root_el.getElementsByTagName(tagName);
  100. }
  101. /* ============ Fonction raccourci pour les fonctions querySelector =============
  102. aide: http://www.nczonline.net/blog/2010/09/28/why-is-getelementsbytagname-faster-that-queryselectorall/
  103. fonction plus lente que les fonctions getElementsBy…
  104. * @param CSSele = CSS selector tel que par ex: 'div.class[news="true"]:not([type="checkbox"])'
  105. de multiples selecteurs sont possibles en les séparant par une virgule
  106. * @param [extend] = option dont la valeur est 1 (par défaut) ou 0
  107. 1: retourne tous les éléments satisfaisant au sélecteur,
  108. dans l'ordre dans lequel ils apparaissent dans l'arbre du document (type de retour : STATIC NodeList), ou un tableau NodeList vide si rien n'est trouvé.
  109. 0: retourne le premier élément trouvé satisfaisant au sélecteur (type de retour : Element), ou null si aucun objet correspondant n'est trouvé.
  110. * @param [root_el] = option permettant de spécifier l'élément dans lequel rechercher (défaut=document)
  111. ================================================================================*/
  112. function $get(CSSele,extend,root_el) {
  113. if (root_el === undefined) root_el = document;
  114. if (extend === undefined) extend = 1;
  115. if (extend == 1){return root_el.querySelectorAll(CSSele);}
  116. else if (extend == 0){return root_el.querySelector(CSSele);}
  117. }
  118. // =============================================================================
  119.  
  120. // remove element from the dom by its id
  121. function delNodeId(id)
  122. {
  123. return (elem=$id(id)).parentNode.removeChild(elem);
  124. }
  125. // =============================================================================
  126.  
  127. /* Supprime du dom les éléments avec la classe spécifiée
  128. [root_el] = option permettant de spécifier l'élément dans lequel rechercher (défaut=document)
  129. ex: delNodeClass('rouge',someNodeReference) */
  130. function delNodeClass(class_Name,root_el) {
  131. if (root_el === undefined) root_el = document;
  132. elements = root_el.getElementsByClassName(class_Name);
  133. while(elements.length > 0) {
  134. elements[0].parentNode.removeChild(elements[0]);
  135. }
  136. }
  137. // =============================================================================
  138.  
  139. /* Supprimer le premier élément enfant de l'élément donné
  140. ex: delFirstChild(someClassNode[i]) */
  141. function delFirstChild(reference) {
  142. if (reference){
  143. reference.removeChild(reference.children[0]);
  144. } else {
  145. _log("'"+reference+"' introuvable");
  146. }
  147. }
  148. // =============================================================================
  149.  
  150. /* Supprimer tous les éléments enfants de l'élément donné
  151. ex: delAllChild(someClassNode[i]) */
  152. function delAllChild(reference) {
  153. if (reference.children){
  154. for(var i = 0; i < reference.children.length; i++) {
  155. reference.removeChild(reference.children[i]);
  156. }
  157. } else {
  158. _log("Aucun enfant de '"+reference+"' trouvé");
  159. }
  160. }
  161. // =============================================================================
  162.  
  163. // Creates a new node with the given attributes, properties and event listeners
  164. function createNode(type, attributes, props, evls) {
  165.  
  166. var node = document.createElement(type);
  167.  
  168. if (attributes) {
  169. for (var attr in attributes) {
  170. if (attributes.hasOwnProperty(attr)) node.setAttribute(attr, attributes[attr]);
  171. }
  172. }
  173.  
  174. if (props) {
  175. for (var prop in props) {
  176. if ((props.hasOwnProperty(prop)) && (prop in node)) node[prop] = props[prop];
  177. }
  178. }
  179.  
  180. if (Array.isArray(evls)) {
  181. evls.forEach(function(evl) {
  182. if (Array.isArray(evl)) node.addEventListener.apply(node, evl);
  183. });
  184. }
  185. return node;
  186. }
  187. // =============================================================================
  188.  
  189. // Get 'Meta' attribute 'content' by selecting 'property' attribute, equivalent to the jquery $("meta[property='og:type']").attr("content");
  190. function GetMetaValue(propname, propname_value, attr) {
  191. var metaTags = document.getElementsByTagName("meta");
  192. var counter = 0;
  193. for (counter; counter < metaTags.length; counter++) {
  194. //_log(metaTags[counter].getAttribute(propname));
  195.  
  196. if (metaTags[counter].getAttribute(propname) == propname_value) {
  197. return metaTags[counter].getAttribute(attr);
  198. }
  199. }
  200. return "no meta found with this value";
  201. }
  202. ///////////////////////////////////////////////////////////////////////////////
  203. // ++++++++++++++++++++++++++ EVENTS FUNCTIONS ++++++++++++++++++++++++++++++
  204. ///////////////////////////////////////////////////////////////////////////////
  205.  
  206. // Ajoute un évenement à l'élément donné
  207. // ex: addEvent($id('player'),'click', play);
  208. function addEvent(element, evnt, funct){
  209. if (element.attachEvent)
  210. return element.attachEvent('on'+evnt, funct);
  211. else
  212. return element.addEventListener(evnt, funct, false);
  213. }
  214. /* ======================= Wait for elements ===================================
  215. fonction qui attend l'apparition d'un élément dans le DOM pour lancer une action/fonction
  216. * @param CSSele = CSS selector tel que par ex: 'div.class[news="true"]:not([type="checkbox"])'
  217. de multiples selecteurs sont possibles en les séparant par une virgule
  218. * @param action = fonction à lancer quand l'élément est trouvé
  219. * @param [stopLooking] = si l'option est "true", la fonction de recherche s'arrête au premier élément trouvé. Sinon, à chaque élément trouvé l'action est lancée.
  220. source: https://greasyfork.org/fr/scripts/5679-wait-for-elements
  221. ================================================================================*/
  222. function waitForElems(CSSele, action, stopLooking) {
  223. var id = 'fke' + Math.floor(Math.random() * 12345);
  224. function findElem(CSSele) {
  225. var found = [].filter.call(document.querySelectorAll(CSSele), function(elem) {
  226. return elem.dataset[id] !== 'y';
  227. });
  228. if(found.length > 0) {
  229. if(stopLooking) {
  230. clearInterval(tick);
  231. }
  232. found.forEach(function(elem) {
  233. elem.dataset[id] = 'y';
  234. action(elem);
  235. });
  236. }
  237. }
  238. var tick = setInterval(findElem.bind(null, CSSele), 300);
  239. findElem(CSSele);
  240. return tick;
  241. }
  242. /* ========================= Wait for URL ======================================
  243. fonction qui attend une URL précise pour lancer une action/fonction
  244. * @param regex = doit correspondre au site attendu
  245. * @param action = fonction à lancer quand l'URL correspond
  246. * @param [stopLooking] = si l'option est "true", la fonction de recherche s'arrête au premier élément trouvé. Sinon, à chaque élément trouvé l'action est lancée.
  247. source: https://greasyfork.org/fr/scripts/5679-wait-for-elements
  248. ================================================================================*/
  249. function waitForUrl(regex, action, stopLooking) {
  250. function checkUrl(urlTest) {
  251. var url = window.location.href;
  252. if(url !== lastUrl && urlTest(url)) {
  253. if(stopLooking) {
  254. clearInterval(tick);
  255. }
  256. lastUrl = url;
  257. action();
  258. }
  259. lastUrl = url;
  260. }
  261. var urlTest = (typeof regex === 'function' ? regex : regex.test.bind(regex)),
  262. tick = setInterval(checkUrl.bind(null, urlTest), 300),
  263. lastUrl;
  264. checkUrl(urlTest);
  265. return tick;
  266. }
  267. // =============================================================================