diff --git a/.gitignore b/.gitignore index b9d6bd9..3835d69 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +bower_components/ +node_modules/ + ################# ## Eclipse ################# @@ -192,7 +195,6 @@ $RECYCLE.BIN/ # Packages *.egg *.egg-info -dist/ build/ eggs/ parts/ diff --git a/Examples/OptionalBinding/example.html b/Examples/OptionalBinding/example.html new file mode 100644 index 0000000..05aa2f8 --- /dev/null +++ b/Examples/OptionalBinding/example.html @@ -0,0 +1,70 @@ + + + + + + + + + + + +
+Loaded with function parameters +
+
+ +
+ +
+Loaded with template parameters +
+
+ +
+ +
+Loaded with template as data-bind-template attribute +
+
+ +
+Loaded with nested template with function parameters +
+
+ diff --git a/Examples/SimpleExample/Templates/simple.html b/Examples/SimpleExample/Templates/simple.html index dc613aa..2e75af5 100644 --- a/Examples/SimpleExample/Templates/simple.html +++ b/Examples/SimpleExample/Templates/simple.html @@ -3,9 +3,9 @@
- +
diff --git a/Examples/SimpleExample/example.html b/Examples/SimpleExample/example.html index 6629c4d..d54b719 100644 --- a/Examples/SimpleExample/example.html +++ b/Examples/SimpleExample/example.html @@ -13,11 +13,13 @@

Example of loading a template from a script tag within the same document.
+
+ + + + + + diff --git a/Examples/index.html b/Examples/index.html index e13f315..f14d59a 100644 --- a/Examples/index.html +++ b/Examples/index.html @@ -9,7 +9,7 @@ - +
@@ -23,6 +23,7 @@

