Kann nicht herausfinden, was mit meiner if-Anweisung in JavaScript nicht stimmt. [Update 1. September Es scheint, dass meine for-Schleife zweimal ausgeführt wird. Wie behebe ich das?]
var MarkUpChecker = (function iffe() {
'use strict';
var URLS = {
'foo': 'http://foo.com',
'bar': 'http://bar.com',
'baz': 'http://baz.com',
'yay': 'http://www.yay.com',
'blargh': 'http://www.blargh.com'
},
publicAPI;
function getURL() {
for (var i = 0; i < arguments.length; i++) {
return URLS[arguments[i]];
}
}
publicAPI = {
addURL: function() {
for (var i = 0; i < arguments.length; i += 2) {
URLS[arguments[i]] = arguments[i + 1];
}
console.dir(URLS);
return URLS;
},
addTag: function() {
var doc = document,
internal_h1 = doc.querySelectorAll('.internal_h1'),
sheet = doc.createElement('style');
for (var i = 0; i < internal_h1.length; i++) {
internal_h1[i].innerHTML = '<h1>' + internal_h1[i].innerHTML + '</h1>';
sheet.innerHTML = 'h1 {font-family: Helvetica, Arial, sans-serif !important; font-weight: 200!important; font-size: 22px !important; color: #333; margin: 3px 0px 6px; line-height: 24px !important;};'
doc.body.appendChild(sheet);
}
},
searchDoc: function() {
function insertAfter(newNode, referenceNode) {
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
var link, url, parser, newPathName = '',
emailUrl = /img\//gi,
tsUrl = /\/REPSuite\/static\/html\/inews_archives\/img\//gi,
newstr = '',
doc = document,
container,
container_id,
container_links,
container_images,
documentTableWrapper,
docBodyFirstChild,
nodeToTargetToInsertLP;
if (!doc.getElementById('container')) {
container = doc.createElement('div');
container.setAttribute('id', 'container');
container.className = 'container-avon-representative-news';
container_links = container.getElementsByTagName('a');
container_id = doc.getElementById('container');
docBodyFirstChild = doc.body.firstChild;
nodeToTargetToInsertLP = doc.getElementsByClassName('flexTile')[4];
if (nodeToTargetToInsertLP) {
documentTableWrapper = doc.getElementsByClassName('marginfix')[0];
container.appendChild(documentTableWrapper);
insertAfter(container, nodeToTargetToInsertLP);
} else {
documentTableWrapper = doc.getElementsByTagName('table')[0];
container.appendChild(documentTableWrapper);
doc.body.insertBefore(container, docBodyFirstChild);
}
} else {
container_links = doc.getElementById('container').getElementsByTagName('a');
}
container_images = container.getElementsByTagName('img');
for (var i = 0; i < container_images.length; i++) {
if (arguments[0] == "foo" || arguments[1] == "bar") {
container_images[i].src = container_images[i].src.replace(emailUrl, '/images/news/');
} else {
container_images[i].src = container_images[i].src.replace(emailUrl, '/static/images/alt_news/');
}
}
for (var i = 0, len = arguments.length; i < len; i++) {
url = getURL(arguments[i]);
for (var j = 0, jlen = container_links.length; j < jlen; j++) {
link = container_links[j];
if (link.href.indexOf(url) != -1) {
parser = document.createElement('a');
parser.href = link.href;
link.setAttribute('target', '_self');
newPathName = parser.pathname;
if (newPathName.search(/Executive|District|Division|National/) != -1) {
newPathName = newPathName.split('/').pop();
newstr = newPathName;
link.href = newstr;
}
} else {
link.setAttribute('target', '_blank');
}
}
}
}
};
return publicAPI;
})();
Mein Problem ist, dass meine Bedingung das Ziel nicht zu addieren scheint_self
Attribut zu einemhref
basierend auf einer Bedingung, wie ich sie für richtig halte.
Dies ist ein Auszug aus einer Funktion, die im obigen Snippet zu finden ist.
for (var i = 0, len = arguments.length; i < len; i++) {
url = getURL(arguments[i]);
for (var j = 0, jlen = container_links.length; j < jlen; j++) {
link = container_links[j];
if (link.href.indexOf(url) != -1) { //problem seems to be here
parser = document.createElement('a');
parser.href = link.href;
link.setAttribute('target', '_self');
newPathName = parser.pathname;
if (newPathName.search(/Executive|District|Division|National/) != -1) {
newPathName = newPathName.split('/').pop();
newstr = newPathName;
link.href = newstr;
}
} else {
link.setAttribute('target', '_blank');
}
}
}
Um Ihnen einige Hintergrundinformationen zu geben, besteht die Hauptfunktion des Skripts darin, redundante Aufgaben zu automatisieren, die ich wöchentlich für einen Newsletter ausführen muss, der für eine statische Webseite / Landing Page verwendet wird:
HTML:
<a href="http://foo.com/path/to_page.aspx">
<img src="img/some_image.jpg">
</a>
Das Skript durchsucht das DOM, sucht nach URLs, die einer Bedingung entsprechen, entfernt die Basis-URL und einen Teil des Pfadnamens und wendet target @ a_self
zumhref
Es ändert auch die Pfadnamen meiner Bilder!
m HTML rufe ich diese Funktion auf, die einen String akzeptiert:
MarkUpChecker.searchURL('foo', 'bar');
Diese Zeichenfolge stellt die URL dar, auf die ich abzielen und deren Änderungen angewendet werden sollen:
var URLS = {
'foo': 'http://foo.com',
'bar': 'http://bar.com',
'baz': 'http://baz.com',
'yay': 'http://www.yay.com',
'blargh': 'http://www.blargh.com'
},
Diese Funktion dient zum Durchlaufen des Objekts:
function getURL() {
for (var i = 0; i < arguments.length; i++) {
return URLS[arguments[i]];
}
}
Und schließlich ist dies dassearchURL
Funktion:
searchDoc: function() {
function insertAfter(newNode, referenceNode) {
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
var link, url, parser, newPathName = '',
emailUrl = /img\//gi,
tsUrl = /\/REPSuite\/static\/html\/inews_archives\/img\//gi,
newstr = '',
doc = document,
container,
container_id,
container_links,
container_images,
documentTableWrapper,
docBodyFirstChild,
nodeToTargetToInsertLP;
if (!doc.getElementById('container')) {
container = doc.createElement('div');
container.setAttribute('id', 'container');
container.className = 'container-avon-representative-news';
container_links = container.getElementsByTagName('a');
container_id = doc.getElementById('container');
docBodyFirstChild = doc.body.firstChild;
nodeToTargetToInsertLP = doc.getElementsByClassName('flexTile')[4];
if (nodeToTargetToInsertLP) {
documentTableWrapper = doc.getElementsByClassName('marginfix')[0];
container.appendChild(documentTableWrapper);
insertAfter(container, nodeToTargetToInsertLP);
} else {
documentTableWrapper = doc.getElementsByTagName('table')[0];
container.appendChild(documentTableWrapper);
doc.body.insertBefore(container, docBodyFirstChild);
}
} else {
container_links = doc.getElementById('container').getElementsByTagName('a');
}
container_images = container.getElementsByTagName('img');
for (var i = 0; i < container_images.length; i++) {
if (arguments[0] == "foo" || arguments[1] == "bar") {
container_images[i].src = container_images[i].src.replace(emailUrl, '/images/news/');
} else {
container_images[i].src = container_images[i].src.replace(emailUrl, '/static/images/alt_news/');
}
}
for (var i = 0, len = arguments.length; i < len; i++) {
url = getURL(arguments[i]);
for (var j = 0, jlen = container_links.length; j < jlen; j++) {
link = container_links[j];
if (link.href.indexOf(url) != -1) {
parser = document.createElement('a');
parser.href = link.href;
link.setAttribute('target', '_self');
newPathName = parser.pathname;
if (newPathName.search(/Executive|District|Division|National/) != -1) {
newPathName = newPathName.split('/').pop();
newstr = newPathName;
link.href = newstr;
}
} else {
link.setAttribute('target', '_blank');
}
}
}
}
Was ich über den Debugger beobachtet habe ist dabei does Entferne den Pfadnamen, auf den es zielt_blank
zu allenhrefs
Also - Das Komische ist, dass das Skript in einer anderen c, ontext / -Umgebung funktioniert, die diesen Teil des Codes nicht durchlaufen muss:
if (newPathName.search(/Executive|District|Division|National/) != -1) {
newPathName = newPathName.split('/').pop();
newstr = newPathName;
link.href = newstr;
}
Es funktioniert in diesem Fall perfekt.
Danke im Voraus
UPDATE 29. August 2016
Jemand hat dies erwähnt, um es zu versuchen:
var urls = [];
for (var i = 0, len = arguments.length; i < len; i++) {
urls[i] = getURL(arguments[i]);
}
for (var j = 0, jlen = container_links.length; j < jlen; j++) {
link = container_links[j];
if (urls.every(function(url) {
return link.href.indexOf(url) !== -1;
}) {
// none of the urls matched the link
} else {
// at least one of the urls matched the link
}
}
Aber ich kann es nicht in meinen größeren Code integrieren. Jede Hilfe wäre dankbar!
UPDATE # 2 am 29. August
In einem anderen Beitrag hat jemand auch erwähnt, dass eine meiner Funktionslogiken möglicherweise falsch ist. Leider ist die Person im Detail nicht zu weit gekommen.
UPDATE # 3 am 29. August IN ORDNUNG. Ich glaube, ich bin nah dran, ich habe meinen Code durchgearbeitet und Haltepunkte hinzugefügt, und es scheint, dass mein Code alle Links durchläuft.zweima
Die Screenshots zeigen, wietarget _self
wird auf die Links angewendet, wie sie sollen, aber aus irgendeinem Grund wird die Schleife erneut ausgeführt und springt einfach zum else-Block, wodurch @ hinzugefügt wirtarget _blank
zu allen Links?
Hier ist der code nochmal mit der original for schleife! Vielen Dank
for (var i = 0, len = arguments.length; i < len; i++) {
url = getURL(arguments[i]);
for (var j = 0, jlen = container_links.length; j < jlen; j++) {
link = container_links[j];
if (link.href.indexOf(url) != -1) { //problem seems to be here
parser = document.createElement('a');
parser.href = link.href;
link.setAttribute('target', '_self');
newPathName = parser.pathname;
if (newPathName.search(/Executive|District|Division|National/) != -1) {
newPathName = newPathName.split('/').pop();
newstr = newPathName;
link.href = newstr;
}
} else {
link.setAttribute('target', '_blank');
}
}
}