C’est vraisemblablement une erreur de permissions sur la liste ! 🙂
How to trigger the window.resize event on IE8
For the modern browsers it’s easy to fire the window.resize event, but not for IE8…. After several hours of searching, I didn’t find anything.
The only solution I found is the one to resize the HTML that will trigger the event:
function triggerEvent(element, eventName) { var event; if (document.createEvent) { event = document.createEvent("HTMLEvents"); event.initEvent(eventName, true, true); } else { event = document.createEventObject(); event.eventType = eventName; } event.eventName = eventName; if (document.createEvent) element.dispatchEvent(event); else { if (eventName==="resize") { var savedWidth=document.documentElement.style.width; document.documentElement.style.width="99.999999%"; setTimeout(function() { document.documentElement.style.width=savedWidth }, 50); } else element.fireEvent("on" + event.eventType, event); } } triggerEvent(window,'resize')
WebPart doesn’t work with IE8 in standard mode under Sharepoint 2010
The Microsoft developers are not really good, and we can see it if you use IE8 in standard mode with Sharepoint 2010: the web parts don’t work anymore due to an error with the wpadder.js file.
After few hours trying to find the problem I’ve finally discovered that the WPAdder class uses the for..in
statement without testing the hasOwnProperty
(more about that problem), then it causes some issues…
Here is how I fixed it (this code must be added after the DOM is loaded in the master page to be called by all the pages) :
EnsureScript("WPAdderClass", undefined, function() { if (typeof loadWPAdderCallback === "function") { var _loadWPAdderCallback=loadWPAdderCallback; loadWPAdderCallback = function() { _WPAdder.prototype._layout = function (a) { ULSior: ; var l = this._saveDescriptionForLayout(); if (this._lastLayoutWidth == -1) { var g = this._getCategoryContainer(); for (var b in this._cats) { if (this._cats.hasOwnProperty(b)) g.appendChild(this._cats[b].el) } } if (this._table.clientHeight != this._lastLayoutHeight) { this._selCat != -1 && this._removeItemHover(); this._layoutCategoryColumn(); this._getNavigationTable().parentNode.colSpan = 1; var d = 0, f = 0, c = document.createElement("DIV"), g = this._itemContainerTemplate.cloneNode(true); c.style.whiteSpace = "nowrap"; c.style.width = "1px"; c.style.height = "1px"; c.style.overflow = "auto"; c.innerHTML = "Quick Brown Fox!
It jumped!"; this._getFirstChild(g).appendChild(c); this._getItemContainer().appendChild(g); var j = c.scrollWidth, i = c.scrollHeight; this._removeElement(g); if (a && (parseInt(a[0][0]) != j || parseInt(a[0][1]) != i || parseInt(a[0][2]) != this._table.clientHeight)) a = null; if (a) { d = parseInt(a[0][3]); for (var b = 0; b < this._cats.length; b++) { if (this._cats.hasOwnProperty(b)) { var e = this._fillCachedItems(this._cats[b].items, this._itemContainerTemplate, a[b + 1]); if (e.length > f) f = e.length; this._cats[b].itemCols = e } } } else { a = ""; for (var b in this._cats) { if (this._cats.hasOwnProperty(b)) { var e = [], h = this._fillItems(e, this._cats[b].items, this._getItemContainer(), this._itemContainerTemplate, _WPAdder_maximumItemWidth); if (h[1] > d) d = h[1]; if (e.length > f) f = e.length; this._cats[b].itemCols = e; a += ";" + h[0] } } a = j + "," + i + "," + this._table.clientHeight + "," + d + a; this._getHiddenField("layout").value = this._layoutHash + ";" + a } for (var b in this._cats) { if (this._cats.hasOwnProperty(b)) { var k = this._cats[b].itemCols; for (var m in k) { if (k.hasOwnProperty(m)) this._finishColumn(k[m], d) } } } for (var b in this._dummyCols) { if (this._dummyCols.hasOwnProperty(b)) this._finishColumn(this._dummyCols[b], d); } this._maxCols = f; this._widestColumn = d }(this._table.clientWidth != this._lastLayoutWidth || this._table.clientHeight != this._lastLayoutHeight) && this._calculateVisibleItemColumns(); this._restoreDescriptionAndLayout(l); this._lastLayoutWidth = this._table.clientWidth; this._lastLayoutHeight = this._table.clientHeight }; _WPAdder.prototype._removeItemHover = function () { ULSior: ; var a = this._getItems(); for (var b in a) { if (a.hasOwnProperty(b)) a[b].removeHover() } }; _loadWPAdderCallback(); } } })
Actually, when we load the WPAdder class, then I override the two functions that are buggy in adding the hasOwnProperty
. That’s it.
Citrix Receiver: impossible d’ajouter un compte [configuration]
J’utilise Citrix Receiver dans le cadre de mon travail. Après avoir installĂ© la dernière version sur mon ordinateur, il me demande d’entrer une adresse email professionnel, ou bien une adresse HTTPS du serveur. Lorsque je rentre l’URL sĂ©curisĂ© du serveur j’avais le droit Ă un laconique message disant “impossible d’ajouter un compte”…. Après avoir cherchĂ© sur quelques forums j’ai dĂ©couvert qu’il faut indiquer l’adresse suivante : https://votre_serveur/Citrix/PNAgent/config.xml
et, magie, ça fonctionne !
Aussi vous pourriez avoir une erreur en rapport avec un “Allow HotKey” qui n’a pas Ă©tĂ© trouvĂ©. Il faut ouvrir la base de registre (en tapant “regedit” dans la zone de recherche du menu de Windows) puis faire une recherche sur “EnableLockdown” une fois dans la base de registre. Il faudra changer la valeur de 1 Ă 0.
Équivalent de la commande “kill” sous DOS pour Windows 7
Pour tuer une tâche sous Windows 7, il existe une commande native qui se nomme tskill
. Il suffit de l’appliquer avec le nom du processus, par exemple tskill thunderbird
Détection et polyfill pour émuler mouseenter et mouseleave [JavaScript]
Il semblerait qu’Ă l’heure oĂą j’Ă©cris ces lignes, les Ă©vĂ©nements “mouseenter” et “mouseleave” ne soient pas encore supportĂ©s par la dernière version stable de Chrome (alors que FF16 et IE les supportent).
D’autres plus anciennes versions de Firefox peuvent aussi ĂŞtre impactĂ©es.
Mais heureusement il existe un polyfill pour ça.
Tout d’abord voici une fonction pour dĂ©tecter si l’Ă©vĂ©nement est supportĂ© (source) :
// source: http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ function isMouseEventSupported(eventName) { var el = document.createElement('div'); eventName = 'on' + eventName; var isSupported = (eventName in el); if (!isSupported) { el.setAttribute(eventName, 'return;'); isSupported = typeof el[eventName] == 'function'; } el = null; return isSupported; } isMouseEventSupported("mouseenter"); // --> true ou false
Maintenant voici le polyfill :
// inspired by : http://blog.stchur.com/2007/03/15/mouseenter-and-mouseleave-events-for-firefox-and-other-non-ie-browsers/ // bindEvent is an easy way to create a native binding events // @param {DOMElement} element The DOM element related to the event // @param {String} eventName An event name just like 'click' // @param {Function} fct The function that will be triggered by the event function bindEvent(element, eventName, fct) { if (!element) throw new ErrorType("The element doesn't exist"); if (element.addEventListener) { // if it's mouseenter or mouseleave, we want to check the compatibility if (eventName === "mouseenter" || eventName === "mouseleave") { if (!isMouseEventSupported(eventName)) { switch (eventName) { case "mouseleave": eventName="mouseout"; break; case "mouseenter": eventName="mouseover"; break; } fct=fixMouseEnter(fct); } } element.addEventListener(eventName, fct, false); } else element.attachEvent("on"+eventName, fct); } function fixMouseEnter(fct) { return function(evt) { var relTarget = evt.relatedTarget; if (this === relTarget || isChildOf(this, relTarget)) return; fct.call(this, evt); } } function isChildOf(parent, child) { if (parent === child) return false; while (child && child !== parent) child = child.parentNode return child === parent; }
Voir tout le code JavaScript présent dans une page [Astuce]
Il peut arriver qu’on ait besoin de voir tout le code JavaScript d’une page dans un unique endroit. Pour cela vous pouvez utiliser ce bout de code. Grâce Ă la partie “bookmarklet” vous pouvez crĂ©er un nouveau marque-page et utiliser le code fourni comme URL du marque-page. Ensuite il suffit d’aller sur la page voulue et d’appeler le marque-page : cela ouvrira une nouvelle page avec tout le code JavaScript, qui sera « unminifiĂ© » grâce Ă jsbeautifier.org. Cependant, seuls les scripts qui sont sur le mĂŞme domaine pourront ĂŞtre visualisĂ©s.
L’autocomplete des passwords ne fonctionne plus sur Firefox ? [Astuce]
Après un crash de mon ordinateur je me suis retrouvĂ© avec Firefox qui ne remplissait plus mes zones “Password” sur les diffĂ©rents sites. PlutĂ´t ennuyeux. Après une recherche j’ai trouvĂ© qu’une option s’Ă©tait dĂ©cochĂ©e d’elle-mĂŞme ! Il suffit d’aller dans les Options, onglet SĂ©curitĂ©, puis de vĂ©rifier que “Enregistrer les mots de passe” est bien cochĂ©.
Vertical scroll en JavaScript [programmation]
Si l’on souhaite faire un scroll vertical seulement pour accĂ©der Ă un Ă©lĂ©ment de notre page, alors on pourra utiliser :
window.scrollTo(document.documentElement.scrollLeft,document.getElementById('id-de-mon-element').offsetTop)
Autre solution (en repérant le conteneur qui a les scrollbar) :
document.getElementById('mon-conteneur').scrollTop = document.getElementById('id-de-mon-element').offsetTop
Pour que offsetTop
retourne une valeur il faut que l’Ă©lĂ©ment associĂ© soit visible.
Un autocomplete/autosuggest simple, léger et efficace en JavaScript [programmation]
On trouve plusieurs programmes JavaScript pour l’auto-complétion, mais souvent ils sont lourds et proposent des listes déroulantes plus ou moins attrayantes.
Après quelques recherches je suis tombé sur Mo Autocomplete créé par un russe.
Une fois minifiĂ©, le code ne fait que 1423B, et son principe n’est pas d’afficher une liste sous le champ mais de complĂ©ter le mot directement dans le champ.
Ci-dessous une dĂ©mo (tapez un mois de l’annĂ©e en français) :
Et le code associé :
<input type="text" id="demo-autocomplete" autocomplete="array:months" />
<script> /* autocomplete - http://momche.net/res/autocomplete/ */ var cAutocomplete={sDescription:"autcomplete class"};cAutocomplete.complete=function(hEvent){if(hEvent==null){var hEvent=window.hEvent}var hElement=(hEvent.srcElement)?hEvent.srcElement:hEvent.originalTarget;var sAA=hElement.getAttribute("autocomplete").toString();if(sAA.indexOf("array:")>=0){hArr=eval(sAA.substring(6))}else{if(sAA.indexOf("list:")>=0){hArr=sAA.substring(5).split("|")}}if(hEvent.keyCode==16){return}var sVal=hElement.value.toLowerCase();if(hEvent.keyCode==8||hEvent.keyCode==46){sVal=sVal.substring(0,sVal.length-1)}if(sVal.length<1){return}for(var nI=0;nI<hArr.length;nI++){sMonth=hArr[nI];nIdx=sMonth.toLowerCase().indexOf(sVal,0);if(nIdx==0&&sMonth.length>sVal.length){hElement.value=hArr[nI];if(hElement.createTextRange){hRange=hElement.createTextRange();hRange.findText(hArr[nI].substr(sVal.length));hRange.select()}else{hElement.setSelectionRange(sVal.length,sMonth.length)}return}}};cAutocomplete.init=function(){var a=0;var c=document.getElementsByTagName("INPUT");for(var a=0;a<c.length;a++){if(c[a].type.toLowerCase()=="text"){var b=c[a].getAttribute("autocomplete");if(b){if(document.attachEvent){c[a].attachEvent("onkeyup",cAutocomplete.complete)}else{if(document.addEventListener){c[a].addEventListener("keyup",cAutocomplete.complete,false)}}}}}};if(window.attachEvent){window.attachEvent("onload",cAutocomplete.init)}else{if(window.addEventListener){window.addEventListener("load",cAutocomplete.init,false)}}; var months=["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"]; cAutocomplete.init(); </script>