From 913b8a557948dcb4a83887c5bb61eb84b8cf52e1 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Thu, 1 May 2014 21:31:56 -0400 Subject: [PATCH] fix opening in new tab for routed links --- archive/v0.1.11/change-log.html | 4 +++ archive/v0.1.11/mithril-tests.js | 53 ++++++++++++++++++------------- archive/v0.1.11/mithril.html | 2 ++ archive/v0.1.11/mithril.js | 20 ++++++------ archive/v0.1.11/mithril.min.js | 2 +- archive/v0.1.11/mithril.min.map | 2 +- archive/v0.1.11/mithril.min.zip | Bin 40930 -> 41212 bytes docs/change-log.md | 4 +++ docs/mithril.md | 6 ++++ mithril.js | 20 ++++++------ tests/mithril-tests.js | 33 ++++++++++++------- 11 files changed, 90 insertions(+), 56 deletions(-) diff --git a/archive/v0.1.11/change-log.html b/archive/v0.1.11/change-log.html index de6da58d..52998b58 100644 --- a/archive/v0.1.11/change-log.html +++ b/archive/v0.1.11/change-log.html @@ -68,6 +68,10 @@
  • Added m.route() overload to allow reading of current route #61
  • Added background option to m.request to allow requests that don't affect rendering #62
  • +

    Bug Fixes:

    +

    v0.1.10 - maintenance

    News:

    diff --git a/archive/v0.1.11/mithril-tests.js b/archive/v0.1.11/mithril-tests.js index ba71f23e..8b40890c 100644 --- a/archive/v0.1.11/mithril-tests.js +++ b/archive/v0.1.11/mithril-tests.js @@ -211,7 +211,7 @@ Mithril = m = new function app(window) { return value } - var roots = [], modules = [], controllers = [], now = 0, lastRedraw = 0, lastRedrawId = 0 + var roots = [], modules = [], controllers = [], now = 0, lastRedraw = 0, lastRedrawId = 0, computePostRedrawHook = null m.module = function(root, module) { m.startComputation() var index = roots.indexOf(root) @@ -235,20 +235,18 @@ Mithril = m = new function app(window) { for (var i = 0; i < roots.length; i++) { m.render(roots[i], modules[i].view(controllers[i])) } + if (computePostRedrawHook) { + computePostRedrawHook() + computePostRedrawHook = null + } lastRedraw = now } - var pendingRequests = 0, computePostRedrawHook = null + var pendingRequests = 0 m.startComputation = function() {pendingRequests++} m.endComputation = function() { pendingRequests = Math.max(pendingRequests - 1, 0) - if (pendingRequests == 0) { - m.redraw() - if (computePostRedrawHook) { - computePostRedrawHook() - computePostRedrawHook = null - } - } + if (pendingRequests == 0) m.redraw() } m.withAttr = function(prop, withAttrCallback) { @@ -279,6 +277,7 @@ Mithril = m = new function app(window) { else if (arguments[0].addEventListener) { var element = arguments[0] var isInitialized = arguments[1] + element.href = modes[m.route.mode] + element.pathname if (!isInitialized) { element.removeEventListener("click", routeUnobtrusive) element.addEventListener("click", routeUnobtrusive) @@ -316,8 +315,9 @@ Mithril = m = new function app(window) { } } function routeUnobtrusive(e) { + if (e.ctrlKey || e.metaKey || e.which == 2) return e.preventDefault() - m.route(e.currentTarget.getAttribute("href")) + m.route(e.currentTarget[m.route.mode].slice(modes[m.route.mode].length)) } function scrollToHash() { if (m.route.mode != "hash" && window.location.hash) window.location.hash = window.location.hash @@ -934,7 +934,7 @@ function testMithril(mock) { //m.redraw test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup var controller var root = mock.document.createElement("div") m.module(root, { @@ -946,11 +946,11 @@ function testMithril(mock) { var lengthBefore = root.childNodes.length mock.performance.$elapse(50) m.redraw() - mock.performance.$elapse(50) + mock.performance.$elapse(50) //teardown return lengthBefore === 0 && root.childNodes[0].nodeValue === "foo" }) test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup var count = 0 var root = mock.document.createElement("div") m.module(root, { @@ -964,13 +964,13 @@ function testMithril(mock) { m.redraw() mock.performance.$elapse(50) m.redraw() - mock.performance.$elapse(50) + mock.performance.$elapse(50) //teardown return count === 2 }) //m.route test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup mock.location.search = "?" var root = mock.document.createElement("div") @@ -978,10 +978,11 @@ function testMithril(mock) { m.route(root, "/test1", { "/test1": {controller: function() {}, view: function() {return "foo"}} }) + mock.performance.$elapse(50) //teardown return mock.location.search == "?/test1" && root.childNodes[0].nodeValue === "foo" }) test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup mock.location.pathname = "/" var root = mock.document.createElement("div") @@ -989,10 +990,11 @@ function testMithril(mock) { m.route(root, "/test2", { "/test2": {controller: function() {}, view: function() {return "foo"}} }) + mock.performance.$elapse(50) //teardown return mock.location.pathname == "/test2" && root.childNodes[0].nodeValue === "foo" }) test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup mock.location.hash = "#" var root = mock.document.createElement("div") @@ -1000,10 +1002,11 @@ function testMithril(mock) { m.route(root, "/test3", { "/test3": {controller: function() {}, view: function() {return "foo"}} }) + mock.performance.$elapse(50) //teardown return mock.location.hash == "#/test3" && root.childNodes[0].nodeValue === "foo" }) test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup mock.location.search = "?" var root = mock.document.createElement("div") @@ -1011,10 +1014,11 @@ function testMithril(mock) { m.route(root, "/test4/foo", { "/test4/:test": {controller: function() {}, view: function() {return m.route.param("test")}} }) + mock.performance.$elapse(50) //teardown return mock.location.search == "?/test4/foo" && root.childNodes[0].nodeValue === "foo" }) test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup mock.location.search = "?" var module = {controller: function() {}, view: function() {return m.route.param("test")}} @@ -1026,13 +1030,14 @@ function testMithril(mock) { "/test5/:test": module }) var paramValueBefore = m.route.param("test") + mock.performance.$elapse(50) m.route("/") var paramValueAfter = m.route.param("test") - + mock.performance.$elapse(50) //teardown return mock.location.search == "?/" && paramValueBefore === "foo" && paramValueAfter === undefined }) test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup mock.location.search = "?" var module = {controller: function() {}, view: function() {return m.route.param("a1")}} @@ -1044,13 +1049,15 @@ function testMithril(mock) { "/test6/:a1": module }) var paramValueBefore = m.route.param("a1") + mock.performance.$elapse(50) m.route("/") var paramValueAfter = m.route.param("a1") + mock.performance.$elapse(50) //teardown return mock.location.search == "?/" && paramValueBefore === "foo" && paramValueAfter === undefined }) test(function() { //https://github.com/lhorie/mithril.js/issues/61 - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup mock.location.search = "?" var module = {controller: function() {}, view: function() {return m.route.param("a1")}} @@ -1062,8 +1069,10 @@ function testMithril(mock) { "/test7/:a1": module }) var routeValueBefore = m.route() + mock.performance.$elapse(50) m.route("/") var routeValueAfter = m.route() + mock.performance.$elapse(50) //teardown return routeValueBefore === "/test7/foo" && routeValueAfter === "/" }) diff --git a/archive/v0.1.11/mithril.html b/archive/v0.1.11/mithril.html index 1a406b69..c9e1957a 100644 --- a/archive/v0.1.11/mithril.html +++ b/archive/v0.1.11/mithril.html @@ -147,6 +147,8 @@ m("button", {onclick: alert}); //yields <button></button>,

    You can set inline styles like this:

    m("div", {style: {border: "1px solid red"}}); //yields <div style="border:1px solid red;"></div>

    Note that in order to keep the framework lean, Mithril does not auto-append units like px or % to any values. Typically, you should not even be using inline styles to begin with (unless you are dynamically changing them).

    +

    Mithril also does not auto-camel-case CSS properties on inline style attributes, so you should use the Javascript syntax when setting them:

    +
    m("div", {style: {textAlign: "center"}}); //yields <div style="text-align:1px solid red;"></div>

    You can define a non-HTML-standard attribute called config. This special parameter allows you to call methods on the DOM element after it gets created.

    This is useful, for example, if you declare a canvas element and want to use the Javascript API to draw:

    diff --git a/archive/v0.1.11/mithril.js b/archive/v0.1.11/mithril.js index 06685a0f..f07d8197 100644 --- a/archive/v0.1.11/mithril.js +++ b/archive/v0.1.11/mithril.js @@ -211,7 +211,7 @@ Mithril = m = new function app(window) { return value } - var roots = [], modules = [], controllers = [], now = 0, lastRedraw = 0, lastRedrawId = 0 + var roots = [], modules = [], controllers = [], now = 0, lastRedraw = 0, lastRedrawId = 0, computePostRedrawHook = null m.module = function(root, module) { m.startComputation() var index = roots.indexOf(root) @@ -235,20 +235,18 @@ Mithril = m = new function app(window) { for (var i = 0; i < roots.length; i++) { m.render(roots[i], modules[i].view(controllers[i])) } + if (computePostRedrawHook) { + computePostRedrawHook() + computePostRedrawHook = null + } lastRedraw = now } - var pendingRequests = 0, computePostRedrawHook = null + var pendingRequests = 0 m.startComputation = function() {pendingRequests++} m.endComputation = function() { pendingRequests = Math.max(pendingRequests - 1, 0) - if (pendingRequests == 0) { - m.redraw() - if (computePostRedrawHook) { - computePostRedrawHook() - computePostRedrawHook = null - } - } + if (pendingRequests == 0) m.redraw() } m.withAttr = function(prop, withAttrCallback) { @@ -279,6 +277,7 @@ Mithril = m = new function app(window) { else if (arguments[0].addEventListener) { var element = arguments[0] var isInitialized = arguments[1] + element.href = modes[m.route.mode] + element.pathname if (!isInitialized) { element.removeEventListener("click", routeUnobtrusive) element.addEventListener("click", routeUnobtrusive) @@ -316,8 +315,9 @@ Mithril = m = new function app(window) { } } function routeUnobtrusive(e) { + if (e.ctrlKey || e.metaKey || e.which == 2) return e.preventDefault() - m.route(e.currentTarget.getAttribute("href")) + m.route(e.currentTarget[m.route.mode].slice(modes[m.route.mode].length)) } function scrollToHash() { if (m.route.mode != "hash" && window.location.hash) window.location.hash = window.location.hash diff --git a/archive/v0.1.11/mithril.min.js b/archive/v0.1.11/mithril.min.js index 133dc33f..d5b8b899 100644 --- a/archive/v0.1.11/mithril.min.js +++ b/archive/v0.1.11/mithril.min.js @@ -4,5 +4,5 @@ http://github.com/lhorie/mithril.js (c) Leo Horie License: MIT */ -Mithril=m=new function(a){function b(){var a=arguments,b="[object Object]"==u.call(a[1]),c=b?a[1]:{},d="class"in c?"class":"className",e=t[a[0]];if(void 0===e){t[a[0]]=e={tag:"div",attrs:{}};for(var f,h=[];f=v.exec(a[0]);)if(""==f[1])e.tag=f[2];else if("#"==f[1])e.attrs.id=f[2];else if("."==f[1])h.push(f[2]);else if("["==f[3][0]){var i=w.exec(f[3]);e.attrs[i[1]]=i[3]||!0}h.length>0&&(e.attrs[d]=h.join(" "))}e=g(e),e.attrs=g(e.attrs),e.children=b?a[2]:a[1];for(var j in c)e.attrs[j]=j==d?(e.attrs[j]||"")+" "+c[j]:c[j];return e}function c(b,g,h,i,j,k,l){if(null===h||void 0===h)return void(i&&e(i.nodes));if("retain"!==h.subtree){var m=u.call(i),n=u.call(h);if(m!=n&&(null!==i&&void 0!==i&&e(i.nodes),i=new h.constructor,i.nodes=[]),"[object Array]"==n){for(var o=[],p=i.length===h.length,q=0,r=0,s=0;r-1?new h.constructor(h):h,i.nodes=[v];else if(i.valueOf()!==h.valueOf()||j===!0){if(h.$trusted){var x=i.nodes[0],o=[x];if(x){for(;x=x.nextSibling;)o.push(x);e(o),v=f(b,k,h)}else b.innerHTML=h}else v=i.nodes[0],"textarea"===g?b.value=h:b.insertBefore(v,b.childNodes[k]||null),v.nodeValue=h;i=new h.constructor(h),i.nodes=[v]}else i.nodes.intact=!0}return i}}function d(b,c,d,e,f){for(var g in d){var i=d[g],j=e[g];if(!(g in e)||j!==i||b===a.document.activeElement){if(e[g]=i,"config"===g)continue;if("function"==typeof i&&0==g.indexOf("on"))b[g]=h(i,b);else if("style"===g)for(var k in i)(void 0===j||j[k]!==i[k])&&(b.style[k]=i[k]);else void 0!==f?"href"===g?b.setAttributeNS("http://www.w3.org/1999/xlink","href",i):"className"===g?b.setAttribute("class",i):b.setAttribute(g,i):"value"===g&&"input"===c?b.value!==i&&(b.value=i):g in b?b[g]=i:b.setAttribute(g,i)}}return e}function e(a){for(var b=0;b0&&("GET"==a.method?a.url=a.url+(a.url.indexOf("?")<0?"?":"&")+o(b):a.data=c(b)),a}function q(a,b){var c=a.match(/:[a-z]\w+/gi);if(c&&b)for(var d=0;de?y.push(b)-1:e,g=b==a.document||b==a.document.documentElement?x:b;z[f]=c(g,null,d,z[f],!1,0)},b.trust=function(a){return a=new String(a),a.$trusted=!0,a};var A=[],B=[],C=[],D=0,E=0,F=0;b.module=function(a,c){b.startComputation();var d=A.indexOf(a);0>d&&(d=A.length),A[d]=a,B[d]=c,C[d]=new c.controller,b.endComputation()},b.redraw=function(){if(D=a.performance&&a.performance.now?a.performance.now():(new a.Date).getTime(),D-E>16)i();else{var b=a.cancelAnimationFrame||a.clearTimeout,c=a.requestAnimationFrame||a.setTimeout;b(F),F=c(i,0)}};var G=0,H=null;b.startComputation=function(){G++},b.endComputation=function(){G=Math.max(G-1,0),0==G&&(b.redraw(),H&&(H(),H=null))},b.withAttr=function(a,b){return function(c){b(a in c.currentTarget?c.currentTarget[a]:c.currentTarget.getAttribute(a))}};var I,J={pathname:"",hash:"#",search:"?"},K=function(){},L={};return b.route=function(){if(0===arguments.length)return I;if(3===arguments.length){I=a.location[b.route.mode].slice(J[b.route.mode].length);var c=arguments[0],d=arguments[1],e=arguments[2];K=function(a){var f=a.slice(J[b.route.mode].length);j(c,e,f)||b.route(d,!0)};var f="hash"==b.route.mode?"onhashchange":"onpopstate";a[f]=function(){K(a.location[b.route.mode])},H=l,a[f]()}else if(arguments[0].addEventListener){var g=arguments[0],h=arguments[1];h||(g.removeEventListener("click",k),g.addEventListener("click",k))}else if("string"==typeof arguments[0]){I=arguments[0];var i=arguments[1]===!0;a.history.pushState?(H=function(){a.history[i?"replaceState":"pushState"](null,a.document.title,J[b.route.mode]+I),l()},K(J[b.route.mode]+I)):a.location[b.route.mode]=I}},b.route.param=function(a){return L[a]},b.route.mode="search",b.prop=function(a){var b=function(){return arguments.length&&(a=arguments[0]),a};return b.toJSON=function(){return a},b},b.deferred=function(){var a=[],c=[],d={resolve:function(b){for(var c=0;c0&&(e.attrs[d]=h.join(" "))}e=g(e),e.attrs=g(e.attrs),e.children=b?a[2]:a[1];for(var j in c)e.attrs[j]=j==d?(e.attrs[j]||"")+" "+c[j]:c[j];return e}function c(b,g,h,i,j,k,l){if(null===h||void 0===h)return void(i&&e(i.nodes));if("retain"!==h.subtree){var m=u.call(i),n=u.call(h);if(m!=n&&(null!==i&&void 0!==i&&e(i.nodes),i=new h.constructor,i.nodes=[]),"[object Array]"==n){for(var o=[],p=i.length===h.length,q=0,r=0,s=0;r-1?new h.constructor(h):h,i.nodes=[v];else if(i.valueOf()!==h.valueOf()||j===!0){if(h.$trusted){var x=i.nodes[0],o=[x];if(x){for(;x=x.nextSibling;)o.push(x);e(o),v=f(b,k,h)}else b.innerHTML=h}else v=i.nodes[0],"textarea"===g?b.value=h:b.insertBefore(v,b.childNodes[k]||null),v.nodeValue=h;i=new h.constructor(h),i.nodes=[v]}else i.nodes.intact=!0}return i}}function d(b,c,d,e,f){for(var g in d){var i=d[g],j=e[g];if(!(g in e)||j!==i||b===a.document.activeElement){if(e[g]=i,"config"===g)continue;if("function"==typeof i&&0==g.indexOf("on"))b[g]=h(i,b);else if("style"===g)for(var k in i)(void 0===j||j[k]!==i[k])&&(b.style[k]=i[k]);else void 0!==f?"href"===g?b.setAttributeNS("http://www.w3.org/1999/xlink","href",i):"className"===g?b.setAttribute("class",i):b.setAttribute(g,i):"value"===g&&"input"===c?b.value!==i&&(b.value=i):g in b?b[g]=i:b.setAttribute(g,i)}}return e}function e(a){for(var b=0;b0&&("GET"==a.method?a.url=a.url+(a.url.indexOf("?")<0?"?":"&")+o(b):a.data=c(b)),a}function q(a,b){var c=a.match(/:[a-z]\w+/gi);if(c&&b)for(var d=0;de?y.push(b)-1:e,g=b==a.document||b==a.document.documentElement?x:b;z[f]=c(g,null,d,z[f],!1,0)},b.trust=function(a){return a=new String(a),a.$trusted=!0,a};var A=[],B=[],C=[],D=0,E=0,F=0,G=null;b.module=function(a,c){b.startComputation();var d=A.indexOf(a);0>d&&(d=A.length),A[d]=a,B[d]=c,C[d]=new c.controller,b.endComputation()},b.redraw=function(){if(D=a.performance&&a.performance.now?a.performance.now():(new a.Date).getTime(),D-E>16)i();else{var b=a.cancelAnimationFrame||a.clearTimeout,c=a.requestAnimationFrame||a.setTimeout;b(F),F=c(i,0)}};var H=0;b.startComputation=function(){H++},b.endComputation=function(){H=Math.max(H-1,0),0==H&&b.redraw()},b.withAttr=function(a,b){return function(c){b(a in c.currentTarget?c.currentTarget[a]:c.currentTarget.getAttribute(a))}};var I,J={pathname:"",hash:"#",search:"?"},K=function(){},L={};return b.route=function(){if(0===arguments.length)return I;if(3===arguments.length){I=a.location[b.route.mode].slice(J[b.route.mode].length);var c=arguments[0],d=arguments[1],e=arguments[2];K=function(a){var f=a.slice(J[b.route.mode].length);j(c,e,f)||b.route(d,!0)};var f="hash"==b.route.mode?"onhashchange":"onpopstate";a[f]=function(){K(a.location[b.route.mode])},G=l,a[f]()}else if(arguments[0].addEventListener){var g=arguments[0],h=arguments[1];g.href=J[b.route.mode]+g.pathname,h||(g.removeEventListener("click",k),g.addEventListener("click",k))}else if("string"==typeof arguments[0]){I=arguments[0];var i=arguments[1]===!0;a.history.pushState?(G=function(){a.history[i?"replaceState":"pushState"](null,a.document.title,J[b.route.mode]+I),l()},K(J[b.route.mode]+I)):a.location[b.route.mode]=I}},b.route.param=function(a){return L[a]},b.route.mode="search",b.prop=function(a){var b=function(){return arguments.length&&(a=arguments[0]),a};return b.toJSON=function(){return a},b},b.deferred=function(){var a=[],c=[],d={resolve:function(b){for(var c=0;ccDvGc7u0q)yR@a*?vmi!#6NL z+lk|!#4H#Pm5?YxVkBNmLE=Xh4=C@2J|SK}NPPea9zZHWJb_vvgplAnXPl-f+m$xg zcjnB@Ip6ut&)h%%{LFveK67Q=edz4@3HtZ7H{Xa|+7145`ufDg^!1-z`NM@v&dr-M z&djXkthRcM#;kSp{sm|9xt(sO;g$~X-!INJOWh*>46m*h=LVJPPUZgn8NG7xv${29 z9Stu2>ybyttB=}GRVE)wtOoU;EGE8qQ@XdBdI_`bUbi&YY`;=^IZ&S4#U8CyKU_YaVmXzxwX-#KgNt=dXYBtiJS>C-rwe^Mk3e{?pd({Jj`SdC@r52+t}A)sl4wTZ)3>p^$z}tS&CISYekR?iMX|_HDB!iG@7wcWi8? zmh6xkAM{^wV-%8jQ60&;*2vI%sY61K*OE{brZr2pg9`d+LLh3Fdl4N;r z#hemISS2Bz=xk{{a8a7)B3eM|lALMurg_4t^cUW}!0)d)wm1y|d` z-r$KcZ(WG8FEfjzje<{%B0wiadnEZis^5-Xo(izSUYs10W%p*mLg7X9KVmmV3p`7j zV%eUw%2J5UIuEvGn3y685q|i~Hd~{tCS;nDWqjW1cxc|ntKCR2Xp1bKjPTAbwzq4< z8IfIPQ~)#feyU)c?!jY@@LR;@wd7F0X$Q`fllph|;$%l(j9(pi_ zLe0x6d)ozu*r~vqG~|i_cB~6T>L6)buG0~HHP4nFYg$iOMd+|WyLzXm%tEIVTXL-8 z2uX_-y+gZnWzbL=Ofd%&*JT0mZaXj!UMVA+Bf;;=h>I1%UW`)$%JLo=J`E`bTMZ2X zd;G`*lQfl!ILwfJ&MYCh8|S20q`8d}{Vj|I4>-hKID@^9nWRbSQN?opK8I#z*U%M^ zEh zK(&=XHY8Mo`j&fTGNkXgGZ%msIPnUNZ*=sx+}RiRXoR6<$7*tm1`8Fo zE=y~Yn8CxxqC8czdHue7b7WkF@PV`+aEUCXd1D^l$oJ5TQs{}uco5#s@V=O#eamT1 zg^B`vC64rn9ZeN3ve-J%0I>*lhB`TbQ*XmD4R(m%Ok4Z#&p@`!dpiwf)VyN&GaWOy zpSF4sI+R`W-qXKNKUVb|EEc_>R5LEDde2^3=-3K1F`jRyxd$MukmNFtkpH04;3 z_KrnW-*_D|&?m>}BWj4ubeIduv-6N7Lk8YF`yHt?DS~S&64S#q0o4dK(AXna1D8$9 zL7q5dh&vLNz@QvJ#%|o=_(5Wh!Uj0zSS*@8B?k9b6w8Uyig6-J8U?87Q^x0cr+X&C zlB;L_SfQ~1Cw?-RJcPmtjeU%fVr+MrW3E*3PKKHceYQ20g2F>Ppj-as1kjoThQ z3WRY(a>~!vOtJkKY%)m46im=_Adxd*#DO$A(qM2V3|Hckw8njZ5X4ucc=%qr8+ z<#s=iLPFo;lgkpyGmPv}qajEL6Z{$j^q?L#V|tg&I#f^xBb9*`DrNdN$3n$JouaIm zMQKNI=%{@Yx-r%a*w9>udQ-t)%p@+1=!AS9f3I@`6tfaZ$6oOon z8!^-EoZ_7ikA&qt6m(!_?{Q~EV z(Vh@!6d~*`Bq;W?1m#`UBS!Ycc-Gl~AL*?68Xc1-p>0|P&cO!iACQ15vSzxkdXjz5 z8r3FKI+mSYIW#pFXi>gGQKsxQ9vpJp;RI>W9>(e^mf_`%lzu%sJu*oq2LL~`dOR39 zy&5be;-R>Y!SNAR+gR6?xUfKHzsI+-3~oe-i30Vx$m$jDW{&4fY_JAYv-IuF$8SW* zIP|$pEDsq4`)8K8?TN@LFLyh7e=~jw)IeypKCz0lR4g8qYQcuQpa z)C>6cpy--Fz(FX3D8wc%U(D1-j~lMs0UwZsipWrh2FJc`Z#_A=s9)Wh{Tv!aM|hje z5d69qGgm=cP}~eKruhc<*2G8RYYwLtybEb4sz#*Gytj;;ay zwL%+6sRey8bUfKgzmfmyWAmI~%5p&m?&N0?__)YMW9HsgZM4UnSm|?WBE!-R}0gl zWsco!Ywg3l9}gmwpgxm78Rq(qRSb92r#-R|Ky6vFPbR@6&rIfNZ4#~~1WuO0r6^>~ zGWwFB&u>p%sbpxxWy+_F z;SYT}Ig42ktD!>lRBOlw__&0oj;`uk^ZM`GQ%{+Q$wgQK*wO`QYe7Hz()CY7{pl~A z`UZHEed!(b`00;i@)%B{fpN>^+@!4H1I#-@yTug delta 4822 zcmaJ_U2Ggz6^`Ai4TU5iwT+WBN#iuZmM2}W*MAFg#l3fCXU4PR$$GusY*Phol8t}% zf4x7pCA5MfUaE?RD|m|4W{q%$T_78t^tNw8O*s+J>?~ncQ#KE&C z-4We5HK7yVIH_Cj96$Kz)IXm)`0(Y;kr&*hY0Fz`^lCM2ja?jZb$0C4l)Ds`yPL1q z%excqwWKvYX-zLJxmT}F+wuIPdv~cOsH3C@tr%JX05i? z^vXM%_^dbYR(>@3a8&>Oi(~rX)YOZ2dYw+C(OqpCa@ya~C#=rFx2#()p4zl~w&e;@ zR+b|+9Q`>_Jl=I_#o5zU@$JbjZ%0iV`yxzbtPn4&BveCgxmF-VN%7LYzATsK=b5b3 z;8(Cta@@9KcziJOdem|tOf5J`6(96nd1bgS@uBvmpo5%gX>CcNGTR=14qTS8E%|Fk zT6cuFqpUI%xAMa2Dk~>MUO^vKqJKAK>j-0+*sJkk)b_wcJirCs)8ZcpELUPGtU~WrmLkh80<;AA#QGi6L&#!1&e>ro>OF7_nY96~`&ta?j z%pE|4gV0b2rrA!omiSE!LU`5{QG;-@;&=4-GgG6m`FELlZ`&cJ9H|fyhtCS~=d4j7 zO;~i2nI`+R2#G`siJ&fYJW?qon>upO%r%HqEg0i_MvoQ)#&59JAy7lkffM|mPX-kF z`o4Qa)NgV^gdtNU`QtIF0pz4KK@Qo;KF%bg2JC~#ko&iZ zH`wy5f>0?5RO58|bcK6YFL`%^MjSr^S&#n@IC8m8hD zw&>}gAEn`WEEHe+5!LHWRzE1dOhtp)c^3sk~N6?#+MNhH6-5T#Dmj( z;2@kCHh8o9KbtcyXb}H|i?YD^DDq^OT5T!fUfWtGhc-=SM=AX)|H_3rr(jdAuum5# z04gEpIS@foe|GuY5Fb_6?>Y(VtJE^n#wsnk7G?h`t%XOo45Qnz_nGDnn{b1Kbmfjg zEC2yrON^hIEFn=H7k0qW8&W}A)sn-002blQX9yK}7Q!HW*6Cag)T=TV3DxWP1tco9Rw8M92?o9liixcN=C$p zgCqPl+ZJ{7?}G)K(ZUJgG6dO17iED|AO&_aN#nmgLS^hf)-a@XxNl$I%1)ess}TCT zNa95*04x_f5FgF5VnXieE zeg*cX&2dwKwS(XcWWs!JWTA{oC@v1UZFWdh&00MW?a7+?uIoRA7l(b5|Io9LFhy&c z;Zo()bXmfHHq^G=&C=n{AVXbK)FqrDNi9; zT!W4TWeW7K-({OaIw|OB5uHB0OSTMFz#obJia-{#H+3^QJ%mb7v;emN8+Taq9g3v_ zH6-luvm!;nltW;35JGZld?#mAyb@C ztD#>6h>~V((>ya(7K|3WRAry$(G{2q8t*%^j1vt{}3Vx(ZiDi8FpuU{C}xH=rJl?i5OlNEkqeB8Iu%gKtZkX|K9-p7cYX0=H2}`NR4Y+2fxuqVGFn}UNcUs;yn&65$Wi9FAHXb_C% zzWzo2!b*>i$nD48qdKYf$PvLRa>)}IUIDydz*AqI+;*G&Vnaj6=3RHS!;y6sLv5{{ ze`$f|8gJ3#=<~q~zP`0Ko^Eq_FTexTLE;fIUhHrqbaADD;C*}1XBy_lME1ejc*+!t z0-W*`cf8m=%8ikMk*7}<&Ynk)r%`jyOb1kiQC#OtD%7=8xO`=o=iC5!LBVSoobD6y zK{?Nq!M1+4koi2?E>g59c@7a#Q~#wfInvT6)>8%0(V4KG+`ehk?Q28Mo7PBNA#bUc z4I$)H+$mv5gv&)J-o!kNHQ#JSW>h1GerJ9DHB&eOQ@x6mb49*zLb*PNKUmD_zpY;= zH%PFvY6dE&y+Ws&$TwDKC%%3(>4Pq_l$KAo8EVeaJ*cxH0DsWrkQ0y*@Rdic)^($J z_H=_Ys$fznKpRD)OUga{UUBkE7};DAu2E)EMDE$7U&A`e#zC*oGWv zr&OFo<;2Bs&Ni2#G8d-!%EgU1z9xlj{mas8Qw!{kZFAql?2kiC`C3n!3`4nxC${9Q zuU~v~X$FuX6}LEsIl40Qp|AKHsP%2~YV$7S`Q0OxkoK9Dm^?^>mb@>as(fHSn{M>Xt4DtQ!7o6k_y?-P$3MpP{Riit0g?XMgL9*qoB9tAUU}}^d$j*wnf+A+ diff --git a/docs/change-log.md b/docs/change-log.md index 443f5a19..88712934 100644 --- a/docs/change-log.md +++ b/docs/change-log.md @@ -7,6 +7,10 @@ - Added `m.route()` overload to allow reading of current route [#61](https://github.com/lhorie/mithril.js/issues/61) - Added `background` option to `m.request` to allow requests that don't affect rendering [#62](https://github.com/lhorie/mithril.js/issues/62) +### Bug Fixes: + +- Links using `config: m.route` can now be opened in new tab correctly [#64](https://github.com/lhorie/mithril.js/issues/64) + --- [v0.1.10](/mithril/archive/v0.1.10) - maintenance diff --git a/docs/mithril.md b/docs/mithril.md index bc0af967..27242dba 100644 --- a/docs/mithril.md +++ b/docs/mithril.md @@ -138,6 +138,12 @@ m("div", {style: {border: "1px solid red"}}); //yields
    +``` + --- You can define a non-HTML-standard attribute called `config`. This special parameter allows you to call methods on the DOM element after it gets created. diff --git a/mithril.js b/mithril.js index 06685a0f..f07d8197 100644 --- a/mithril.js +++ b/mithril.js @@ -211,7 +211,7 @@ Mithril = m = new function app(window) { return value } - var roots = [], modules = [], controllers = [], now = 0, lastRedraw = 0, lastRedrawId = 0 + var roots = [], modules = [], controllers = [], now = 0, lastRedraw = 0, lastRedrawId = 0, computePostRedrawHook = null m.module = function(root, module) { m.startComputation() var index = roots.indexOf(root) @@ -235,20 +235,18 @@ Mithril = m = new function app(window) { for (var i = 0; i < roots.length; i++) { m.render(roots[i], modules[i].view(controllers[i])) } + if (computePostRedrawHook) { + computePostRedrawHook() + computePostRedrawHook = null + } lastRedraw = now } - var pendingRequests = 0, computePostRedrawHook = null + var pendingRequests = 0 m.startComputation = function() {pendingRequests++} m.endComputation = function() { pendingRequests = Math.max(pendingRequests - 1, 0) - if (pendingRequests == 0) { - m.redraw() - if (computePostRedrawHook) { - computePostRedrawHook() - computePostRedrawHook = null - } - } + if (pendingRequests == 0) m.redraw() } m.withAttr = function(prop, withAttrCallback) { @@ -279,6 +277,7 @@ Mithril = m = new function app(window) { else if (arguments[0].addEventListener) { var element = arguments[0] var isInitialized = arguments[1] + element.href = modes[m.route.mode] + element.pathname if (!isInitialized) { element.removeEventListener("click", routeUnobtrusive) element.addEventListener("click", routeUnobtrusive) @@ -316,8 +315,9 @@ Mithril = m = new function app(window) { } } function routeUnobtrusive(e) { + if (e.ctrlKey || e.metaKey || e.which == 2) return e.preventDefault() - m.route(e.currentTarget.getAttribute("href")) + m.route(e.currentTarget[m.route.mode].slice(modes[m.route.mode].length)) } function scrollToHash() { if (m.route.mode != "hash" && window.location.hash) window.location.hash = window.location.hash diff --git a/tests/mithril-tests.js b/tests/mithril-tests.js index 7b95b041..345226d5 100644 --- a/tests/mithril-tests.js +++ b/tests/mithril-tests.js @@ -330,7 +330,7 @@ function testMithril(mock) { //m.redraw test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup var controller var root = mock.document.createElement("div") m.module(root, { @@ -342,11 +342,11 @@ function testMithril(mock) { var lengthBefore = root.childNodes.length mock.performance.$elapse(50) m.redraw() - mock.performance.$elapse(50) + mock.performance.$elapse(50) //teardown return lengthBefore === 0 && root.childNodes[0].nodeValue === "foo" }) test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup var count = 0 var root = mock.document.createElement("div") m.module(root, { @@ -360,13 +360,13 @@ function testMithril(mock) { m.redraw() mock.performance.$elapse(50) m.redraw() - mock.performance.$elapse(50) + mock.performance.$elapse(50) //teardown return count === 2 }) //m.route test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup mock.location.search = "?" var root = mock.document.createElement("div") @@ -374,10 +374,11 @@ function testMithril(mock) { m.route(root, "/test1", { "/test1": {controller: function() {}, view: function() {return "foo"}} }) + mock.performance.$elapse(50) //teardown return mock.location.search == "?/test1" && root.childNodes[0].nodeValue === "foo" }) test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup mock.location.pathname = "/" var root = mock.document.createElement("div") @@ -385,10 +386,11 @@ function testMithril(mock) { m.route(root, "/test2", { "/test2": {controller: function() {}, view: function() {return "foo"}} }) + mock.performance.$elapse(50) //teardown return mock.location.pathname == "/test2" && root.childNodes[0].nodeValue === "foo" }) test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup mock.location.hash = "#" var root = mock.document.createElement("div") @@ -396,10 +398,11 @@ function testMithril(mock) { m.route(root, "/test3", { "/test3": {controller: function() {}, view: function() {return "foo"}} }) + mock.performance.$elapse(50) //teardown return mock.location.hash == "#/test3" && root.childNodes[0].nodeValue === "foo" }) test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup mock.location.search = "?" var root = mock.document.createElement("div") @@ -407,10 +410,11 @@ function testMithril(mock) { m.route(root, "/test4/foo", { "/test4/:test": {controller: function() {}, view: function() {return m.route.param("test")}} }) + mock.performance.$elapse(50) //teardown return mock.location.search == "?/test4/foo" && root.childNodes[0].nodeValue === "foo" }) test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup mock.location.search = "?" var module = {controller: function() {}, view: function() {return m.route.param("test")}} @@ -422,13 +426,14 @@ function testMithril(mock) { "/test5/:test": module }) var paramValueBefore = m.route.param("test") + mock.performance.$elapse(50) m.route("/") var paramValueAfter = m.route.param("test") - + mock.performance.$elapse(50) //teardown return mock.location.search == "?/" && paramValueBefore === "foo" && paramValueAfter === undefined }) test(function() { - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup mock.location.search = "?" var module = {controller: function() {}, view: function() {return m.route.param("a1")}} @@ -440,13 +445,15 @@ function testMithril(mock) { "/test6/:a1": module }) var paramValueBefore = m.route.param("a1") + mock.performance.$elapse(50) m.route("/") var paramValueAfter = m.route.param("a1") + mock.performance.$elapse(50) //teardown return mock.location.search == "?/" && paramValueBefore === "foo" && paramValueAfter === undefined }) test(function() { //https://github.com/lhorie/mithril.js/issues/61 - mock.performance.$elapse(50) + mock.performance.$elapse(50) //setup mock.location.search = "?" var module = {controller: function() {}, view: function() {return m.route.param("a1")}} @@ -458,8 +465,10 @@ function testMithril(mock) { "/test7/:a1": module }) var routeValueBefore = m.route() + mock.performance.$elapse(50) m.route("/") var routeValueAfter = m.route() + mock.performance.$elapse(50) //teardown return routeValueBefore === "/test7/foo" && routeValueAfter === "/" })