Подтвердить что ты не робот

JavaScript: получить текущий исполняемый файл <script> node?

Мне нужно знать, можно ли получить текущее выполнение node?

Пример:

..html
<script id="x">
  console.log(document.currentNode.id); // << this must return "x"
</script>
..html

Спасибо!

4b9b3361

Ответ 1

Я не знаю, что на 100% уверен, но коллекция тегов script, возвращаемых document.getElementsByTagName('script'), не должна включать теги script, которые ниже выполняемого в настоящее время <script>. Другими словами, я думаю, что это должно работать:

var arrScripts = document.getElementsByTagName('script');
var strScriptTagId = arrScripts[arrScripts.length - 1].id;

Это будет работать только для скриптов, выполняемых при загрузке страницы. Если это выполняется в отложенном script или как часть события загрузки страницы, он, вероятно, всегда будет сообщать о последнем <script> на полностью отображаемой странице. Обратите внимание, что тег id не является допустимым атрибутом для <script>, поэтому ваша страница вряд ли будет проверяться. Если у вас есть внешние скрипты, пишущие теги script (например, сторонние объявления), я думаю, что код будет непредсказуемым. Я играл с этой идеей пару лет назад, и результаты были неудовлетворительными.

Ответ 2

Gecko (Firefox) поддерживает нестандартное свойство объекта документа, которое указывает на текущий script node. Вы можете проверить это, прежде чем перейти к вышеуказанному ответу.

https://developer.mozilla.org/en-US/docs/DOM/document.currentScript

<script id="x">
  console.log(document.currentScript.id); // << this must return "x"
</script>

Ответ 3

Andrews Answer уже была хорошей идеей, но я испытал все упомянутые проблемы. Вот почему я выбрал другой подход, который хорошо работает для IE, FF и Chrome.

Просто выполните script в событии onload для изображения. Определение прозрачного 1pixel gif inline, и вы получите "this", когда он срабатывает.

Этот пример используется для динамического изменения содержимого DIV во время рендеринга. Моя цель - заполнить div другим innerHTML, созданным с помощью рендеринга xsl на основе браузера (не показано здесь).

Конечно, вы даже можете загрузить любое изображение из Интернета, чтобы оно не было встроенным. И большое преимущество: изображение и его событие заменяют собой новый контент, поэтому даже изображение исчезнет. "Div" даже не требует каких-либо присвоений "id".

<div id="demo">
empty
    <img onLoad="changeNodeOnTheFly(this,'hurra');void(0);" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="/>
</div>

script:

<script>
function changeNodeOnTheFly(ele, text)
{
ele.parentNode.innerHTML=text;
}
</script>

BR Хайко

Ответ 4

Используйте document.write, чтобы найти свою позицию:

<script data-foo="bar">
  var id = 'placeholder-' + Math.floor(Math.random() * 1e10)
  document.write('<div id=' + id + '></div>')

  var placeholder = document.getElementById(id)
  var script = placeholder.previousSibling
  placeholder.parentNode.removeChild(placeholder)

  // "bar" is written to the document
  document.write(script.getAttribute('data-foo'))
</script>

Ответ 5

Почему бы не использовать:

<script id="x">
  console.log(document.getElementById("x").id);
</script>