summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/modules/related-posts/related-posts.js')
-rw-r--r--plugins/jetpack/modules/related-posts/related-posts.js227
1 files changed, 140 insertions, 87 deletions
diff --git a/plugins/jetpack/modules/related-posts/related-posts.js b/plugins/jetpack/modules/related-posts/related-posts.js
index 76f7d33d..223fb719 100644
--- a/plugins/jetpack/modules/related-posts/related-posts.js
+++ b/plugins/jetpack/modules/related-posts/related-posts.js
@@ -3,7 +3,9 @@
/**
* Load related posts
*/
-( function( $ ) {
+( function () {
+ 'use strict';
+
var jprp = {
response: null,
@@ -13,7 +15,7 @@
* @param {string} URL (optional)
* @return {string} Endpoint URL
*/
- getEndpointURL: function( URL ) {
+ getEndpointURL: function ( URL ) {
var locationObject,
is_customizer =
'undefined' !== typeof wp &&
@@ -36,8 +38,14 @@
}
var args = 'relatedposts=1';
- if ( $( '#jp-relatedposts' ).data( 'exclude' ) ) {
- args += '&relatedposts_exclude=' + $( '#jp-relatedposts' ).data( 'exclude' );
+ var relatedPosts = document.querySelector( '#jp-relatedposts' );
+
+ if ( ! relatedPosts ) {
+ return false;
+ }
+
+ if ( relatedPosts.hasAttribute( 'data-exclude' ) ) {
+ args += '&relatedposts_exclude=' + relatedPosts.getAttribute( 'data-exclude' );
}
if ( is_customizer ) {
@@ -56,39 +64,31 @@
}
},
- getAnchor: function( post, classNames ) {
- var anchor_title = post.title;
- if ( '' !== '' + post.excerpt ) {
- anchor_title += '\n\n' + post.excerpt;
- }
-
- var anchor = $( '<a>' );
-
- anchor.attr( {
- class: classNames,
- href: post.url,
- title: anchor_title,
- 'data-origin': post.url_meta.origin,
- 'data-position': post.url_meta.position,
- } );
+ getAnchor: function ( post, classNames ) {
+ var anchorTitle = post.title;
+ var anchor = document.createElement( 'a' );
+ anchor.setAttribute( 'class', classNames );
+ anchor.setAttribute( 'href', post.url );
+ anchor.setAttribute( 'title', anchorTitle );
+ anchor.setAttribute( 'data-origin', post.url_meta.origin );
+ anchor.setAttribute( 'data-position', post.url_meta.position );
if ( '' !== post.rel ) {
- anchor.attr( {
- rel: post.rel,
- } );
+ anchor.setAttribute( 'rel', post.rel );
}
- var anchor_html = $( '<div>' )
- .append( anchor )
- .html();
- return [ anchor_html.substring( 0, anchor_html.length - 4 ), '</a>' ];
+ var div = document.createElement( 'div' );
+ div.appendChild( anchor );
+
+ var anchorHTML = div.innerHTML;
+ return [ anchorHTML.substring( 0, anchorHTML.length - 4 ), '</a>' ];
},
- generateMinimalHtml: function( posts, options ) {
+ generateMinimalHtml: function ( posts, options ) {
var self = this;
var html = '';
- $.each( posts, function( index, post ) {
+ posts.forEach( function ( post, index ) {
var anchor = self.getAnchor( post, 'jp-relatedposts-post-a' );
var classes = 'jp-relatedposts-post jp-relatedposts-post' + index;
@@ -111,7 +111,12 @@
anchor[ 1 ] +
'</span>';
if ( options.showDate ) {
- html += '<span class="jp-relatedposts-post-date">' + post.date + '</span>';
+ html +=
+ '<time class="jp-relatedposts-post-date" datetime="' +
+ post.date +
+ '">' +
+ post.date +
+ '</time>';
}
if ( options.showContext ) {
html += '<span class="jp-relatedposts-post-context">' + post.context + '</span>';
@@ -127,11 +132,11 @@
);
},
- generateVisualHtml: function( posts, options ) {
+ generateVisualHtml: function ( posts, options ) {
var self = this;
var html = '';
- $.each( posts, function( index, post ) {
+ posts.forEach( function ( post, index ) {
var anchor = self.getAnchor( post, 'jp-relatedposts-post-a' );
var classes = 'jp-relatedposts-post jp-relatedposts-post' + index;
@@ -145,6 +150,10 @@
classes += ' jp-relatedposts-post-thumbs';
}
+ var dummyContainer = document.createElement( 'p' );
+ dummyContainer.innerHTML = post.excerpt;
+ var excerpt = dummyContainer.textContent;
+
html +=
'<div class="' +
classes +
@@ -156,12 +165,14 @@
if ( post.img.src ) {
html +=
anchor[ 0 ] +
- '<img class="jp-relatedposts-post-img" src="' +
+ '<img class="jp-relatedposts-post-img" loading="lazy" src="' +
post.img.src +
'" width="' +
post.img.width +
+ '" height="' +
+ post.img.height +
'" alt="' +
- post.title +
+ post.img.alt_text +
'" />' +
anchor[ 1 ];
} else {
@@ -181,14 +192,14 @@
'</' +
related_posts_js_options.post_heading +
'>';
- html +=
- '<p class="jp-relatedposts-post-excerpt">' +
- $( '<p>' )
- .text( post.excerpt )
- .html() +
- '</p>';
+ html += '<p class="jp-relatedposts-post-excerpt">' + excerpt + '</p>';
if ( options.showDate ) {
- html += '<p class="jp-relatedposts-post-date">' + post.date + '</p>';
+ html +=
+ '<time class="jp-relatedposts-post-date" datetime="' +
+ post.date +
+ '">' +
+ post.date +
+ '</time>';
}
if ( options.showContext ) {
html += '<p class="jp-relatedposts-post-context">' + post.context + '</p>';
@@ -210,26 +221,30 @@
* cut off a line of text in the middle so we need to do some detective
* work.
*/
- setVisualExcerptHeights: function() {
- var elements = $(
+ setVisualExcerptHeights: function () {
+ var elements = document.querySelectorAll(
'#jp-relatedposts .jp-relatedposts-post-nothumbs .jp-relatedposts-post-excerpt'
);
- if ( 0 >= elements.length ) {
+ if ( ! elements.length ) {
return;
}
- var fontSize = parseInt( elements.first().css( 'font-size' ), 10 ),
- lineHeight = parseInt( elements.first().css( 'line-height' ), 10 );
+ var firstElementStyles = getComputedStyle( elements[ 0 ] );
+
+ var fontSize = parseInt( firstElementStyles.fontSize, 10 );
+ var lineHeight = parseInt( firstElementStyles.lineHeight, 10 );
// Show 5 lines of text
- elements.css( 'max-height', ( 5 * lineHeight ) / fontSize + 'em' );
+ for ( var i = 0; i < elements.length; i++ ) {
+ elements[ i ].style.maxHeight = ( 5 * lineHeight ) / fontSize + 'em';
+ }
},
- getTrackedUrl: function( anchor ) {
+ getTrackedUrl: function ( anchor ) {
var args = 'relatedposts_hit=1';
- args += '&relatedposts_origin=' + $( anchor ).data( 'origin' );
- args += '&relatedposts_position=' + $( anchor ).data( 'position' );
+ args += '&relatedposts_origin=' + anchor.getAttribute( 'data-origin' );
+ args += '&relatedposts_position=' + anchor.getAttribute( 'data-position' );
var pathname = anchor.pathname;
if ( '/' !== pathname[ 0 ] ) {
@@ -243,7 +258,7 @@
}
},
- cleanupTrackedUrl: function() {
+ cleanupTrackedUrl: function () {
if ( 'function' !== typeof history.replaceState ) {
return;
}
@@ -263,8 +278,12 @@
function afterPostsHaveLoaded() {
jprp.setVisualExcerptHeights();
- $( '#jp-relatedposts a.jp-relatedposts-post-a' ).click( function() {
- this.href = jprp.getTrackedUrl( this );
+ var posts = document.querySelectorAll( '#jp-relatedposts a.jp-relatedposts-post-a' );
+
+ Array.prototype.forEach.call( posts, function ( post ) {
+ document.addEventListener( 'click', function () {
+ post.href = jprp.getTrackedUrl( post );
+ } );
} );
}
@@ -274,54 +293,82 @@
function startRelatedPosts() {
jprp.cleanupTrackedUrl();
- var endpointURL = jprp.getEndpointURL(),
- $relatedPosts = $( '#jp-relatedposts' );
+ var endpointURL = jprp.getEndpointURL();
+ var relatedPosts = document.querySelector( '#jp-relatedposts' );
+
+ if ( ! endpointURL ) {
+ return;
+ }
- if ( $( '#jp-relatedposts .jp-relatedposts-post' ).length ) {
+ if ( document.querySelectorAll( '#jp-relatedposts .jp-relatedposts-post' ).length ) {
afterPostsHaveLoaded();
return;
}
- $.getJSON( endpointURL, function( response ) {
- if ( 0 === response.items.length || 0 === $relatedPosts.length ) {
- return;
- }
+ var request = new XMLHttpRequest();
+ request.open( 'GET', endpointURL, true );
+ request.setRequestHeader( 'x-requested-with', 'XMLHttpRequest' );
+
+ request.onreadystatechange = function () {
+ if ( this.readyState === XMLHttpRequest.DONE && this.status === 200 ) {
+ try {
+ var response = JSON.parse( request.responseText );
- jprp.response = response;
+ if ( 0 === response.items.length || 0 === relatedPosts.length ) {
+ return;
+ }
- var html,
- showThumbnails,
- options = {};
+ jprp.response = response;
+
+ var html,
+ showThumbnails,
+ options = {};
+
+ if ( 'undefined' !== typeof wp && wp.customize ) {
+ showThumbnails = wp.customize.instance( 'jetpack_relatedposts[show_thumbnails]' ).get();
+ options.showDate = wp.customize.instance( 'jetpack_relatedposts[show_date]' ).get();
+ options.showContext = wp.customize
+ .instance( 'jetpack_relatedposts[show_context]' )
+ .get();
+ options.layout = wp.customize.instance( 'jetpack_relatedposts[layout]' ).get();
+ } else {
+ showThumbnails = response.show_thumbnails;
+ options.showDate = response.show_date;
+ options.showContext = response.show_context;
+ options.layout = response.layout;
+ }
- if ( 'undefined' !== typeof wp && wp.customize ) {
- showThumbnails = wp.customize.instance( 'jetpack_relatedposts[show_thumbnails]' ).get();
- options.showDate = wp.customize.instance( 'jetpack_relatedposts[show_date]' ).get();
- options.showContext = wp.customize.instance( 'jetpack_relatedposts[show_context]' ).get();
- options.layout = wp.customize.instance( 'jetpack_relatedposts[layout]' ).get();
- } else {
- showThumbnails = response.show_thumbnails;
- options.showDate = response.show_date;
- options.showContext = response.show_context;
- options.layout = response.layout;
- }
+ html = ! showThumbnails
+ ? jprp.generateMinimalHtml( response.items, options )
+ : jprp.generateVisualHtml( response.items, options );
+
+ var div = document.createElement( 'div' );
+ relatedPosts.appendChild( div );
+ div.outerHTML = html;
- html = ! showThumbnails
- ? jprp.generateMinimalHtml( response.items, options )
- : jprp.generateVisualHtml( response.items, options );
+ if ( options.showDate ) {
+ var dates = relatedPosts.querySelectorAll( '.jp-relatedposts-post-date' );
- $relatedPosts.append( html );
- if ( options.showDate ) {
- $relatedPosts.find( '.jp-relatedposts-post-date' ).show();
+ Array.prototype.forEach.call( dates, function ( date ) {
+ date.style.display = 'block';
+ } );
+ }
+
+ relatedPosts.style.display = 'block';
+ afterPostsHaveLoaded();
+ } catch ( error ) {
+ // Do nothing
+ }
}
- $relatedPosts.show();
- afterPostsHaveLoaded();
- } );
+ };
+
+ request.send();
}
- $( function() {
+ function init() {
if ( 'undefined' !== typeof wp && wp.customize ) {
if ( wp.customize.selectiveRefresh ) {
- wp.customize.selectiveRefresh.bind( 'partial-content-rendered', function( placement ) {
+ wp.customize.selectiveRefresh.bind( 'partial-content-rendered', function ( placement ) {
if ( 'jetpack_relatedposts' === placement.partial.id ) {
startRelatedPosts();
}
@@ -331,5 +378,11 @@
} else {
startRelatedPosts();
}
- } );
-} )( jQuery );
+ }
+
+ if ( document.readyState !== 'loading' ) {
+ init();
+ } else {
+ document.addEventListener( 'DOMContentLoaded', init );
+ }
+} )();