|
@@ -29,7 +29,8 @@
|
|
this.verticalMargin = verticalMargin;
|
|
this.verticalMargin = verticalMargin;
|
|
this.horizontalMargin = horizontalMargin;
|
|
this.horizontalMargin = horizontalMargin;
|
|
this.maxHeight = maxHeight;
|
|
this.maxHeight = maxHeight;
|
|
- this.isAlignDone = true;
|
|
|
|
|
|
+ this.trottleCallToAlign = null;
|
|
|
|
+ this.alignAfterThrotteling = false;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -72,12 +73,12 @@
|
|
// not loaded image : make it square as _getHeigth said it
|
|
// not loaded image : make it square as _getHeigth said it
|
|
imgWidth = height;
|
|
imgWidth = height;
|
|
}
|
|
}
|
|
- img.style.width = imgWidth + 'px';
|
|
|
|
- img.style.height = height + 'px';
|
|
|
|
- img.style.marginLeft = this.horizontalMargin + 'px';
|
|
|
|
- img.style.marginTop = this.horizontalMargin + 'px';
|
|
|
|
- img.style.marginRight = this.verticalMargin - 7 + 'px'; // -4 is the negative margin of the inline element
|
|
|
|
- img.style.marginBottom = this.verticalMargin - 7 + 'px';
|
|
|
|
|
|
+ img.setAttribute('width', Math.round(imgWidth));
|
|
|
|
+ img.setAttribute('height', Math.round(height));
|
|
|
|
+ img.style.marginLeft = Math.round(this.horizontalMargin) + 'px';
|
|
|
|
+ img.style.marginTop = Math.round(this.horizontalMargin) + 'px';
|
|
|
|
+ img.style.marginRight = Math.round(this.verticalMargin - 7) + 'px'; // -4 is the negative margin of the inline element
|
|
|
|
+ img.style.marginBottom = Math.round(this.verticalMargin - 7) + 'px';
|
|
resultNode = img.parentNode.parentNode;
|
|
resultNode = img.parentNode.parentNode;
|
|
if (!resultNode.classList.contains('js')) {
|
|
if (!resultNode.classList.contains('js')) {
|
|
resultNode.classList.add('js');
|
|
resultNode.classList.add('js');
|
|
@@ -112,6 +113,23 @@
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+ ImageLayout.prototype.throttleAlign = function () {
|
|
|
|
+ var obj = this;
|
|
|
|
+ if (obj.trottleCallToAlign) {
|
|
|
|
+ obj.alignAfterThrotteling = true;
|
|
|
|
+ } else {
|
|
|
|
+ obj.alignAfterThrotteling = false;
|
|
|
|
+ obj.align();
|
|
|
|
+ obj.trottleCallToAlign = setTimeout(function () {
|
|
|
|
+ if (obj.alignAfterThrotteling) {
|
|
|
|
+ obj.align();
|
|
|
|
+ }
|
|
|
|
+ obj.alignAfterThrotteling = false;
|
|
|
|
+ obj.trottleCallToAlign = null;
|
|
|
|
+ }, 20);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
ImageLayout.prototype.align = function () {
|
|
ImageLayout.prototype.align = function () {
|
|
var i;
|
|
var i;
|
|
var results_selectorNode = d.querySelectorAll(this.results_selector);
|
|
var results_selectorNode = d.querySelectorAll(this.results_selector);
|
|
@@ -141,9 +159,9 @@
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
- ImageLayout.prototype.watch = function () {
|
|
|
|
|
|
+ ImageLayout.prototype._monitorImages = function () {
|
|
var i, img;
|
|
var i, img;
|
|
- var obj = this;
|
|
|
|
|
|
+ var objthrottleAlign = this.throttleAlign.bind(this);
|
|
var results_nodes = d.querySelectorAll(this.results_selector);
|
|
var results_nodes = d.querySelectorAll(this.results_selector);
|
|
var results_length = results_nodes.length;
|
|
var results_length = results_nodes.length;
|
|
|
|
|
|
@@ -152,34 +170,53 @@
|
|
event.originalTarget.src = w.searxng.static_path + w.searxng.theme.img_load_error;
|
|
event.originalTarget.src = w.searxng.static_path + w.searxng.theme.img_load_error;
|
|
}
|
|
}
|
|
|
|
|
|
- function throttleAlign () {
|
|
|
|
- if (obj.isAlignDone) {
|
|
|
|
- obj.isAlignDone = false;
|
|
|
|
- setTimeout(function () {
|
|
|
|
- obj.align();
|
|
|
|
- obj.isAlignDone = true;
|
|
|
|
- }, 100);
|
|
|
|
|
|
+ for (i = 0; i < results_length; i++) {
|
|
|
|
+ img = results_nodes[i].querySelector(this.img_selector);
|
|
|
|
+ if (img !== null && img !== undefined && !img.classList.contains('aligned')) {
|
|
|
|
+ img.addEventListener('load', objthrottleAlign);
|
|
|
|
+ // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror
|
|
|
|
+ img.addEventListener('error', objthrottleAlign);
|
|
|
|
+ img.addEventListener('timeout', objthrottleAlign);
|
|
|
|
+ if (w.searxng.theme.img_load_error) {
|
|
|
|
+ img.addEventListener('error', img_load_error, {once: true});
|
|
|
|
+ }
|
|
|
|
+ img.classList.add('aligned');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ImageLayout.prototype.watch = function () {
|
|
|
|
+ var objthrottleAlign = this.throttleAlign.bind(this);
|
|
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/Window/pageshow_event
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/Window/pageshow_event
|
|
- w.addEventListener('pageshow', throttleAlign);
|
|
|
|
|
|
+ w.addEventListener('pageshow', objthrottleAlign);
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/FileReader/load_event
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/FileReader/load_event
|
|
- w.addEventListener('load', throttleAlign);
|
|
|
|
|
|
+ w.addEventListener('load', objthrottleAlign);
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/Window/resize_event
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/Window/resize_event
|
|
- w.addEventListener('resize', throttleAlign);
|
|
|
|
|
|
+ w.addEventListener('resize', objthrottleAlign);
|
|
|
|
|
|
- for (i = 0; i < results_length; i++) {
|
|
|
|
- img = results_nodes[i].querySelector(this.img_selector);
|
|
|
|
- if (img !== null && img !== undefined) {
|
|
|
|
- img.addEventListener('load', throttleAlign);
|
|
|
|
- // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror
|
|
|
|
- img.addEventListener('error', throttleAlign);
|
|
|
|
- if (w.searxng.theme.img_load_error) {
|
|
|
|
- img.addEventListener('error', img_load_error, {once: true});
|
|
|
|
|
|
+ this._monitorImages();
|
|
|
|
+
|
|
|
|
+ var obj = this;
|
|
|
|
+
|
|
|
|
+ let observer = new MutationObserver(entries => {
|
|
|
|
+ let newElement = false;
|
|
|
|
+ for (let i = 0; i < entries.length; i++) {
|
|
|
|
+ if (entries[i].addedNodes.length > 0 && entries[i].addedNodes[0].classList.contains('result')) {
|
|
|
|
+ newElement = true;
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ if (newElement) {
|
|
|
|
+ obj._monitorImages();
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ observer.observe(d.querySelector(this.container_selector), {
|
|
|
|
+ childList: true,
|
|
|
|
+ subtree: true,
|
|
|
|
+ attributes: false,
|
|
|
|
+ characterData: false,
|
|
|
|
+ })
|
|
};
|
|
};
|
|
|
|
|
|
w.searxng.ImageLayout = ImageLayout;
|
|
w.searxng.ImageLayout = ImageLayout;
|