Заменить HTML на innerHTML - Javascript - PullRequest
0 голосов
/ 08 мая 2018

Мне нужно написать функциональность JS, которая читает весь документ HTML и заменяет текст другим текстом.

HTML -

<ul>
  <li>
    <a id="aId" href="https://www.w3schools.com" target="_blank"> Link1 </a>
  </li>
  <li>
    <a id="bId" href="https://www.w3schools.com" target="_blank"> Link2 </a>
  </li>
  <li>
    <a href="https://www.w3schools.com" target="_blank"> Link3 </a>
  </li>
</ul>

Javascript код -

var strMessage1 = document.getElementById("aId") ;
var first = 'target="_blank"';
var second = 'target="_blank" rel="noopener noreferrer" onClick="alert(\'Hello World!\')"';

strMessage1.innerHTML = strMessage1.innerHTML.replace(first, second) ; 

Javascript должен иметь возможность проходить через весь HTML и заменять первый var вторым var (определенным в скрипте), где бы он ни находился. Это пример только первого идентификатора - «aId».

Вопрос - Как скрипт будет покрывать и заменять содержимое в

  • Идентификатор bid?
  • Link3, у которого нет идентификатора?

также.

ДЕМО - http://jsfiddle.net/nikhil_gupta/rzy3ajhx/.

Примечание. Не использовать jQuery.

Ответы [ 5 ]

0 голосов
/ 08 мая 2018
  • Q1: идентификатор bId?

Ответ 1: Я не знаю, какой элемент вам нужен. Итак, я ловлю все теги. Есть простой способ получить элементы: document.querySelectorAll("query")

  • Q2: Link3, у которого нет идентификатора?

Ans2: как Q1. Элемент без идентификатора в порядке.

  • Q3: отредактированный тег не работает.

Ответ 3: .innerHTML предназначен для <a>*here*</a>, вам нужно отредактировать атрибут, поэтому вам нужно вызвать .outerHTML

Refs:

var all_a_tag = document.querySelectorAll("a");
for (var i = 0; i < all_a_tag.length; i++) {
  var elem = all_a_tag[i];
  var first = 'target="_blank"';
  var second = 'target="_blank" rel="noopener noreferrer" onClick="alert(\'Hello World!\')"';

  elem.outerHTML = elem.outerHTML.replace(first, second);
}
<ul>
  <li>
    <a id="aId" href="https://www.w3schools.com" target="_blank"> Link1 </a>
  </li>
  <li>
    <a id="bId" href="https://www.w3schools.com" target="_blank"> Link2 </a>
  </li>
  <li>
    <a href="https://www.w3schools.com" target="_blank"> Link3 </a>
  </li>
</ul>
0 голосов
/ 08 мая 2018

Вы можете использовать outerHTML, чтобы заменить вхождение содержимого first содержимым second. Вы можете выбрать второй a, используя тот же document.getElementById вызов.

Для третьего вы можете использовать document.querySelectorAll и получить последний элемент возвращенной коллекции.

var strMessage1 = document.getElementById("aId");
var strMessage2 = document.getElementById("bId");
var anchors = document.querySelectorAll("a");
var strMessage3 = anchors[anchors.length - 1];

var first = 'target="_blank"';
var second = 'target="_blank" rel="noopener noreferrer" onClick="alert(\'Hello World!\')"';

strMessage1.outerHTML = strMessage1.outerHTML.replace(first, second);
strMessage2.outerHTML = strMessage2.outerHTML.replace(first, second);
strMessage3.outerHTML = strMessage3.outerHTML.replace(first, second);
<ul>
  <li>
    <a id="aId" href="https://www.w3schools.com" target="_blank"> Link1 </a>
  </li>
  <li>
    <a id="bId" href="https://www.w3schools.com" target="_blank"> Link2 </a>
  </li>
  <li>
    <a href="https://www.w3schools.com" target="_blank"> Link3 </a>
  </li>
</ul>