Examples of jQuery.loadTemplate

  • Examples!
  • Basic Example
  • Simple Search
  • +
  • Optional Binding
  • @@ -80,7 +81,7 @@

    Code

    $($div).load($(this).attr("href"), function () { $(".contentContainer > div").hide(); $(".codeContainer > div").hide(); - $(".contentContainer div.content").html($div.html()); + $(".contentContainer div.content").html("").append($div); $(".codeContainer pre code").text($div.html()); if(highlightSupported()) { $(".codeContainer pre code").each(function () { diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..5b6e0c6 --- /dev/null +++ b/bower.json @@ -0,0 +1,32 @@ +{ + "name": "jquery-load-template", + "homepage": "http://codepb.github.io/jquery-template/", + "authors": [ + "Paul Burgess " + ], + "description": "jQuery plugin for loading and using templates. The plugin supports loading templates from within the page, or using AJAX to load html files.", + "repository": { + "type": "git", + "url": "https://github.com/codepb/jquery-template.git" + }, + "main": "dist/jquery.loadTemplate.js", + "keywords": [ + "templates", + "templating", + "jquery-plugin" + ], + "ignore": [ + "Examples", + "tests", + ".gitattributes", + ".gitignore", + ".travis.yml", + "loadTemplate.jquery.json", + "MIT-LICENSE.txt", + "package.json", + "readme.md" + ], + "dependencies": { + "jquery": ">=1.8" + } +} diff --git a/jquery-loadTemplate/jquery.loadTemplate-1.3.2.js b/dist/jquery.loadTemplate.js similarity index 62% rename from jquery-loadTemplate/jquery.loadTemplate-1.3.2.js rename to dist/jquery.loadTemplate.js index 60da5ee..aa9ba52 100644 --- a/jquery-loadTemplate/jquery.loadTemplate-1.3.2.js +++ b/dist/jquery.loadTemplate.js @@ -2,18 +2,20 @@ "use strict"; var templates = {}, queue = {}, - formatters = {}; + formatters = {}, + isArray; function loadTemplate(template, data, options) { var $that = this, $template, - settings, - isFile; + isFile, + settings; data = data || {}; - settings = $.extend({ + settings = $.extend(true, { // These are the defaults. + async: true, overwriteCache: false, complete: null, success: null, @@ -29,10 +31,16 @@ append: false, prepend: false, beforeInsert: null, - afterInsert: null + afterInsert: null, + bindingOptions: { + ignoreUndefined: false, + ignoreNull: false, + ignoreEmptyString: false + } }, options); if ($.type(data) === "array") { + isArray = true; return processArray.call(this, template, data, settings); } @@ -77,6 +85,7 @@ done = 0, success = 0, errored = false, + errorObjects = [], newOptions; if (settings.paged) { @@ -85,20 +94,20 @@ todo = data.length; } + if (!settings.append && !settings.prepend) { + $that.html(""); + } + newOptions = $.extend( {}, settings, { - complete: function () { - if (doPrepend) { - $that.prepend(this.html()); - } else { - $that.append(this.html()); - } + append: !settings.prepend && true, + complete: function (data) { done++; - if (done === todo) { + if (done === todo || errored) { if (errored && settings && typeof settings.error === "function") { - settings.error.call($that); + settings.error.call($that, errorObjects); } if (settings && typeof settings.complete === "function") { settings.complete(); @@ -113,20 +122,22 @@ } } }, - error: function () { + error: function (e) { errored = true; + errorObjects.push(e); } } ); - if (!settings.append && !settings.prepend) { - $that.html(""); - } + if (doPrepend) data.reverse(); $(data).each(function () { - var $div = $("
    "); - loadTemplate.call($div, template, this, newOptions); + + loadTemplate.call($that, template, this, newOptions); + if (errored) { + return false; + } }); return this; @@ -155,38 +166,38 @@ function urlAvoidCache(url) { if (url.indexOf('?') !== -1) { - return url += "&_=" + uniqueId(); + return url + "&_=" + uniqueId(); } else { - return url += "?_=" + uniqueId(); + return url + "?_=" + uniqueId(); } } function loadAndPrepareTemplate(template, selection, data, settings) { - var $templateContainer = $("
    "); templates[template] = null; + var templateUrl = template; if (settings.overwriteCache) { - template = urlAvoidCache(template); + templateUrl = urlAvoidCache(templateUrl); } - $templateContainer.load(template, function (responseText, textStatus) { - if (textStatus === "error") { - handleTemplateLoadingError(template, selection, data, settings); - } else { - handleTemplateLoadingSuccess($templateContainer, template, selection, data, settings); + $.ajax({ + url: templateUrl, + async: settings.async, + success: function (templateContent) { + handleTemplateLoadingSuccess($(templateContent), template, selection, data, settings); + }, + error: function (e) { + handleTemplateLoadingError(template, selection, data, settings, e); } }); } function loadTemplateFromDocument($template, selection, data, settings) { - var $templateContainer = $("
    "); - - if ($template.is("script")) { + if ($template.is("script") || $template.is("template")) { $template = $.parseHTML($.trim($template.html())); } - $templateContainer.html($template); - prepareTemplate.call(selection, $templateContainer, data, settings); + prepareTemplate.call(selection, $template, data, settings); if (typeof settings.success === "function") { settings.success(); @@ -194,12 +205,16 @@ } function prepareTemplate(template, data, settings) { - bindData(template, data); + var template = $("
    ").append(template); + bindData(template, data, settings); $(this).each(function () { - var $templateHtml = $(template.html()); + var $templateHtml = template.children().clone(true); + $("select", $templateHtml).each(function (key, value) { + $(this).val($("select", template).eq(key).val()) + }); if (settings.beforeInsert) { - settings.beforeInsert($templateHtml); + settings.beforeInsert($templateHtml, data); } if (settings.append) { @@ -207,28 +222,28 @@ } else if (settings.prepend) { $(this).prepend($templateHtml); } else { - $(this).html($templateHtml); + $(this).html("").append($templateHtml); } if (settings.afterInsert) { - settings.afterInsert($templateHtml); + settings.afterInsert($templateHtml, data); } }); if (typeof settings.complete === "function") { - settings.complete.call($(this)); + settings.complete.call($(this), data); } } - function handleTemplateLoadingError(template, selection, data, settings) { + function handleTemplateLoadingError(template, selection, data, settings, error) { var value; if (typeof settings.error === "function") { - settings.error.call(selection); + settings.error.call(selection, error); } $(queue[template]).each(function (key, value) { if (typeof value.settings.error === "function") { - value.settings.error.call(value.selection); + value.settings.error.call(value.selection, error); } }); @@ -265,68 +280,101 @@ } } - function bindData(template, data) { + function bindData(template, data, settings) { data = data || {}; - processElements("data-content", template, data, function ($elem, value) { - $elem.html(applyFormatters($elem, value, "content")); + processElements("data-content", template, data, settings, function ($elem, value) { + $elem.html(applyFormatters($elem, value, "content", settings)); + }); + + processElements("data-content-append", template, data, settings, function ($elem, value) { + $elem.append(applyFormatters($elem, value, "content", settings)); }); - processElements("data-content-append", template, data, function ($elem, value) { - $elem.append(applyFormatters($elem, value, "content")); + processElements("data-content-prepend", template, data, settings, function ($elem, value) { + $elem.prepend(applyFormatters($elem, value, "content", settings)); }); - processElements("data-content-prepend", template, data, function ($elem, value) { - $elem.prepend(applyFormatters($elem, value, "content")); + processElements("data-content-text", template, data, settings, function ($elem, value) { + $elem.text(applyFormatters($elem, value, "content", settings)); }); - processElements("data-content-text", template, data, function ($elem, value) { - $elem.text(applyFormatters($elem, value, "content")); + processElements("data-innerHTML", template, data, settings, function ($elem, value) { + $elem.html(applyFormatters($elem, value, "content", settings)); }); - processElements("data-src", template, data, function ($elem, value) { - $elem.attr("src", applyFormatters($elem, value, "src")); + processElements("data-src", template, data, settings, function ($elem, value) { + $elem.attr("src", applyFormatters($elem, value, "src", settings)); }, function ($elem) { $elem.remove(); }); - processElements("data-alt", template, data, function ($elem, value) { - $elem.attr("alt", applyFormatters($elem, value, "alt")); + processElements("data-href", template, data, settings, function ($elem, value) { + $elem.attr("href", applyFormatters($elem, value, "href", settings)); + }, function ($elem) { + $elem.remove(); }); - processElements("data-value", template, data, function ($elem, value) { - $elem.attr("value", applyFormatters($elem, value, "value")); + processElements("data-alt", template, data, settings, function ($elem, value) { + $elem.attr("alt", applyFormatters($elem, value, "alt", settings)); + }); + + processElements("data-title", template, data, settings, function ($elem, value) { + $elem.attr("title", applyFormatters($elem, value, "title", settings)); + }); + + processElements("data-id", template, data, settings, function ($elem, value) { + $elem.attr("id", applyFormatters($elem, value, "id", settings)); + }); + + processElements("data-css", template, data, settings, function ($elem, value) { + $elem.css(applyFormatters($elem, value, "css", settings)) + }); + + processElements("data-class", template, data, settings, function ($elem, value) { + $elem.addClass(applyFormatters($elem, value, "class", settings)); }); - processElements("data-link", template, data, function ($elem, value) { + processElements("data-link", template, data, settings, function ($elem, value) { var $linkElem = $(""); - $linkElem.attr("href", applyFormatters($elem, value, "link")); + $linkElem.attr("href", applyFormatters($elem, value, "link", settings)); $linkElem.html($elem.html()); $elem.html($linkElem); }); - processElements("data-link-wrap", template, data, function ($elem, value) { + processElements("data-link-wrap", template, data, settings, function ($elem, value) { var $linkElem = $(""); - $linkElem.attr("href", applyFormatters($elem, value, "link-wrap")); + $linkElem.attr("href", applyFormatters($elem, value, "link-wrap", settings)); $elem.wrap($linkElem); }); - processElements("data-options", template, data, function ($elem, value) { + processElements("data-options", template, data, settings, function ($elem, value) { $(value).each(function () { var $option = $("
    ").append(e),n,a),t(this).each(function(){var i=e.children().clone(!0);t("select",i).each(function(n,a){t(this).val(t("select",e).eq(n).val())}),a.beforeInsert&&a.beforeInsert(i,n),a.append?t(this).append(i):a.prepend?t(this).prepend(i):t(this).html("").append(i),a.afterInsert&&a.afterInsert(i,n)}),"function"==typeof a.complete&&a.complete.call(t(this),n)}function p(e,n,a,i,r){var o;for("function"==typeof i.error&&i.error.call(n,r),t(k[e]).each(function(t,e){"function"==typeof e.settings.error&&e.settings.error.call(e.selection,r)}),"function"==typeof i.complete&&i.complete.call(n);k[e]&&(o=k[e].shift());)"function"==typeof o.settings.complete&&o.settings.complete.call(o.selection);void 0!==k[e]&&k[e].length>0&&(k[e]=[])}function d(t,e,n,a,i){var r;for(w[e]=t.clone(),f.call(n,t,a,i),"function"==typeof i.success&&i.success.call(n);k[e]&&(r=k[e].shift());)f.call(r.selection,w[e].clone(),r.data,r.settings),"function"==typeof r.settings.success&&r.settings.success.call(r.selection)}function h(e,n,a){v("data-content",e,n=n||{},a,function(t,e){t.html(O(t,e,"content",a))}),v("data-content-append",e,n,a,function(t,e){t.append(O(t,e,"content",a))}),v("data-content-prepend",e,n,a,function(t,e){t.prepend(O(t,e,"content",a))}),v("data-content-text",e,n,a,function(t,e){t.text(O(t,e,"content",a))}),v("data-innerHTML",e,n,a,function(t,e){t.html(O(t,e,"content",a))}),v("data-src",e,n,a,function(t,e){t.attr("src",O(t,e,"src",a))},function(t){t.remove()}),v("data-href",e,n,a,function(t,e){t.attr("href",O(t,e,"href",a))},function(t){t.remove()}),v("data-alt",e,n,a,function(t,e){t.attr("alt",O(t,e,"alt",a))}),v("data-title",e,n,a,function(t,e){t.attr("title",O(t,e,"title",a))}),v("data-id",e,n,a,function(t,e){t.attr("id",O(t,e,"id",a))}),v("data-css",e,n,a,function(t,e){t.css(O(t,e,"css",a))}),v("data-class",e,n,a,function(t,e){t.addClass(O(t,e,"class",a))}),v("data-link",e,n,a,function(e,n){var i=t("");i.attr("href",O(e,n,"link",a)),i.html(e.html()),e.html(i)}),v("data-link-wrap",e,n,a,function(e,n){var i=t("");i.attr("href",O(e,n,"link-wrap",a)),e.wrap(i)}),v("data-options",e,n,a,function(e,n){t(n).each(function(){t("
    ");m.call(I,G,this,C)});return this}function c(A,y,x,z){if(t[A]){t[A].push({data:x,selection:y,settings:z})}else{t[A]=[{data:x,selection:y,settings:z}]}}function p(B,z,y,A){var x=u[B].clone();o.call(z,x,y,A);if(typeof A.success==="function"){A.success()}}function v(){return new Date().getTime()}function w(x){if(x.indexOf("?")!==-1){return x+="&_="+v()}else{return x+="?_="+v()}}function l(B,z,y,A){var x=a("
    ");u[B]=null;if(A.overwriteCache){B=w(B)}x.load(B,function(C,D){if(D==="error"){j(B,z,y,A)}else{k(x,B,z,y,A)}})}function n(x,A,z,B){var y=a("
    ");if(x.is("script")){x=a.parseHTML(a.trim(x.html()))}y.html(x);o.call(A,y,z,B);if(typeof B.success==="function"){B.success()}}function o(z,x,y){f(z,x);a(this).each(function(){var A=a(z.html());if(y.beforeInsert){y.beforeInsert(A)}if(y.append){a(this).append(A)}else{if(y.prepend){a(this).prepend(A)}else{a(this).html(A)}}if(y.afterInsert){y.afterInsert(A)}});if(typeof y.complete==="function"){y.complete.call(a(this))}}function j(A,y,x,z){var B;if(typeof z.error==="function"){z.error.call(y)}a(t[A]).each(function(C,D){if(typeof D.settings.error==="function"){D.settings.error.call(D.selection)}});if(typeof z.complete==="function"){z.complete.call(y)}while(t[A]&&(B=t[A].shift())){if(typeof B.settings.complete==="function"){B.settings.complete.call(B.selection)}}if(typeof t[A]!=="undefined"&&t[A].length>0){t[A]=[]}}function k(x,B,z,y,A){var C;u[B]=x.clone();o.call(z,x,y,A);if(typeof A.success==="function"){A.success.call(z)}while(t[B]&&(C=t[B].shift())){o.call(C.selection,u[B].clone(),C.data,C.settings);if(typeof C.settings.success==="function"){C.settings.success.call(C.selection)}}}function f(y,x){x=x||{};s("data-content",y,x,function(z,A){z.html(e(z,A,"content"))});s("data-content-append",y,x,function(z,A){z.append(e(z,A,"content"))});s("data-content-prepend",y,x,function(z,A){z.prepend(e(z,A,"content"))});s("data-content-text",y,x,function(z,A){z.text(e(z,A,"content"))});s("data-src",y,x,function(z,A){z.attr("src",e(z,A,"src"))},function(z){z.remove()});s("data-alt",y,x,function(z,A){z.attr("alt",e(z,A,"alt"))});s("data-value",y,x,function(z,A){z.attr("value",e(z,A,"value"))});s("data-link",y,x,function(z,B){var A=a("");A.attr("href",e(z,B,"link"));A.html(z.html());z.html(A)});s("data-link-wrap",y,x,function(z,B){var A=a("");A.attr("href",e(z,B,"link-wrap"));z.wrap(A)});s("data-options",y,x,function(z,A){a(A).each(function(){var B=a("