Лучшие методы кодирования:

  • Используйте setAttribute() для установки отдельных атрибутов элемента вместо выполнения замены. Это предотвратит нежелательные ошибки.
  • Вместо выбора отдельных элементов с помощью document.getElementById и document.querySelectorAll, вы можете использовать один document.querySelectorAll и цикл в коллекции для замены содержимого.
0 голосов
/ 08 мая 2018

Я думаю, что вы имеете в виду externalHTML

http://jsfiddle.net/rzy3ajhx/1/

strMessage1.outerHTML = strMessage1.outerHTML.replace(first, second);
0 голосов
/ 08 мая 2018

Насколько я понимаю, вы пытаетесь изменить атрибуты в теге html. Вы не можете использовать .innerHTML или .replace для этого, он просто меняет содержимое внутри html-тега. Чтобы решить вопрос, вы можете использовать метод .getAttribute(), .setAttribute() или .createAttribute(). Нечто похожее с вашим кодом, и оно работает:

var strMessage1 = document.getElementById("aId");
strMessage1.setAttribute("rel", "noopener noreferrer");
strMessage1.setAttribute("onClick", "alert(\'Hello World!\')")
0 голосов
/ 08 мая 2018

.innerHTML изменяет содержимое элемента (что находится между открывающим и закрывающим тегами).Ваш код пытается изменить значение атрибута элемента .Это не одно и то же.

Кроме того, важно понимать последствия использования innerHTMLouterHTML).

  • Они оба заставляют DOM перестраиваться, а затем перекрашиваться и перетекать, что очень дорого с точки зрения ресурсов.
  • Их использование также удалитлюбые ранее настроенные обработчики событий.
  • Они открывают дыры в безопасности вашего приложения.
  • Они обычно сопровождаются гобами и гобами конкатенации строк и вложенными кавычками.

Чтобы изменить значение атрибута элемента, просто перейдите к атрибуту HTML, который вы хотите изменить, в качестве свойства объекта JavaScript или используйте метод DOM element.setAttribute(attributeName, value).

Вопрос - Как скрипт будет покрывать и заменять содержимое в

  • bId id?
  • Link3, у которого нет идентификатора?

а также.

Если вы хотите изменить более одного элемента, вам нужно поместить их в коллекцию или массив, а затем вы можете зациклить их.Получить их в группу можно разными способами, совсем не связанными с id s (по имени тега, по классу CSS, по положению в документе, по значениям атрибутов и т. Д.).В вашем примере, если мы хотим изменить все ссылки, которые были внутри маркеров, которые имеют target=_blank в качестве значения href, мы можем настроить таргетинг на них по положению и значению атрибута с помощью селектора CSS и .querySelectorAll() метод.Вы заметите, что в моем примере ниже, я полностью удалил атрибуты id из HTML, и код все еще работает.

Наконец, вы не должны использовать встроенные атрибуты событий HTML (onclick,и т. д.) для настройки функций обратного вызова обработки событий.Это более 25-летний метод, который копируется и вставляется каждым новым веб-разработчиком без понимания , почему его не следует использовать .Вместо этого используйте современный, основанный на стандартах код и .addEventListener() DOM API .

// Get the elements you wish to work on into an Array
// Here, we're selecting <a> elements that have an href attribute with a value of _blank 
// that are direct children of <li> elements:
var elementsToChange = Array.prototype.slice.call(document.querySelectorAll("li > a[target='_blank']"));

// We only need to worry about what's going to change
var newRel = 'noopener noreferrer'

// This will be the click event callback function
function doAlert(){
  alert('Hello World!');
}

// Loop over the array
elementsToChange.forEach(function(element){
  // Just access the HTML attribute you want to modify as a property of the JavaScript object
  element.rel = newRel;
    
  // Or, use the DOM API
  element.setAttribute("rel", newRel); 
  
  // Either way the DOM API should always be used to set up event handlers
  element.addEventListener("click", doAlert);
});
<ul>
  <li><a href="https://www.w3schools.com" target="_blank">I will be modified by the code</a></li>
  <li><a href="https://www.w3schools.com">I WON'T be modified by the code!</a></li>
  <li><a href="https://www.w3schools.com" target="_blank">I will be modified by the code</a></li>
</ul>
...